JVM學習到這裏,終於到學習最興奮的地方了---垃圾回收,在學習它以前還得對JVM垃圾回收相關理論知識進行了解,而後再經過實踐來加深對理論的理解,下面直接開始瞭解相關的理論:html
JVM運行時內存數據區域:java
這個在以前其實已經介紹過了,對於JVM的垃圾回收必定是回收內存裏面的內容,因此若是不對內存區域的劃分,區域存放的內容有所瞭解,那何談垃圾回收呢?因此看一下下圖對內存區域的劃分描述:web
其這以上區域在上一次【http://www.javashuo.com/article/p-xzdzxdar-do.html】都已經講過了,下面再來總體回顧一下。算法
方法區域:框架
其中它是數據是線程共享的:學習
那所謂方法區域是線程共享的是指的啥意思呢?好比說一個類的class元信息就會映射到方法區域當中,那麼這個元信息會被全部的線程所訪問,由於只有一份,因此該區域是線程共享的。spa
下面再來闡述一下它:線程
Java虛擬機棧(JVM Stack):3d
下面再對其進行一些闡述:代理
本地方法棧:
堆:
它裏面的數據也是線程共享的:
下面再來闡述一下它:
程序計數器:
JVM運行時數據區域例子:
對於這樣一個方法代碼:
以上方法在執行以後在內存中發生的變化以下:
JVM垃圾回收(GC)模型:
垃圾判斷算法:
JVM中存在A、B兩個對象,而A、B是相互引用着的,也就是A裏面持有B的引用,而B裏面又持有A的引用,以下:
而開始這兩對象是被其它地方所引用着的,好比方法棧中,以下:
而以後虛擬機棧的這兩個引用消失了,也就是整個虛擬機中就只有這兩個相互引用的對象了,而這兩對象不被任何對象所引用着了:
而根據引用計數器的定義規則,A和B的引用計數器都是1,可是實際這倆都是孤立的對象,因此若是採用引用計數來進行垃圾回收,則這倆對象永遠不會被回收。
方法區:
JVM常見GC算法:
具體每一個算法下次繼續再來學習~~