我們知道垃圾回收主要是回收堆區的內存
1. 堆區我們分成eden區 s1 s0區 老年代
2.JVM對象的引用分爲了四種類型:
(1)強引用:默認情況下,對象採用的均爲強引用(這個對象的實例沒有其他對象引用,GC時纔會被回收)
(2)軟引用:軟引用是Java中提供的一種比較適合於緩存場景的應用(只有在內存不夠用的情況下才會被GC)
(3)弱引用:在GC時一定會被GC回收
(4)虛引用:由於虛引用只是用來得知對象是否被GC
3.算法簡介
引用計數算法: 主要回收eden區 ,對象有15次機會,引用加1,沒有引用減1,直到爲0時,被清除。N次(大概15次)後放入s0或者s1區。
複製算法: s0和s1區爲空間相同的兩塊區域,2塊區域互相拷貝被引用的對象,不引用對象則不被拷貝,拷貝完成後,清空被拷貝的s0或者s1區域。
標記壓縮算法:主要回收老年代,老版本的標記清除算法首先標記處所需要回收的對象,在標記完成後統一回收所有被標記的對象。新版本優化使用,首先標記所需回收對象,可達標記1,不可達標記0,然後把不可達可達壓縮到一塊,把不可達區域清除。
(減少垃圾內存碎片)
分代算法:不同堆區域用不同的算法回收垃圾。
新生代(eden s0 s1) 主要是minor Gc 老年代 System.gc()主要是Full Gc
4. 根據垃圾回收機制JVM調優:
初始堆內存大,垃圾回收次數少,最大堆內存大可以提高吞吐量。
允許條件下儘量採用並行回收機制,可以擴大吞吐量以及提高回收效率。
5.JVM內存模型圖