JVM虚拟机中何时会触发FullGC呢?
下文笔者讲述JVM触发FullGC的场景说明,如下所示
旧生代空间不足
旧生代空间在新生代对象转入 或创建为大对象、大数组时会出现不足的现象 此时就会触发Full GC 当FullGC后,空间仍然不能满足程序的要求,自身会爆出相应的异常 java.lang.OutOfMemoryError: Java heap space 所以我们应尽量避免创建过大的数组或对象
Permanet Generation空间满
PermanetGeneration中存放的为一些class的信息等, 当系统中要加载的类、反射的类和调用的方法较多时 Permanet Generation可能会被占满, 此时会触发FullGC 如果FullGC还无法释放出可用的空间, 则此时会抛出异常 java.lang.OutOfMemoryError: PermGen space
CMS GC时出现promotion failed和concurrent mode failure
对于采用CMS进行旧生代GC的程序而言 当GC日志出现promotion failed和concurrentmode failure两种状况 可能会触发Full GC
统计Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象 在进行Minor GC时,会进行判断 如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,则直接触发Full GC 如: 程序第一次触发MinorGC后,有8MB的对象晋升到旧生代 则当下一次Minor GC发生时, 首先检查旧生代的剩余空间是否大于8MB,如果小于8MB,则执行Full GC。 当新生代采用PSGC时,方式稍有不同,PS GC是在Minor GC后也会检查, 例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否大于8MB,如小于,则触发对旧生代的回收。
除了以上情况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言, 默认情况下会一小时执行一次Full GC。 或在启动时通过– java-Dsun.rmi.dgc.client.gcInterval=3600000 来设置Full GC执行的间隔时间 或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。