JVM GC

1. 堆內存分配

老年代2/3, 新生代1/3。其中,新生代可以分爲1個eden區及2個servival區(from和to,各佔新生代的1/10, 並且始終有一個區域空閒,輪流使用)

2. 存放對象

新生代:短期小對象直接存放於新生代中, 經過MinorGC,會將使用中的對象存放到其中一塊servival中。多次MinorGC(默認15次,參數 -XX:MaxTenuringThreshold 可以來設定 )後仍然存活的對象進入老年代中;

老年代:1. 新生代中迭代過後存活的對象; 2. 大對象跳過新生代直接存入老年代。

jstat -gcutil 236 1000 //236爲pid, 1000爲打印間隔單位ms

3. 堆回收gc

GC分爲MinorGCFullGC(MajorGC)MinorGC爲新生代GC,特點:頻繁,回收速度快;FullGC爲老年代GC,回收時間是MinorGC的10倍以上,同時發生FullGC的同時一般也會伴隨意思MinorGC。

4. 引用判定方法

a. 引用計數算法

對象引用計數+1, 引用失效計數-1;缺點:相互引用的時候無法回收。

b. 可達性分析算法(主流商用語言Java,C#)

GcRoots到一個對象無引用鏈的時候,視爲不可達。

GcRoot節點主要包括:

1). 虛擬機棧中的對象

2). 方法去中靜態屬性引用對象

3). 方法區中常量引用的對象

4). 本地方法棧中native方法引用的對象

5. 方法區回收

方法區中存放很多常量,在常量(如String a = “abc”)沒有引用的時候,會將方法區常量池中的該常量回收。

6. 垃圾收集算法

a. 標記-清除:標記處所有待回收對象並進行統一清除(缺點:效率低、內存碎片多);

b. 賦值:內存一分爲二,每次回收將存活對象拷貝到另一半中依次存放(缺點:每次只能使用一半內存。新生代中垃圾回收使用該方法。eden80%, from和to各佔10%的空間,當10%不夠存放80%的eden區域的存活對象時會放入老年代中);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章