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