java - OS如何清理JVM的内存以及JVM如何清理堆中的对象?

标签 java garbage-collection operating-system

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

当我使用 System.exit(1) 关闭我的应用程序时,我的 JVM 如何处理 GC 和内存?

最佳答案

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

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

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

关于java - OS如何清理JVM的内存以及JVM如何清理堆中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22988233/

相关文章:

c# - 必须处理哪些变量? (.NET/ java )

linux - 除了 fork 之外,还有没有一次不返回的系统调用?

architecture - 交换机和总线架构之间的区别?

java - JSoup "wrap"每次都没有按预期工作

java - 使用 GUI 输入添加到 ArrayList

java - 从 Autowiring bean 获取数据源时出现空指针异常

java - jdk1.6内存布局

java - JFrame 对象准备好进行垃圾回收的条件

operating-system - 虚拟内存?

java - Xmlpull Java,解析互联网上的xml文件