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分爲MinorGC和FullGC(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區域的存活對象時會放入老年代中);