2010-03-10 40 views

回答

4

这取决于JVM的实现,并没有在规范中指定。

Sun JVM将坚持它作为第一步。一旦某个(可配置的)已分配内存的百分比未被使用,它就会将其中的一部分返回给操作系统(行为受到MinHeapFreeRatio and MaxHeapFreeRatio settings的影响)。

+0

我从来没有见过Java VM对于将内存返回系统非常积极 - 可能是默认情况下的一件好事。 Java进程往往是长时间运行的,并且不断扩大和缩小可能会使内存碎片化。对于大多数服务器端解决方案来说,释放内存会导致不确定的行为和糟糕的性能,但是如果他们将这个决定留给用户(使用-Xmx/-Xms设置)将会很好。 – 2016-11-14 20:08:00

1

回到过程第一,但也可以回到操作系统到底。由GC分配的内存位于一个大的连续块(​​堆)或一组块中,GC“释放”只是释放堆中的分配,但不一定返回到操作系统。一旦GC压缩,VM可能会将某些内存返回给操作系统。

GC希望保留一定的空间,以便快速处理将来的“新”内存请求。因此GC尽可能少地向操作系统请求大内存中的内存。