JVM -Xmx参数允许将JVM的最大堆大小设置为某个值.但是,有没有办法让这个价值变得有活力?换句话说,我想告诉JVM"看看,如果你需要它,只需继续从系统中取RAM,直到系统出来."
问题的两个部分原因:首先,有问题的应用程序可以使用非常广泛的ram,具体取决于用户正在做什么,因此概念性的min和max值相差很远.其次,JVM似乎在启动时保留虚拟内存的最大堆空间.这个特定的应用程序运行在各种各样的硬件上,因此选择"一刀切"的最大堆空间很难,因为它必须足够低才能在低端硬件上运行,但我们真的喜欢能够利用真正强劲的机器,如果它们可用的话.
Ste*_*n C 11
但是,有没有办法让这个价值变得有活力?
从字面上看,没有.最大堆大小设置为JVM启动时间,无法增加.
实际上,您可以将最大堆大小设置为平台允许的最大大小,并让JVM根据需要扩展堆.这样做有明显的风险; 即您的应用程序将使用所有内存并导致用户的计算机停止运行.但是这个风险隐含在你的问题中.
编辑
值得注意的是,有各种-XX...GC调整选项允许您调整JVM扩展堆的方式(最多).
另一种可能性是将您的应用程序分成两部分.应用程序的第一部分完成了确定问题"大小"所需的所有准备工作.然后它计算出适当的最大堆大小,并在新的JVM中启动应用程序的第二部分内存.
这仅在应用程序可以如上所述明智地进行分区时才有效.
这仅在可以计算问题大小时才有效.在某些情况下,计算问题大小等于计算结果.
目前尚不清楚您将获得比仅仅让堆增长到最大大小更好的整体性能.
它没有.它可能,也可能应该:
-Xmx90% // 90% of physical memory
Run Code Online (Sandbox Code Playgroud)
但是,默认隐含的100%可能不是一个好主意.
用非GC语言编写的程序非常勤奋地管理它的内存,它会尽快修剪任何垃圾.允许它获取它请求的任何内存是有意义的,假设它负责迅速的垃圾处理.
GC语言是不同的.它只在必要时收集垃圾.只要有空间,它就不会在乎垃圾徘徊.如果它可以获得它想拥有的所有内存,它将获得计算机中的所有内存.
因此,一个GC程序员不必担心每一件垃圾更多的处置,但他仍然要有容忍垃圾/活动对象比的总体思路,并与-Xmx指导GC.