zoukankan      html  css  js  c++  java
  • JVM011如何解决线上gc频繁的问题

    对于线上系统突然产生的运行缓慢问题,如果导致线上系统不可用,首先导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。

    造成这种情况可能的原因主要有两种:

    1.代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢。

    2.代码中比较耗CPU的操作,导致CPU占用率过高,系统运行缓慢。

    相对来说,这是出现频率最高的两种线上问题,而且会直接导致系统不可用。

    另外几种情况也会导致某个功能运行缓慢,但不至于导致系统不可用,如:

    1.代码某个位置有阻塞性的操作,导致该功能调用整体比较耗时,但出现是比较随机的。

    2.某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现。

    3.由于锁使用不当,导致多个线程进入死锁状态,从而导致系统整体比较缓慢。

    对于这三种情况,通过查看CPU和系统内存情况是无法查看出具体问题的,因为相对来说都是具有一定阻塞性操作,CPU和系统内存使用情况都不高,但是功能却很慢。

    就需要通过查看系统日志来一步一步甄别上述几种问题。

    对于Full GC次数过多

    相对来说,这种情况是最容易出现的,尤其是新功能上线时,对于Full GC较多的情况,其主要有如下两个特征:

    (1)线上多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要时垃圾回收线程

    (2)通过jstack命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。

    对应的排查操作:

    (1)使用top命令查看系统CPU的占用情况。

    (2)找到CPU占用量最高的java程序,并用top命令查看该进程的各个线程运行情况。

    (3)通过jstack命令查看具体耨个线程为什么耗费CPU过高。

    (4)根据具体的信息,来继续一步步排查问题所在。

  • 相关阅读:
    QT调用其他UI并使用QLabel(text)
    QT调用单例模式脚本
    QT 调用另一个UI实现方式
    QT 键值
    (一) Mybatis 源码解析之源码概述
    设计模式之 模板模式开发
    十二、线程池
    (十一)并发容器ConcurrentHashMap
    mybatis plus 踩坑记 -- 自动填充
    C/C++ file
  • 原文地址:https://www.cnblogs.com/asenyang/p/15577866.html
Copyright © 2011-2022 走看看