【问题标题】:Who will garbage collect or unload the garbage collector谁将垃圾收集或卸载垃圾收集器
【发布时间】:2018-12-30 01:57:57
【问题描述】:

java程序写完后young gen,old gen,perm gen会被全垃圾回收,而这里的垃圾回收器也是一个程序,那么垃圾回收器谁来做垃圾回收呢?还是会就这样退出?

【问题讨论】:

  • 即使 GC 被认为是一个占用内存的对象,人们首先必须对永久对象提出同样的问题......换句话说,有些东西会继续存在,直到JVM进程结束
  • 不保证 GC 在关机时运行。当一个进程存在时,它的所有资源都会被操作系统回收。
  • @GhostCat 欢迎您!我发现了一点,当jvm本身关闭时,不需要释放内存,它会交给OS。
  • @PeterLawrey 你是对的!
  • @PeterLawrey 更准确地说,我们可以在垃圾收集器在关机时不会运行的假设上下高赌注。

标签: java garbage-collection garbage


【解决方案1】:

您的问题是基于几个误解。

java程序完成后young gen、old gen、perm gen将被全垃圾回收。

事实并非如此。

当 Java 程序完成时,JVM 退出。发生这种情况时,JVM 进程退出,并且其地址空间被操作系统回收。到那时,整个堆(位于 JVM 进程地址空间中)就不再存在了。

对象不会被垃圾回收,也不会被终结,或者其他什么。相反,保存对象表示的内存已被操作系统收回,并且再也不会被看到1

而且这里的垃圾收集器也是一个程序,那么垃圾收集器的垃圾收集谁来做呢?还是会就这样退出?

垃圾收集器不是程序。

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

1 - 那就是......除非你能说服操作系统把它交给你;例如以“核心转储”的形式,或者在页面归零之前在虚拟内存系统中四处寻找。

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

【讨论】:

    【解决方案2】:

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

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

    所以,在 jvm 进程结束的那一秒,它的所有内存都会再次“空闲”。

    【讨论】:

      【解决方案3】:

      当您的 Java 程序完成时,您的 JVM 将是 exit/shutdown 并且 JVM 占用的全部内存将是空闲的。所以,这种情况下不需要GC

      【讨论】:

        【解决方案4】:

        垃圾收集器是 Java 虚拟机的一部分,它可以做更多的事情,而不仅仅是垃圾收集。在您的程序结束的那一刻,整个机器正在关闭并释放所有使用的内存(包括垃圾收集器)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-21
          • 1970-01-01
          • 2011-11-07
          • 2013-04-01
          • 2012-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多