像脑筋急转弯一样,绕来绕去的
因为 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都毫无作用了