Full GC就是全面回收整个堆内存,包括新生代、老年代、永久带。整个过程极其的慢,一定要减少Full GC的次数,一般出现频繁的Full GC有几种情况,我们要避免出现这几种情况
第一种是,内存分配不合理,导致Survivor放不下,或者触发了动态年龄审核机制,频繁的往老年代放对象。
第二种,有内存泄漏问题,导致老年代大部分空间被占用,回收都回收不掉,导致每次新生代晋升一点点对象,就放不下了,触发Full GC
第三种,大对象,一般是代码层面的问题,创建了太多的大对象,大对象是直接放入老年代的,大对象过多会导致频繁触发Full GC
第四种,永久代满了,触发Full GC,我们JVM参数设置256M基本够了,如果不出现代码层面的bug ,一般不会出现这种情况
第五种,有人在代码里误调用了System.gc(),写了这个方法后,如果有机会,JVM就会发生一次Full GC。不过JVM参数可以禁止这种情况,不允许主动调用,我们要加上

一般什么情况下我们要警觉是不是频繁的Full GC了

· 第一种情况,CPU负载折线上升,特别高
· 第二种情况,系统卡死了,或者系统处理请求极慢
· 第三种情况,如果公司有监控系统,会报警。。

发现虚拟机频繁full GC时应该怎么办:(full GC指的是清理整个堆空间,包括年轻代和永久代)

(1) 首先用命令查看触发GC的原因是什么 jstat –gccause 进程id
(2) 如果是System.gc(),则看下代码哪里调用了这个方法
(3) 如果是heap inspection(内存检查),可能是哪里执行jmap –histo[:live]命令
(4) 如果是GC locker,可能是程序依赖的JNI库的原因