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

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

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

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

如果您希望JVM更加热切地将内存返回给操作系统,可以使用Oracle JVM的调整参数 ,特别是-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio

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

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

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

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

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