【问题标题】:Will GC run if permgen fills up?如果 permgen 满了,GC 会运行吗?
【发布时间】:2013-04-09 04:55:28
【问题描述】:

我有一个应用程序在启动时运行两个或三个完整的 GC。有很多堆空间,不需要运行任何 GC(次要或完全)。但是在 gc 日志上,我可以看到 permgen 被填满,然后立即运行完整的 GC。在此之后,permgen 空间增加。最终,一旦所有的类都加载完毕,就不会再有full GC了。

我的问题是,如果 permgen 被填满,VM 是否会运行 GC 以从堆中获取一些内存并为 permgen 添加额外的内存?还是会抛出 OutOfMemory-permgen?

【问题讨论】:

  • 看起来如果你最初增加 MaxPermGen,你可以避免这些 GC

标签: java jvm permgen


【解决方案1】:

我的问题是,如果 permgen 被填满,VM 是否会运行 GC 以从堆中获取一些内存并为 permgen 添加额外的内存?还是会抛出 OutOfMemory-permgen?

GC 将运行一次完整的 GC 以尝试释放 permgen 空间中的一些内存。如果这未能释放足够的空间,则会抛出 OOME,说明 permgen 已满。

当前或过去的 HotSpot JVM 不会尝试将 permgen 增加到超出其规定的限制,无论是否有正常的堆空间允许这样做。


在 OOME (permgen) 之前需要进行一次 full GC 的原因是:

  • 在非 permgen 空间中可能存在对 permgen 对象的引用。为此运行完整的 GC 检查。
  • (AFAIK) GC'ing permgen 通常与完整的 GC 相关联......大概是出于同样的原因。它通常是来自普通堆和 GC“根”的引用,它们使 permgen 对象保持可访问性。

Permgen 对象 (AFAIK) 通常是不可变的,因此不太可能因 permgen 对象突变而改变可达性。

【讨论】:

    【解决方案2】:

    如果 PermGen 大小达到您的 -XX:MaxPermGen 限制(或默认值),它将抛出 OOM-permgen。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-11
      • 2014-10-04
      • 2021-03-31
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2013-06-10
      相关资源
      最近更新 更多