java - JVM 最大堆大小可以是动态的吗?

标签 java memory jvm

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/

相关文章:

java - 如何使用 Spring Batch 在作业中动态添加步骤

java - 带有阿拉伯语文本的 FlyingSaucer LTR/RTL/BiDi 问题

java - 如何知道我的程序在哪个 JVM 中运行?

java - Spring 集成: Failed to send message to channel 'executionFilterChannel' within timeout: -1

java - Camera.takePicture(null, null, mPicture) 不起作用

caching - 缓存集和标签

c - aligned_alloc返回赋值警告

ios - 在 UIScrollView 的 subview 中绘制网格分配大量内存

java - Java 语言的工作原理

java.net.绑定(bind)异常 : Address already in use: JVM_Bind