我有一个Java程序,它由批处理文件启动,其行如下:
javaw -Xms64m -Xmx1024m com.acme.MyProgram
但是,在某些计算机上,程序将无法启动并显示以下消息:
无法为对象堆保留足够的空间。无法创建Java虚拟机。
问题似乎是内存分配池的最大大小比计算机可以处理的大。将内存分配池的最大大小从1024m减小到512m似乎可以解决问题。
有没有办法可以提前确定计算机上有多少可用内存(从批处理文件中),并确定是否在批处理文件调用中使用-Xmx1024m
或-Xmx512m
?请注意,此批处理文件只需要在Windows上运行。
答案 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)