Java JVM and GC
類加載
方法區(qū)
內(nèi)容:類信息和類靜態(tài)變量,常量池
類信息:非常多
主要使用的類信息:1. 類型的字段信息 2. 類型的方法信息
Heap
Java的對(duì)象和數(shù)組申請(qǐng)的空間都是從Heap中分配的。(引用是在棧中)
所有的線程都是共享一個(gè)Heap的。
Stack
保存基本數(shù)據(jù)類型和自定義類型的引用。但是對(duì)于包裝類型:Boolean,Long等存放于Heap中。
每一個(gè)線程都有自己的stack。
本地方法Stack
用于存儲(chǔ)本地方法的局部變量表,和JVM stack功能類似
程序計(jì)數(shù)器
每一個(gè)線程都有獨(dú)立的程序計(jì)數(shù)器
JVM 常量池
存在在方法區(qū)中,存儲(chǔ)的是常量的引用
GC 內(nèi)容
Young generation
新生代空間較小,被分為3個(gè)區(qū)域:Eden,F(xiàn)rom,To三個(gè)區(qū)域。
創(chuàng)建的對(duì)象在Eden區(qū),Eden區(qū)域GC后存活對(duì)象存放在幸存者空間(存放在同一個(gè)幸存者區(qū)間);當(dāng)一個(gè)幸存者空間飽和,還存活的幸存者會(huì)被移動(dòng)到另一個(gè)幸存者空間,然后清零另一個(gè)幸存者空間。如果被一定多次的對(duì)象,就會(huì)被移動(dòng)到老年代。
這里發(fā)生的GC 為Minor GC。
Old generation
大部分內(nèi)容都是由于新生代移動(dòng)過(guò)來(lái)的。
這里發(fā)生的GC為Major GC或者Full GC。
Permanent generation
方法區(qū),保存常量和字符串常量。
GC 算法
根搜索算法:
類似一個(gè)圖遍歷,能夠從root遍歷到的節(jié)點(diǎn)就是不會(huì)被GC。
標(biāo)記清除算法:
掃描,存活對(duì)象進(jìn)行標(biāo)記,不存活對(duì)象進(jìn)行清理。
會(huì)造成內(nèi)存的碎片化。
復(fù)制算法
兩個(gè)空間:活動(dòng)區(qū)間 or 空閑區(qū)間
把存活對(duì)應(yīng)復(fù)制到空間區(qū)間中。一次性回收所有的活動(dòng)區(qū)間中的內(nèi)容。
標(biāo)記-整理算法
類似于標(biāo)記-清除,只是在清除不存活的對(duì)象以后,把存活對(duì)象進(jìn)行移動(dòng),從而使得內(nèi)存碎片化降低。
算法的使用
一般新生帶使用 復(fù)制算法,老生帶一般使用 標(biāo)記-整理算法。