JVM的-Xmx参数可以设置JVM的最大堆大小,但是否有一种方法使该值动态变化?换句话说,我想告诉JVM:“看,如果需要,就从系统中获取RAM,直到系统用尽为止。”
提问的两个原因: 首先,涉及的应用程序根据用户操作使用的内存范围非常广泛,因此概念上的最小和最大值相差很远。其次,似乎JVM在启动时从虚拟内存中保留了最大堆空间。这个特殊的应用程序在各种硬件上运行,所以选择“一刀切”的最大堆空间很难,因为它必须足够低以在低端硬件上运行,但我们真的希望能够利用真正强大的机器。
JVM的-Xmx参数可以设置JVM的最大堆大小,但是否有一种方法使该值动态变化?换句话说,我想告诉JVM:“看,如果需要,就从系统中获取RAM,直到系统用尽为止。”
提问的两个原因: 首先,涉及的应用程序根据用户操作使用的内存范围非常广泛,因此概念上的最小和最大值相差很远。其次,似乎JVM在启动时从虚拟内存中保留了最大堆空间。这个特殊的应用程序在各种硬件上运行,所以选择“一刀切”的最大堆空间很难,因为它必须足够低以在低端硬件上运行,但我们真的希望能够利用真正强大的机器。
但是,有没有一种方法可以使该值动态变化?
实际上是不行的。最大堆大小在JVM启动时设置,并且无法增加。
实际上,您可以将最大堆大小设置为平台允许的最大值,并让JVM随着需要而增加堆大小。这样做存在明显的风险;即您的应用程序将使用所有内存并导致用户的计算机停顿。但这个风险是问题固有的一部分。
编辑
值得注意的是,有各种-XX...
GC调优选项,可让您微调JVM扩展堆的方式(最多到最大值)。
另一个可能性是将应用程序分成两个部分。应用程序的第一部分完成确定“问题”大小所需的所有准备工作。然后它会计算出适当的最大堆大小,并在新的JVM中启动内存消耗量大的第二部分应用程序。
如果应用程序可以按上述方式合理地进行分区,则此方法才有效。
只有在可以计算问题大小的情况下,此方法才有效。在某些情况下,计算问题大小就等于计算结果。
不清楚您是否会获得比仅允许堆增长到最大大小更好的整体性能。
malloc
分配的空间中分配的。如果你能解决这个问题,你将遇到各种复杂情况。如果你真的想要改变最大堆大小的能力,你需要修改JVM/GC。这将是很多工作。 - Stephen C它并不会。虽然它可能会且应该这样做:
-Xmx90% // 90% of physical memory
-Xmx
的概念,可以分配所需的内存。 - Thorbjørn Ravn Andersen基本上,使用纯Java无法适应各种用户的硬件:这时一点shell / batch脚本可能会派上用场。
我在OS X和Linux上做到了这一点:我有一个小的bash shell脚本,负责根据应用程序运行的硬件找到正确的JVM参数,然后调用JVM。
请注意,如果您提供桌面Java应用程序,则可能希望使用像izpack这样的软件来为用户提供安装程序:
我不知道Java Web Start是否可以根据用户配置提供不同的JVM参数(可能不行,而且如果您计划提供专业外观的桌面应用程序,JWS确实非常糟糕)。