• 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都毫无作用了
  • 相关阅读:
    如何避免无效的沟通
    CopyOnWriteArrayList源码分析
    【GO-OpenCV】go-cv快速配置
    [附源码]java毕业设计在线课程网站
    【java基础系列】14- Java的内部类与常用类
    【C++ 算法进阶】算法提升七
    【SQL学习】常用命令
    window系统 bat脚本开启和关闭防火墙
    MySQL主从复制与读写分离
    Dunford-Taylor Integral
  • 原文地址:https://blog.csdn.net/xml1996/article/details/125434135