我有一个应用程序,它在启动时运行两个或三个完整的GC。堆空间很多,不需要运行任何GC(次要或完整)。但是在gc log上,我可以看到permgen被填满后立即运行完整的GC。之后,permgen空间增加了。最终,一旦加载了所有类,就不再有完整的GC了。
我的问题是如果permgen被填满,VM是否运行GC从堆中获取一些内存并为permgen添加额外的内存?还是会抛出OutOfMemory-permgen?
答案 0 :(得分:3)
我的问题是如果permgen被填满,VM是否运行GC从堆中获取一些内存并为permgen添加额外的内存?还是会抛出OutOfMemory-permgen?
GC将运行一个完整的GC,试图释放permgen空间中的一些内存。如果没有释放足够的空间,就会抛出OOME说permgen已经满了。
没有当前或过去的HotSpot JVM会尝试增加permgen超出其规定的限制,无论是否有正常的堆空间来允许这样做。
在OOME(permgen)之前需要完整GC的原因是:
Permgen对象(AFAIK)通常是不可变的,因此不太可能因permgen对象变异而导致的可达性变化。
答案 1 :(得分:0)
如果PermGen大小达到-XX:MaxPermGen限制(或默认值),它将抛出OOM-permgen。