关于Java内存机制的两个问题

[复制链接]
查看11 | 回复2 | 2021-1-27 06:45:38 | 显示全部楼层 |阅读模式
问题1.
java堆内存的年轻代中,
情况:如果发生MinorGC之后,ToSurvivor区的空间不足以容纳来自Eden和FromSurvivor的存活对象,
背景:而这个时候既没有年龄达到MaxTenuringThreshold的对象,也没有发生相同年龄对象的大小总和超过Survivor空间的一半的情况
问题:java虚拟机会怎么处理这种情况?按理说应该是将一部分对象移入年老代,那么问题是会移动多少对象进入年老代?

?问题2.
书中有说:java堆内存中,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,那么年龄大于或等于该年龄的对象就可以直接进入年老代,无须等到MaxTenuringThreshold中要求的年龄。
问题是:每次MinorGC,都会使Survivor中的对象的年龄加1,而来自Eden区的对象的年龄应该都是1,这样的话,从一个FromSurvivor区来的对象永远不会有相同年龄对象的大小总和大于Survivor空间的一半的情况发生,而能发生这种情况只能是来自于Eden的对象(它们的年龄为1)那么如果某次来自Eden区的所有对象之和大于Survivor空间的一半时,会导致来自Eden和FromSurvivor的对象都进入来年老代!到底是什么样的情况呢?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:38 | 显示全部楼层
关于问题1:直接把eden和from全部都放入old。具体可以看测试代码
packagecom.vicky.javabuddy.core.gc;
/**
*
*测试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];
byte[]acl2=newbyte[5*_MB];
byte[]acl3=newbyte[5*_MB];
acl2=null;//回收
acl3=null;//回收
byte[]acl4=newbyte[10*_MB];//majorgc之后eden:10Mfrom:1M
byte[]acl5=newbyte[10*_MB];//majorgc
//由于eden+from=11M,无法放入to,所以全部放入old
}
}
输出结果:
[GC[DefNew:11591K->1161K(18432K),0.0012522secs]11591K->1161K(38912K),0.0012714secs][Times:user=0.00sys=0.00,real=0.00secs]
[GC[DefNew:11401K->0K(18432K),0.0046667secs]11401K->11400K(38912K),0.0046839secs][Times:user=0.00sys=0.00,real=0.00secs]
Heap
defnewgenerationtotal18432K,used10567K[0x25d20000,0x27120000,0x27120000)
edenspace16384K,64%used[0x25d20000,0x26771f30,0x26d20000)
fromspace2048K,0%used[0x26d20000,0x26d20000,0x26f20000)
tospace2048K,0%used[0x26f20000,0x26f20000,0x27120000)
tenuredgenerationtotal20480K,used11400K[0x27120000,0x28520000,0x28520000)
thespace20480K,55%used[0x27120000,0x27c423e8,0x27c42400,0x28520000)
compactingpermgentotal12288K,used366K[0x28520000,0x29120000,0x2c520000)
thespace12288K,2%used[0x28520000,0x2857ba60,0x2857bc00,0x29120000)
rospace8192K,67%used[0x2c520000,0x2ca82d98,0x2ca82e00,0x2cd20000)
rwspace12288K,53%used[0x2cd20000,0x2d390640,0x2d390800,0x2d920000)

回复

使用道具 举报

千问 | 2021-1-27 06:45:38 | 显示全部楼层
关于问题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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行