关于问题2:具体是当一个survivor区的相同年龄的对象综合大于一个survivor区大小的一半时,年龄大于或等于该年龄的对象会被直接移到old区。这里需要注意的是是其中一个survivor区的对象占另一个survivor区大小,而非整个survivor区(有两个,一个总是空的)大小的一半。
具体可以看测试结果
/**
*
*测试GC
*
*
*@authorVicky
*
*@2015年10月30日
*
*/
publicclassGCTest{
publicstaticfinalint_MB=1024*1024;
//JVM参数:-XX:+PrintGCDetails-Xmx40m-Xms40m-Xmn20m-XX:SurvivorRatio=8
publicstaticvoidmain(String[]args){
byte[]acl1=newbyte[1*_MB/4];
byte[]acl2=newbyte[10*_MB];
acl2=null;//回收
//majorgc之后eden:10M/from:0.25m/to:0
byte[]acl3=newbyte[10*_MB];
byte[]acl4=newbyte[1*_MB/4];
byte[]acl5=newbyte[1*_MB/4];
byte[]acl6=newbyte[1*_MB/4];
byte[]acl7=newbyte[1*_MB/4];
acl3=null;//回收
//majorgc之后eden:10M/from0/to:1m(acl1:2,acl4:1,acl5:1,acl6:1,acl7:1)
byte[]acl8=newbyte[10*_MB];
byte[]acl9=newbyte[1*_MB/4];
acl8=null;//回收
//majorgc之后eden:10M/from
//1.25m(acl1:3,acl4:2,acl5:2,acl6:2,acl7:2,acl10:1)/to:0m
//此时年龄=2的对象大小总计:1M,达到单个survivor区的一般,所以年龄>=2的会被放入old,old应该使用1.25m左右
byte[]acl10=newbyte[10*_MB];
}
}
执行结果:
[GC[DefNew:10823K->393K(18432K),0.0010070secs]10823K->393K(38912K),0.0010291secs][Times:user=0.00sys=0.02,real=0.00secs]
[GC[DefNew:11825K->1417K(18432K),0.0008933secs]11825K->1417K(38912K),0.0009148secs][Times:user=0.00sys=0.00,real=0.00secs]
[GC[DefNew:12024K->256K(18432K),0.0010243secs]12024K->1673K(38912K),0.0010534secs][Times:user=0.00sys=0.00,real=0.00secs]
Heap
defnewgenerationtotal18432K,used10823K[0x25d20000,0x27120000,0x27120000)
edenspace16384K,64%used[0x25d20000,0x26771f30,0x26d20000)
fromspace2048K,12%used[0x26f20000,0x26f60010,0x27120000)
tospace2048K,0%used[0x26d20000,0x26d20000,0x26f20000)
tenuredgenerationtotal20480K,used1417K[0x27120000,0x28520000,0x28520000)
thespace20480K,6%used[0x27120000,0x27282418,0x27282600,0x28520000)
compactingpermgentotal12288K,used367K[0x28520000,0x29120000,0x2c520000)
thespace12288K,2%used[0x28520000,0x2857bc38,0x2857be00,0x29120000)
rospace8192K,67%used[0x2c520000,0x2ca82d98,0x2ca82e00,0x2cd20000)
rwspace12288K,53%used[0x2cd20000,0x2d390640,0x2d390800,0x2d920000)
old区大小正好等1.25m |