当 JVM 退出时,堆中的对象会发生什么变化?

What happens to the Objects in the heap when JVM exits?

当 JVM 启动时 OS 为其分配内存,然后该内存用作堆和栈。当我们在堆中创建一个对象时,JVM退出后该对象会发生什么?它会静静地留在那里并 OS 在 JVM 重新启动时重新分配该内存吗?还是发生了其他事情?

堆中的对象在 JVM 退出时被释放(大部分时间)。

我之所以说 大多数时候 是因为释放堆是操作系统的责任,而不仅仅是 JVM。操作系统负责清理并使内存分配可供出租。但这也取决于操作系统,我敢肯定有些操作系统不遵循这种主流方法。

大多数对象只是 "evaporate" 当 JVM 退出时 — ,它们会在没有进行正常的垃圾收集过程(包括终结)的情况下消失。 (是possible to request finalization for them, but it is unwise because they may still be reachable and in use.) If those objects represent OS resources like open files, those resources are released (closed), but without guaranteeing that all outstanding data is saved (as happens when you close他们自己)。

更一般地说,当一个进程退出时,OS 会立即释放其所有正常的堆栈和堆内存(尽管其中一些,例如用于存储可执行文件和其他已读取文件的内存,有时可以重复使用(或保留使用)用于需要这些文件的其他进程)。例外包括用于进程间通信的 shared memory 之类的东西,您可能在不知情的情况下没有使用它。