谁来收集垃圾或卸载垃圾收集器

Who will garbage collect or unload the garbage collector

完成java程序后,young genold genperm gen将被完全垃圾回收,而这里的垃圾回收器也是一个程序,所以谁来为垃圾收集器做垃圾收集?还是会就这样退出?

当您的 Java 程序完成后,您的 JVM 将 exit/shutdown 并且 JVM 占用的全部内存将被释放。所以,在那种情况下没有必要GC

垃圾收集器是 Java 虚拟机的一部分,虚拟机的功能远不止垃圾收集。在你的程序结束的那一刻,整个机器正在关闭并释放所有使用的内存(包括垃圾收集器)

当您启动任何进程时,该进程的内存来自操作系统。

当该进程结束时,所有内存都会返回到该操作系统。

所以,jvm 进程一结束,它的所有内存又变成了"free"。

你的问题是基于一些误解。

After finishing the java program the young gen, old gen, perm gen will be full garbage collected.

事实并非如此。

当 Java 程序完成时,JVM 退出。发生这种情况时,JVM 进程退出,其地址 space 被 OS 回收。那时,整个堆(在 JVM 进程地址 space 中)就不再存在了。

对象没有被垃圾收集,或最终确定,或其他。相反,保存对象表示的内存已被 OS 收回,并且永远不会再出现 1.

And here garbage collector is also a program, so who will do the garbage collection for the garbage collector? or will it exit just like that?

垃圾收集器不是程序。

  • 它是 JVM 的内置功能。
  • 它是用本机代码实现的,而不是 Java。
  • 当它完成一个 GC 循环时,它不会退出。相反,它会进入休眠状态,直到下次需要它为止。
  • 如果GC分配堆内存(值得怀疑2),那块内存会一直使用到下一次GC运行

1 - 那就是……除非你能说服操作系统把它给你;例如以 "core dump" 的形式,或者在页面被清零之前在虚拟内存系统中四处寻找。

2 - GC 可能会分配堆对象来保存 GC 统计信息或 GC 日志消息......但我认为它使用非堆内存来处理这些事情。无论哪种方式,为这些目的分配的内存量应该太小而无需关心。