小组Java
  • 通过-Xmx设置了最大堆内存,那么程序中可分配的内存实际是多少呢?

    05/12 1988 2 评论

设置jvm启动参数:

运行代码:

会抛出堆内存溢出错误,682 时达到临界。

当改为:

会抛出堆内存溢出错误,716时达到临界。

引出几个问题:

1.该方法是否可以测试java中堆内存的可用大小?

2.内存中到底是1000byte为1M还是1024位1M?

3.该测试中无论是1000还是1024都没达到Xmx设置的1g,那剩余的堆去哪了?为何不能分配呢?

ps:环境为jdk1.8

1 1 收藏


直接登录
最新评论
  • DawnL 服务器端 05/12 精华评论

    首先需要明确:

    1)java堆空间分为年轻代(eden、两个survivor)、年老代,后面的问题应该就好解释了。

    2)jvm年轻代与年老代默认比例1:2,即young占1/3,old占2/3。这个比例或者某个区的大小可以通过参数设置,e.g.-XX:NewRatio  -Xmn等。

    下面尝试回答下你的问题:

    1、可以测试空间大小,但是一个new对象不可能占满整个堆空间。对jvm的观察建议通过jmap等命令来

    2、1024

    3、new的本来应该进去年轻代,经过gc从eden到survivor到old。但是因为你new的对象过大,直接进入年老代,而此时年老代的大小为堆空间2/3(约682M),也就是你new出对象的上限。

    附与你相同设置和代码下jmap截图(OS X  64位 jdk1.7 j)