JVM虚拟机中何时会触发FullGC呢?

书欣 Java教程 发布时间:2022-10-19 21:39:10 阅读数:9272 1
下文笔者讲述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
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202210/4674.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者