gpt4 book ai didi

java - 如果 permgen 填满,GC 会运行吗?

转载 作者:行者123 更新时间:2023-12-04 05:02:58 26 4
gpt4 key购买 nike

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

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

最佳答案

My question is if permgen gets filled up, does the VM run GC to claim some memory from heap and add extra memory to permgen? or does it throw OutOfMemory-permgen?



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

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

需要在 OOME (permgen) 之前进行完整 GC 的原因是:
  • 在非永久空间中可能存在对永久生成对象的引用。为此运行完整的 GC 检查。
  • (AFAIK) GC'ing permgen 通常与完整的 GC 相关联……大概是出于同样的原因。通常是来自普通堆和 GC“根”的引用使永久对象保持可达。

  • Permgen 对象 (AFAIK) 通常是不可变的,因此不太可能由于 permgen 对象突变而导致可达性发生变化。

    关于java - 如果 permgen 填满,GC 会运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893592/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com