Java 如果permgen满了,GC会运行吗?

Java 如果permgen满了,GC会运行吗?,java,jvm,permgen,Java,Jvm,Permgen,我有一个应用程序,它在启动时运行两到三个完整GC。堆空间很大,不需要运行任何GC(较小或已满)。但是在gc日志中,我可以看到permgen被填满了,然后立即运行一个完整的gc。在此之后,permgen空间增加了。最终,一旦加载了所有类,就不再有完整的GC了 我的问题是,如果permgen被填满,VM是否运行GC从堆中获取一些内存并向permgen添加额外内存?或者它会抛出OfMemory permgen吗?如果permgen大小达到您的-XX:MaxPermGen限制(或默认值),它会抛出OOM

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


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

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

我的问题是,如果permgen被填满,VM是否运行GC从堆中获取一些内存并向permgen添加额外内存?还是会抛弃记忆的永久性

GC将运行一个完整的GC,试图释放permgen空间中的一些内存。如果这无法释放足够的空间,将抛出一个OOME,说明永久发电机已满

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


在OOME(permgen)之前需要进行完整GC的原因如下:

  • 在非permgen空间中可能存在对permgen对象的引用。运行完整GC将检查此项
  • (AFAIK)不管怎样,永久发电机的GC’ing通常与完整的GC绑定。。。大概是出于同样的原因。通常是来自普通堆和GC“根”的引用使permgen对象保持可访问性

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

看起来,如果您最初增加MaxPermGen,您可以避免这些GCs