1. 程式人生 > 其它 >JVM和GC

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 出當前的記憶體堆轉儲快照,以便分析用