如何指示JVM尽可能降低内存占用量?

时间:2012-06-20 15:47:43

标签: java jvm

我有一个执行5个不同任务的java程序。当我使用-Xmx512m内存参数运行程序时,任务1-4运行正常,但任务5内存不足。当我使用-Xmx1024m运行程序时,所有5个任务都运行正常,但之前运行良好的任务1-4(512m堆)现在几乎耗尽了所有1024m堆。如果我使用-Xms128m -Xmx1024m,也会发生同样的事情。

指示JVM保持较低的内存利用率(例如任务1-4的512米)以及仅在实际需要时使用更多内存(例如在任务5的情况下)的内存参数是什么?

也许我需要一种比默认设置更频繁地激活垃圾收集器的方法?

4 个答案:

答案 0 :(得分:8)

这两个参数表明jvm何时需要调整其堆大小:

-XX:MaxHeapFreeRatio=10
-XX:MinHeapFreeRatio=10

这几乎意味着如果在gc之后,超过10%的堆是空闲的,它将尝试将内存返回给操作系统。只有在gc之后使用超过90%的堆时,它才会增加堆。

这可能会降低您的程序速度,因为gc将不断更改分配的内存大小。如果您的程序在短时间内分配大量内存,它可能根本不起作用。

答案 1 :(得分:4)

我认为您对JVM的工作方式存在误解。这不是GC问题或“任务”问题。

您的任务有内存泄漏,或者它们旨在保留越来越多的内存。

-Xmx1024m设置JVM可以分配的最大内存。它就像你只有1024兆的物理内存而没有虚拟内存一样。

使用Task的定义更新您的问题会很有帮助。这5个独立的JVM是?或者在一个JVM中只有5个工作单元。

<强>更新

  

我不打算让程序始终使用所有1g堆。我的目的是指示JVM使用512m堆,如果可以管理并仅在需要时使用更多内存。当不再需要内存时,要回落到512m甚至更少的内存。

仅仅因为你设置-Xmx1024m并不意味着JVM将使用所有内存。这只是一个最大限制。设置Xms直到设置要使用的最小内存量。您的程序最终确定正在使用的内存量。如果它达到-Xmx设置的限制,那么它将抛出一个OutOfMemoryError

您可以通过调用System.gc()建议JVM运行垃圾收集器。注意我说建议,你不能强制GC运行。你可能会在一个拒绝甚至做GC的平台上运行。您还需要查看它为您的应用选择的GC算法。我会看这里Tuning Garbage Collector

如果您需要对内存使用情况进行细粒度控制,则需要选择除JVM之外的其他内容。

答案 2 :(得分:1)

通过将-Xmx1024m传递给VM,您基本上可以告诉VM它最多可以使用1 gig的堆,最终它会完成。 VM在需要时开始运行垃圾收集,例如。当堆耗尽时,这取决于可用的堆大小。 如果你知道在外面运行哪个任务(我猜你这样做是因为你把它作为cmd行参数传递),为什么不从外面设置-Xmx?

答案 3 :(得分:1)

尝试使用http://visualvm.java.net/以查看内存消耗情况。然后,您可以使用jhat可视化堆内容,并使用http://www.eclipse.org/mat/来识别泄漏。