操作系统如何清理JVM的内存以及JVM如何清理堆中的对象?

时间:2014-04-10 12:34:30

标签: java garbage-collection operating-system

当我们的应用程序完成其工作时,系统分配的内存(对于我们的JVM)会发生什么。 GC是否删除所有对象? JVM如何释放内存以及Mac OS如何使用其内存清理JVM进程。

当我使用System.exit(1)关闭我的应用程序时,我的JVM对GC和内存做了什么?

2 个答案:

答案 0 :(得分:1)

垃圾收集器是否运行是特定于JVM的行为,但在大多数情况下它不会(并且我将在解释操作系统时解释原因)。如果要在退出时执行某些操作(例如调用System.gc()以建议垃圾收集器应该运行),那么您可以使用Runtime.addShutdownHook API。请注意,这是一个建议,并且可能无法在所有情况下实际运行GC。

System.exit()结束时,Java将向Mac OS发出exit()个系统调用。发生这种情况时,操作系统将暂停Java进程中的所有线程,并且操作系统将释放它正在使用的内存页面。这与Java在对象上运行的释放不同,后者释放了一个(通常非常小的)内存以供Java进程重用,但Java仍然可以完全控制内存,操作系统无法将其提供给另一个处理。当操作系统解除分配一页内存时,这意味着现在存在一个物理区域的内存,可以由另一个进程或操作系统本身分配(用于文件系统缓存)。由于操作系统只按内存页面的倍数(通常大约4k字节)分配和释放内存,因此它可以比Java(可能在单个页面内处理许多对象)更快地释放内存。

在退出之前(通过在退出时运行GC)释放它所使用的所有内存对Java没有意义的原因是,一旦程序退出,它并不重要这些页面中的内容是因为没有人关心Java进程中最后持有的数据。操作系统将确保预先清除分配给新进程的任何页面清除旧数据。

答案 1 :(得分:0)

当您调用System.exit(1)垃圾收集器可能会或可能不会运行时,此处无法保证。 Mac OS(或任何其他操作系统)如何为特定进程回收内存完全取决于您使用的操作系统。这里的保证是一旦进程完成,将回收内存。

我认为最简单的模式是知道进程使用的内存的起始和结束地址,一旦完成它就会被回收。但我不确定。

您可以在此处阅读有关Mac OS内存管理的一些信息:Mac OS