有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    当你呼叫系统时。退出(1)垃圾收集器可能运行,也可能不运行,这里没有保证。 Mac OS(或任何其他OS)如何为特定进程回收内存完全取决于您使用的OS。这里的保证是,一旦进程完成,内存将被回收

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

    你可以在这里阅读一些关于Mac OS内存管理的信息:Mac OS

  2. # 2 楼答案

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

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

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