JVM -Xmx 参数允许将 JVM 的最大堆大小设置为某个值。但是,有没有办法让这个值(value)变得动态?换句话说,我想告诉JVM“看,如果你需要它,就继续从系统中取出RAM,直到系统退出。”
询问的两部分原因: 首先,有问题的应用程序可以使用非常广泛的内存,具体取决于用户正在做什么,因此概念上的最小值和最大值相差甚远。其次,JVM 似乎在启动时从虚拟内存中保留了最大堆空间。这个特定的应用程序在各种各样的硬件上运行,因此选择“一刀切”的最大堆空间很难,因为它必须足够低才能在低端硬件上运行,但我们真的会希望能够利用真正强大的机器(如果有的话)。
最佳答案
But, is there a way to make that value dynamic?
从字面上看,没有。最大堆大小在 JVM 启动时设置,不能增加。
实际上,您可以将最大堆大小设置为您的平台允许的最大大小,并让 JVM 根据需要增长堆。这样做有明显的风险;即您的应用程序将使用所有内存并导致用户的机器停止运行。但这种风险隐含在您的问题中。
编辑
值得注意的是,有各种 -XX...
GC 调整选项可以让您调整 JVM 扩展堆的方式(最大)。
另一种可能性是将您的应用程序分成两部分。应用程序的第一部分完成了确定问题“大小”所需的所有准备工作。然后它会计算出一个合适的最大堆大小,并在新的 JVM 中启动应用程序的第二部分内存。
这仅适用于应用程序可以按照上述方式合理分区的情况。
这仅在可以计算问题大小时才有效。在某些情况下,计算问题大小就等于计算结果。
与让堆增长到最大大小相比,是否会获得更好的整体性能尚不清楚。
关于java - JVM 最大堆大小可以是动态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472593/