当不再需要时,JVM 是不是会将空闲内存返还给操作系统?

Posted

技术标签:

【中文标题】当不再需要时,JVM 是不是会将空闲内存返还给操作系统?【英文标题】:Does the JVM give back free memory to the OS when no longer needed?当不再需要时,JVM 是否会将空闲内存返还给操作系统? 【发布时间】:2011-06-05 05:40:33 【问题描述】:

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

我的问题是,当我的应用程序不再需要太多内存时,JVM 是否会将额外的内存返还给操作系统(例如,用于其他进程)。目前,我的应用程序似乎永远保留了该内存,即使不再需要。

【问题讨论】:

没有no“JVM”,你应该指定你感兴趣的实现。 29 个问题,只有一个被接受的答案。有功课要做。说真的。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

JVM 确实将内存返回给 OS X 上的操作系统【参考方案3】:

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

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

这里可能存在性能方面的考虑 - java 以速度慢着称,因此默认情况下,JVM 可能会尝试尽量减少来自操作系统的分配,并通过保持大量内存并执行操作来尽可能高效地进行垃圾收集不那么频繁。

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

【讨论】:

以上是关于当不再需要时,JVM 是不是会将空闲内存返还给操作系统?的主要内容,如果未能解决你的问题,请参考以下文章

Java 基础 在Java中需要使用内存的组件

怎么查看redis使用情况?

OpenJDK JVM 会把堆内存还给 Linux 吗?

从内部入手,浅谈malloc和new的区别

JVM

学习JVM--垃圾回收