动态设置Java进程的最大堆大小

3

我有一个Java程序,通过批处理文件启动,命令行如下:

javaw -Xms64m -Xmx1024m com.acme.MyProgram

然而,在某些计算机上,程序无法启动,并显示以下消息:
"Could not reserve enough space for object heap. Could not create the Java virtual machine."
问题似乎是内存分配池的最大大小超过了计算机的处理能力。将内存分配池的最大大小从1024m减少到512m似乎可以解决问题。
有没有办法提前确定计算机上有多少可用内存(在批处理文件内部),并确定是否在批处理文件调用中使用"-Xmx1024m"或"-Xmx512m"?请注意,此批处理文件仅需要在Windows上运行。

你必须覆盖默认值的确切原因是什么? - Thorbjørn Ravn Andersen
4个回答

6
实际上,Java虚拟机已经实现了类似的功能。如果您没有指定-Xms-Xmx,那么这些值会根据计算机上的物理内存大小进行推断。至少这是此页面所说的。
您可以将-Xms设置为应用程序可用的最小堆大小,让Java确定-Xmx的适当值。

我已经确认了Sun的Java 6确实将“-Xmx”设置为大约1/4的物理内存(该页面适用于Java 5,并表示应该将其限制在1GB,但是使用6GB RAM,我得到了“-Xmx1365m”,因此该限制可能已被删除或增加到Java 6)。 - Kevin Brock
有没有命令可以查看每个进程的堆空间使用情况?基本上是堆转储..我尝试使用jmap -heap <pid>。有人能解释一下输出吗?比如eden space,from/to space,generations等。还有其他工具吗? - Balaji Boggaram Ramanarayan

1

0
如果您的程序在512m的最大堆上能够正确运行,那我建议使用这个值。话虽如此,我也会检查是否有方法来实现您所要求的内容,因为这是一个有趣的问题。

0

你可以在批处理文件中执行,检查退出时的错误级别并在失败后以较低的内存重新启动。我不确定错误级别是否有效--如果无效,您还可以检查程序执行所需的时间...任何少于10秒的时间都是一个暴露。

只有一些评论--

如果您知道它不需要超过512,那么应运行测试以确保1024实际上有所帮助。更大的堆经常会使GC暂停时间更长,而几乎没有其他作用。

如果您相当确定将使用某个内存量(比如,堆很容易填满分配的512),则应将最小值设置为该数字。如果您的程序分配了很多东西但不是情景式的(总是使用大约相同数量的内存),则将最小值和最大值都设置为512是好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接