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

Rai*_*han 8 java jvm

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

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

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

Den*_*kiy 8

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

-XX:MaxHeapFreeRatio=10
-XX:MinHeapFreeRatio=10
Run Code Online (Sandbox Code Playgroud)

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

这可能会减慢你的程序,因为gc将不断改变分配的内存大小.如果您的程序在短时间内分配大量内存,它可能根本不起作用.


And*_*ell 5

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

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

-Xmx1024m 设置 JVM 可以分配的最大内存。这与您只有 1024 兆物理内存而没有虚拟内存是一样的。

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

更新

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

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

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

如果您需要对内存使用进行如此精细的控制,您将需要选择除 JVM 之外的其他东西。