java – 为什么JVM不使用更多堆内存
我尝试像这样增加堆内存:
-Xmx9g -Xms8g 说实话,只因为我可以. 现在我想知道,为什么JVM不会使用更多,并且不太频繁地安排GC. 系统: 编辑: 解决方法
Java 1.7
separates the heap into a few spaces中的HotSpot JVM以及此讨论的相关内容如下:
>伊甸园,新物体的去处 分配新对象时,它只是附加到Eden空间中.一旦伊甸园已满,它就会被称为“次要收藏品”. Eden中仍然可以访问的对象被复制到Survivor,然后擦除Eden(因此收集任何未复制的对象). 你想要的是填满伊甸园,而不是整个堆. 例如,拿这个简单的应用程序: public class Heaps { public static void main(String[] args) { Object probe = new Object(); for (;;) { Object o = new Object(); if (o.hashCode() == probe.hashCode()) { System.out.print("."); } } } } 探测器就是为了确保JVM无法优化循环;重复的新Object()就是我们所追求的.如果使用默认的JVM选项运行它,您将得到一个类似于您所看到的图形.对象分配在Eden上,这只是整个堆的一小部分.一旦Eden已满,它就会触发一个次要集合,它会清除所有这些新对象并将堆使用率降低到接近0的“基线”. 那么,你如何填满整个堆?设置伊甸园非常大! Oracle发布了其heap tuning parameters,这里相关的两个是-XX:NewSize和-XX:MaxNewSize.当我使用-Xms9g -XX运行上述程序时:NewSize = 8g -XX:MaxNewSize = 8g,我得到的东西更接近你的预期. 在一次运行中,这几乎耗尽了所有堆,以及我指定的所有Eden空间;后续的运行只占我指定的Eden的一小部分,正如你在这里看到的那样.我不太清楚为什么会这样. VisualVM有一个名为Visual GC的插件,可以让您查看有关堆的更多详细信息.这是我的一个屏幕截图,在恰当的时刻拍摄,显示Eden几乎已满,而旧空间几乎是空的(因为循环中没有任何新的Object()存在于Eden集合中). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |