返回信息流看深入理解Java虚拟机这本书,结果和书上不一样。按照书上的说法:allocation1,2,3一开始都分配在新生代Eden(消耗6M),当给allocation4(4M)分配内存时,发现Eden不足,于是发起一次Minor GC.而由于Survivor也只有1M,所以allocation1,2,3进入老年代。而这与我测试的结果不符。难道这与jdk版本有关系?
参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8。
代码:
public class TestGC {
private static final int MemorySize = 1024 * 1024;
public static void main(String[] args) {
TestAllocation();
}
@SuppressWarnings("unused")
public static void TestAllocation() {
byte[] allocation1, allocation2, allocation3, allocation4;
allocation1 = new byte[2 * MemorySize];
allocation2 = new byte[2 * MemorySize];
allocation3 = new byte[2 * MemorySize];
allocation4 = new byte[4 * MemorySize];// 出现一次MinorGC
}
}
我的日志:
Heap
PSYoungGen total 9216K, used 7299K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 89% used [0x00000000ff600000,0x00000000ffd20ff8,0x00000000ffe00000)
from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
ParOldGen total 10240K, used 4096K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
object space 10240K, 40% used [0x00000000fec00000,0x00000000ff000010,0x00000000ff600000)
Metaspace used 2484K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 266K, capacity 386K, committed 512K, reserved 1048576K
书本日志:
这是一条镜像帖。来源:北邮人论坛 / java / #42043同步于 2015/6/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
JVM问题。
shuixingge
2015/6/24镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 golphing 的大作中提到: 】
: 难道是大对象直接进入老年代?
你的意思是4M是大对象,然后直接进入了老年代。没引起新生代GC,那三个对象还在原地。
但是我没设置 -XX:PretenureSizeThreshold 参数,并且我单独测试一个4MB的对象,它居然分配在新生代。
这个要重现一模一样的实验还真是个难题
不过推荐楼主看看官方对垃圾回收实现的介绍,也许会有帮助
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
【 在 lee8464 的大作中提到: 】
: 这个要重现一模一样的实验还真是个难题
: 不过推荐楼主看看官方对垃圾回收实现的介绍,也许会有帮助
: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
谢谢
因为你的日志有个MetaSpace,这个貌似8才有的
【 在 shuixingge 的大作中提到: 】
: 嗯。。。,这都猜出来了,jdk1.6的还没试过