JVM和GC
本文參考文章:
標題:《【JVM系列1】JVM記憶體結構》 作者:樓仔 連結:https://mp.weixin.qq.com/s/nSwNZpObWLGteG-v7n5PSw
標題:《JVM記憶體模型詳解(1.7與1.8的區別)》 作者:weihubeats 連結:https://blog.csdn.net/qq_42651904/article/details/88862994
標題:《深入理解JVM虛擬機器10:JVM常用引數以及調優實踐》 作者:黃小斜 連結:https://blog.csdn.net/a724888/article/details/78367780
一、物件的回收條件
1.引用計數法:為物件新增一個引用計數器,每當物件被引用時,引用計數器+1,引用失效時-1,當引用計數器為0時回收。解決不了物件兩兩互相引用的情況,造成記憶體洩漏。
2.可達性分析法(根搜尋法):從GC roots根節點開始,沿引用鏈搜尋,凡是引用鏈上的物件不會被回收。
二、垃圾回收演算法
1.標記-清除:對已死物件進行標記,然後清除。會使記憶體碎片化,後續的大物件無法存入。如果物件存活率普遍偏低(5%),效率也會很低。
2.標記-複製:對存活物件進行標記,然後複製到另一片記憶體區域。需要額外的記憶體空間,空間利用率不高。
3.標記-整理:是上述兩種演算法的一種折中,對存活物件進行標記,將零散的存活的物件整理到記憶體碎片中。進行GC時,會暫停所有使用者執行緒,使用者體驗不好。
三、記憶體模型
JVM記憶體模型如下圖(方法區又稱永久代)
其中堆又分為老年代新生代如下圖
當物件從Eden(年齡0)取經過一次GC存活後進入Survior from(年齡1),再每經過一次GC存活後年齡+1,直到某個年齡(預設15)進入老年代。老年代容量滿時進行Full GC。
四、1.7與1.8的區別
元資料區取代了永久代(方法區)。元空間的本質和永久代類似,都是對JVM規範中方法區的實現。不過元空間與永久代之間最大的區別在於:元資料空間並不在虛擬機器中,而是使用本地記憶體
五、JVM調優常用引數
配置引數 | 功能 |
---|---|
-Xms | 初始堆大小。如:-Xms256m |
-Xmx | 最大堆大小。如:-Xmx512m |
-Xmn | 新生代大小。通常為 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 個 Survivor 空間。實際可用空間為 = Eden + 1 個 Survivor,即 90% |
-Xss | JDK1.5+ 每個執行緒堆疊大小為 1M,一般來說如果棧不是很深的話, 1M 是絕對夠用了的。 |
-XX:NewRatio | 新生代與老年代的比例,如 –XX:NewRatio=2,則新生代佔整個堆空間的1/3,老年代佔2/3 |
-XX:SurvivorRatio | 新生代中 Eden 與 Survivor 的比值。預設值為 8。即 Eden 佔新生代空間的 8/10,另外兩個 Survivor 各佔 1/10 |
-XX:PermSize | 永久代(方法區)的初始大小 |
-XX:MaxPermSize | 永久代(方法區)的最大值 |
-XX:+PrintGCDetails | 列印 GC 資訊 |
-XX:+HeapDumpOnOutOfMemoryError | 讓虛擬機器在發生記憶體溢位時 Dump 出當前的記憶體堆轉儲快照,以便分析用 |