java jvm 大对象_jvm对大对象分配内存的特殊处理(转)

本文探讨了Java JVM在处理大对象内存分配时的特殊机制。当对象大小超过年轻代(Young区)空间时,JVM会直接将其分配到老年代(Old区)。通过实验验证了这一行为,并且介绍了如何通过-XX:PretenureSizeThreshold参数干预这一过程,以避免频繁的Full GC。同时,文章还展示了如何使用jstat命令监控JVM内存使用情况。
摘要由CSDN通过智能技术生成

前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去。

对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事。以下给出具体代码来说明:

首先定义好jvm内存各个区域的大小。我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下:

-Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8

紧接着,开始写程序。很简单,就是初始化一个9M的程序,然后用jstat命令看jdk的内存使用情况。

public classApp {private static final int _1MB = 1024 * 1024;/*** VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8

* -XX:PretenureSizeThreshold=3145728*/

public static voidmain(String[] args) {byte[] allocation = new byte[9*_1MB];while(true){try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}

然后打成jar,执行。结果如下:

S0 S1 E O P YGC YGCT FGC FGCT GCT0.00 0.00 18.04 90.00 23.08 0 0.000 20 0.027 0.027

果然,当对象大小大于eden区的时候会直接扔到old区。但我还不满足与此,于是将对象改大了些,改成了11M。再次尝试发现结果如下:

Exception in thread "main"java.lang.OutOfMemoryError: Java heap space

at com.taobao.jdkmem.App.main(App.java:17)

到这里结束了么?当然没有:)这个是一个大的完整的对象,当大对象本身是由一连串的小对象组成的时候,会不会不再OOM呢?于是改了代码再次尝试:

public classApp {private static final int _1MB = 1024 * 1024;/*** VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8

* -XX:PretenureSizeThreshold=3145728*/

public static voidmain(String[] args) {byte[][] allocation;

allocation= new byte[11][_1MB]; //直接分配在老年代中

while(true){try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}

再次运行,结果如下:

S0 S1 E O P YGC YGCT FGC FGCT GCT0.00 38.06 67.68 60.02 23.10 1 0.007 14 0.012 0.019

果然,这次居然又被jvm给生吃下去了。不过这次并非所有的都在old区,而是有一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值