FullGC 过多 为什么会让CPU飙升100%

FullGC 过多 为什么会让CPU飙升100%

像脑筋急转弯一样,绕来绕去的

因为 FullGC进入了死循环,而FullGC 的时候通常用户线程是需要为GC线程让步的,所以这个线程就会一直抢占CPU ,所以其他的线程都需要等待,导致程序所有功能都不能正常运行。

通常cpu飙升100%说明有线程可能又死循环

为什么会进入FullGCC的死循环呢?

对象分配到JVM的内存空间,是有分配策略的,比如:

1、大对象优先分配老年代

2、对象优先分配到年轻代的 Eden区,然后是 servicer1区,然后是老年代

3、老对象也会放到老年代

4、分配担保: 就是在年轻代的两个区都放不下的时候,就分配到老年代,如果老年代也放不下了,那么久进行fullGC

这个时候就会触发FullGC

FullGC 是会回收堆内存中所有地方的对象,回收了之后,程序继续判断 老年代是不是可以放下,

如果能,放下当前代放入的对象到堆内存

但是下次再进来的对象从年轻代问了一圈后,发现老年代也又满了,这个时候久再触发FullGCC,如此循环往复

垃圾回收这个线程 进入了死循环,一直抢占CPU资源,而且他是独占似的,这就造成了其他线程获取不到cpu,cpu利用率到达最高,所以飙升100%

另外一种,如果不能, 那么直接抛出OOM内存溢出错误

所以

cpu飙升 和OOM 都是因为有对象占用了内存空间,垃圾回收收不掉的情况。

不同点在于,cpu100% 是回收后管点用,部分对象可以被回收,但是只能暂时维持,很快就又占满内存,所以要不停回收;

OOM是,撑不下去了,报错把,FullGCC都毫无作用了

相关推荐