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

时间:2013-04-09 04:55:28

标签: java jvm permgen

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

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

2 个答案:

答案 0 :(得分:3)

  

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

GC将运行一个完整的GC,试图释放permgen空间中的一些内存。如果没有释放足够的空间,就会抛出OOME说permgen已经满了。

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


在OOME(permgen)之前需要完整GC的原因是:

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

Permgen对象(AFAIK)通常是不可变的,因此不太可能因permgen对象变异而导致的可达性变化。

答案 1 :(得分:0)

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