技術複習-JVM

什麼是JVM

java文件經過編譯器編譯成class字節碼,由JVM加載並解釋執行。java虛擬機是實現了java跨平臺的核心技術,同時爲了解決解釋執行速度慢的問題,提供了JIT把常常執行的代碼編譯成機器指令。java

字節碼如何被加載?

0.1裝載 字節碼加載到內存中,建立Class對象 0.2連接 驗證字節碼合法性、靜態變量分配內存空間、設置初始值,字符引用轉換成直接引用 0.3初始化 靜態變量和靜態代碼塊進行賦值。算法

JVM內存模型

1.1 程序計數器 線程私有的,存儲當前指令的內存地址。多線程

1.2 堆 存放實例對象,能夠經過-Xmx -Xms來修改堆的最大和最小值。當擴展時空間不夠則會拋出OOM異常。 堆又分爲新生代、老年代。 新生代又分爲Eden區,Survior1區,Survior2區。由於新生代對象死亡比較快,因此使用複製算法 由於老年代對象死亡時間較長,因此標記整理算法。jvm

1.3 虛擬機棧 線程私有的,當進入一個方法的時候會建立棧幀。棧幀存放局部變量(基本類型、引用)、方法出口等信息。 線程請求棧深度超過了容許的最大深度會拋出StackOverflowError異常。當擴展時空間不夠則會拋出OOM異常。spa

1.4 本地方法棧 跟虛擬機棧同樣,用於native方法。線程

1.5 方法區 類信息、常量、靜態變量對象

如何肯定須要被回收

  1. 引用計數法 對象保存一個被引用次數,若是被引用次數爲0,則該對象能夠被回收。也存一下一些問題,若是兩個對象相互引用的狀況下,沒法實現內存

  2. 可達性分析 經過一系列的GC Root對象來遍歷,若是一個對象和全部的GC Root都沒有鏈路話,則此被回收。編譯器

垃圾回收算法

  1. 標記清除算法 第一次標記須要回收的對象,第二次釋放這些對象的內存空間。 會產生大量內存碎片
  2. 複製算法 找到存活對象,而後把全部存活對象移動到另外一塊內存,而後回收以前的內存。
  3. 標記整理算法 找到須要回收對象,釋放這些對象空間,再進行整理。 不會產生內存碎片適合比較大的對象。

垃圾回收過程:

當Eden區空間不夠的時候,會進行一次MinorGC,把Eden區和Survior區的存活對象複製到另外一個Survior區,並將這些對象的年齡+1,若是對象年齡達到了16則將對象移動到老年代。對於大對象在建立的時候直接放到老年代。若是老年代空間不夠了,則會進行一次FullGC。虛擬機

垃圾回收器

新生代:Serial(單線程),ParNew(多線程),Parallel Scavenge(多線程、注重吞吐量), 老年代:Serial Old(單線程),CMS(多線程,注重最短停頓時間,標記清除算法),Parallel Old

G1:多線程,能夠設置最大暫停時間。 將堆分爲近2000個region,各region之間使用複製算法。總體收集時使用標記整理算法。因此不會產生內存碎片。 根據設置的最大停頓時間,預測各個region區停頓時間,作出符合最大停頓時間的回收計劃。

JVM調優

方法區和永久帶的區別

hotspot是jvm的實現之一,是sunJDK和 openJDK中所帶的虛擬機,其中方法區的實現就是永久帶,不過在jdk8中,把永久帶改爲了metaspace,使用本地內存,解決永久帶內存溢出的問題。

相關文章
相關標籤/搜索