垃圾收集器如何在 JVM 退出前释放内存?
How does Garbage Collector frees up memory before JVM exits?
我读过垃圾收集器 运行 作为 java 中的 daemon
线程,守护线程的优先级较低,它们 运行 在后台支持其他非守护线程,这就是 JVM
不等待守护线程完成执行的原因。
如果所有 non-daemon
线程都已退出但仍有一些内存被占用,那么 Garbage Collector
如何设法在 JVM 停止之前释放资源而不导致任何内存泄漏?
GC 不会在 JVM 退出前释放内存。
实际发生的是,当JVM退出时,运行JVM的进程也随之退出1。当进程退出时,操作系统回收该进程(独占)使用的所有 RAM 和交换页,并回收其虚拟内存页表。
如果您的 Java 程序(或 C / C++ 程序)存在内存泄漏,一旦清理了进程,这就没有关系了。 OS 始终知道哪些 RAM / 交换页面属于哪个进程。什么都没有丢失。
1 - 如果 JVM 是由使用(比方说)JNI 的 C/C++ 应用程序启动的,那么该进程不一定会在此时退出。然后由 C/C++ 应用程序决定要做什么。但是在这种情况下 GC 也不会清理。
我读过垃圾收集器 运行 作为 java 中的 daemon
线程,守护线程的优先级较低,它们 运行 在后台支持其他非守护线程,这就是 JVM
不等待守护线程完成执行的原因。
如果所有 non-daemon
线程都已退出但仍有一些内存被占用,那么 Garbage Collector
如何设法在 JVM 停止之前释放资源而不导致任何内存泄漏?
GC 不会在 JVM 退出前释放内存。
实际发生的是,当JVM退出时,运行JVM的进程也随之退出1。当进程退出时,操作系统回收该进程(独占)使用的所有 RAM 和交换页,并回收其虚拟内存页表。
如果您的 Java 程序(或 C / C++ 程序)存在内存泄漏,一旦清理了进程,这就没有关系了。 OS 始终知道哪些 RAM / 交换页面属于哪个进程。什么都没有丢失。
1 - 如果 JVM 是由使用(比方说)JNI 的 C/C++ 应用程序启动的,那么该进程不一定会在此时退出。然后由 C/C++ 应用程序决定要做什么。但是在这种情况下 GC 也不会清理。