JVM是否在不再需要时向操作系统提供可用内存?

时间:2011-01-07 11:38:17

标签: java memory jvm heap

我有一个应用程序暂时需要一些特定数量的内存/堆用于某些进程。给定JVM作为选项的最大堆大小的合理值,JVM从一个小堆开始,并根据需要从OS请求更多内存。

我的问题是,如果我的应用程序不再需要大量内存,那么JVM会向操作系统返回额外的内存(例如,用于其他进程)。目前我的应用程序似乎永远保留了内存,即使不再需要它。

3 个答案:

答案 0 :(得分:25)

JVM确实将内存返回给操作系统,但只是非常不情愿,因为它可能很快就会再次需要它,并且从操作系统获取内存是一项相对昂贵的操作。

如果您希望JVM更加热切地将内存返回给操作系统,您可以使用tuning parameters of the Oracle JVM,特别是-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio

答案 1 :(得分:3)

不一定。这取决于您使用的JVM。我知道一个案例,IBM的JVM。我们还遇到了一个程序没有释放内存的问题,即使它不需要。有些信息可以在IBM's site找到。

答案 2 :(得分:0)

它确实取决于版本和所选的垃圾收集器。我发现java 1.8.0_73默认情况下会偶尔向操作系统释放少量数据。这是我记得看到的最早版本,无需调整JVM参数,但它可能很适用于早期版本,我不知道确切的版本。

除非调整参数,否则默认情况下它可能不会释放任何内容,除非60-70%的堆未被使用。

这可能是性能考虑因素 - java因为速度慢而声名远扬,所以默认情况下,JVM可能会尝试最小化来自操作系统的分配,并通过保留大量内存并进行垃圾收集尽可能高效它不常见。

我想知道如果操作系统剩余的可用内存相对较少,它是否会对内存不那么吝啬......?