[草稿] GC 参数设置的一些疑问 PS + SERIALOLD

kaiyuanjava 2013-11-23
大家好,我在实验FGC时,对如下GC日志有些地方不太理解,请帮忙解释谢谢
首先参数设置如下:
-client -Xms=20M -Xmx=20M -Xmn=10M -verbose:gc -XX:+PrintGCDetails -XX:+UseParallelGC
此参数中默认SurvivorRatio为6
第一次FGC是什么原因产生?
   为什么要产生,此时old空间明明是够用的,而且是首次也不存在分配担保问题

package com.hx;

import java.util.ArrayList;
import java.util.List;

public class TestGC {
	public static void main(String[] args)throws Exception{
		//Thread.sleep(15000);
		List list = new ArrayList();
		for (int i = 0; i < 10; i++) {
			list.add(new MemorObject(1024 * 1024));
			Thread.sleep(2000);
			System.out.println(i);
			
		}
		System.gc();
		System.gc();
		Thread.sleep(5000);
		list.clear();
		for (int i = 0; i < 10 ; i++) {
			list.add(new MemorObject(1024 * 1024));
			
			if(i % 3 == 0){
				list.remove(0);
			}
		}
		System.out.println("list size is " + list.size());
		Thread.sleep(5000);
	}	
	
}

class MemorObject{
	byte [] b ;
	public MemorObject(int b){
		this.b = new byte[b];
	}
}

0
1
2
3
4
5
6
[GC [PSYoungGen: 7628K->1272K(8960K)] 7628K->7416K(19200K), 0.0039739 secs]
[Full GC [PSYoungGen: 1272K->0K(8960K)] [PSOldGen: 6144K->7363K(10240K)] 7416K->7363K(19200K) [PSPermGen: 1765K->1765K(8192K)], 0.0039837 secs]
7
8
9
[Full GC [PSYoungGen: 3153K->1024K(8960K)] [PSOldGen: 7363K->9411K(10240K)] 10516K->10435K(19200K) [PSPermGen: 1770K->1770K(8192K)], 0.0044222 secs]
[Full GC [PSYoungGen: 1024K->1024K(8960K)] [PSOldGen: 9411K->9411K(10240K)] 10435K->10435K(19200K) [PSPermGen: 1770K->1770K(8192K)], 0.0037243 secs]
[Full GC [PSYoungGen: 7249K->0K(8960K)] [PSOldGen: 9411K->4289K(10240K)] 16661K->4289K(19200K) [PSPermGen: 1770K->1769K(8192K)], 0.0078759 secs]
list size is 6
subchen 2013-11-25
Young Gen: 10M
   Eden Space: 6M
   From Space: 2M
   To Space: 2M

当分配到 6M 的时候,Eden Space 满了,触发一个 GC,但是由于所有对象都存活,而 From Space/To Space 空间不够,需要放到 Old Gen。所以触发了一个 Full GC。

我觉得这个 Full GC 并不是真的 Full GC,而是发生在 Old Gen 上面的 GC。

而真正的 Full GC 是 Young Gen 和 Old Gen 一起做GC。
Global site tag (gtag.js) - Google Analytics