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

时间:2010-03-08 19:22:16

标签: java windows memory batch-file heap

我有一个Java程序,它由批处理文件启动,其行如下:

javaw -Xms64m -Xmx1024m com.acme.MyProgram

但是,在某些计算机上,程序将无法启动并显示以下消息:

  

无法为对象堆保留足够的空间。无法创建Java虚拟机。

问题似乎是内存分配池的最大大小比计算机可以处理的大。将内存分配池的最大大小从1024m减小到512m似乎可以解决问题。

有没有办法可以提前确定计算机上有多少可用内存(从批处理文件中),并确定是否在批处理文件调用中使用-Xmx1024m-Xmx512m?请注意,此批处理文件只需要在Windows上运行。

4 个答案:

答案 0 :(得分:6)

实际上Java VM已经做了类似的事情。如果未指定-Xms-Xmx,则会根据计算机上的物理内存量推断出这些值。或者至少如此说this page

您可以将-Xms设置为使您的应用程序有用的最小堆大小,并让Java为-Xmx确定适当的值。

答案 1 :(得分:1)

您可以查看此页面以获得一些答案:Get JVM to grow memory demand as needed up to size of VM limit?

答案 2 :(得分:0)

如果您的程序正常运行,最大堆积为512m,我会使用该值。

那说我也会检查是否有办法做你所问的问题,因为这是一个有趣的问题。

答案 3 :(得分:0)

您可以从批处理文件执行,在退出时检查错误级别,如果失败则在较低内存处重新启动。我不确定错误级别是否有效 - 如果不能,你也可以检查程序执行的时间......任何不到10秒的东西都是赠品。

虽然只是一些评论 -

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

如果你非常确定你会使用一定数量的ram(比如,堆很容易填满你分配的512),你应该将min设置为该数字。将min和max设置为512是好的,如果你的程序分配一堆东西但不是情境(总是使用大约相同数量的ram)