频繁GC引起卡顿问题排查与解决

news2024/11/15 21:36:54

一  问题描述

今天测试组更新测试环境后发现系统卡顿,无法办理任何业务,重启系统后问题仍然存在。已经到项目后期,迭代测试时间十分紧张。此问题直接影响到项目进度

二 排查过程

1.执行命令top

Linux 下常用top命令显示系统中各个进程的资源占用状况,查看资源发现PID26799进程信息中

CPU使用率达到了333%。详细信息如下

root@10.0.254.59 15:57:17 /data/jboss-4.2.3-9.0.0-8078/bin  # top
top - 16:01:10 up 241 days, 22:37,  6 users,  load average: 8.83, 3.23, 2.69
Tasks: 207 total,   1 running, 206 sleeping,   0 stopped,   0 zombie
%Cpu(s): 84.0 us,  0.7 sy,  0.0 ni, 15.2 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem : 16266800 total,   170440 free,  9203876 used,  6892484 buff/cache
KiB Swap:  4194300 total,  4066812 free,   127488 used.  6589968 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                                                   
26799 root      20   0 8730000   4.6g  28024 S 333.0 29.9  11:09.94 java                                                                                                                                                                                                      
27727 root      20   0 8728572   2.3g  36332 S   1.0 14.6  12:27.05 java                                                                                                                                                                                                      
21841 root      20   0 5464404   1.6g  16284 S   0.7 10.2 145:29.47 java                                                                                                                                                                                                      
    9 root      20   0       0      0      0 S   0.3  0.0  11:51.47 rcu_sched                                                                                                                                                                                                 
13985 root      20   0  162148   2408   1588 R   0.3  0.0   0:00.01 top                                                                                                                                                                                                       
24029 root      20   0  162856   3156   1608 S   0.3  0.0   0:45.30 top                                                                                                                                                                                                       
    1 root      20   0  193640   4364   2832 S   0.0  0.0  19:42.60 systemd                                                                                                                                                                                                   
    2 root      20   0       0      0      0 S   0.0  0.0   0:01.32 kthreadd                                                                                                                                                                                                  
    3 root      20   0       0      0      0 S   0.0  0.0   0:28.28 ksoftirqd/0                                                                                                                                                                                               
                 

2. 执行命令 top -Hp  PID

使用top -Hp命令查找该进程中CPU使用最高的线程,发现26801、26802、26803、28604线程CPU使用都达到了100%

root@10.0.254.59 16:01:15 /data/jboss-4.2.3-9.0.0-8078/bin  # top -Hp 26799
top - 16:01:25 up 241 days, 22:37,  6 users,  load average: 8.14, 3.35, 2.74
Threads: 553 total,   4 running, 549 sleeping,   0 stopped,   0 zombie
%Cpu(s): 98.5 us,  1.5 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16266800 total,   169656 free,  9204352 used,  6892792 buff/cache
KiB Swap:  4194300 total,  4066812 free,   127488 used.  6589608 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                                                                    
26801 root      20   0 8730000   4.6g  28024 R 99.9 29.9   1:06.08 java                                                                                                                                                                                                       
26803 root      20   0 8730000   4.6g  28024 R 99.9 29.9   1:06.22 java                                                                                                                                                                                                       
26804 root      20   0 8730000   4.6g  28024 R 99.9 29.9   1:06.30 java                                                                                                                                                                                                       
26802 root      20   0 8730000   4.6g  28024 R 99.9 29.9   1:06.11 java                                                                                                                                                                                                       
26799 root      20   0 8730000   4.6g  28024 S  0.0 29.9   0:00.00 java                                                                                                                                                                                                       
26800 root      20   0 8730000   4.6g  28024 S  0.0 29.9   0:00.05 java                                                                                                                                                                                                       
26805 root      20   0 8730000   4.6g  28024 S  0.0 29.9   0:08.64 java                                                                                                                                                                                                       
26806 root      20   0 8730000   4.6g  28024 S  0.0 29.9   0:00.01 java                                                                                                                                                                                                       
                                                                                                                                                                                                    

3. 执行jstack

使用jstack将PID26799进程的栈信息导出到临时文件以便分析

root@10.0.254.59 16:01:58 /data/jboss-4.2.3-9.0.0-8078/bin  # jstack 26799 >pid26799.txt

4. 执行printf 将线程号格式化为16进制

26801、26802、26803、28604分别对应十六进制数068b1,、068b2、068b3、068b4

例如:

root@10.0.254.59 16:02:59 /data/jboss-4.2.3-9.0.0-8078/bin  # printf "0%x\n" 26802

068b2

5. 查找线程的栈信息

通过占用转换后的十六进制数去导出的pid26799.txt中查找栈信息。发现4个线程都是GC任务

"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007faef408e800 nid=0x68b6 in Object.wait() [0x00007faee1603000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:502)
	at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
	- locked <0x00000006c043d188> (a java.lang.ref.Reference$Lock)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"VM Thread" os_prio=0 tid=0x00007faef4085000 nid=0x68b5 runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007faef4020000 nid=0x68b1 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007faef4022000 nid=0x68b2 runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007faef4024000 nid=0x68b3 runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007faef4025800 nid=0x68b4 runnable 

"VM Periodic Task Thread" os_prio=0 tid=0x00007faef40d4800 nid=0x68bd waiting on condition 

6.执行jstat 查看GC任务

发现YGC(年轻代回收次数) 和FGC(老年代垃圾回收次数) 都比较大,且YGCT(年轻代回收消耗时间) 和FGCT(老年代垃圾回收消耗时间)都比较长,说明系统因为GC才出现的卡顿现象。因为,在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起,在Java中的这个现象叫做Stop-The-World机制简称STW。 这是一种全局暂停现象。

root@10.0.254.59 16:05:45 /data/STARSMS/jboss-4.2.3-9.0.0-8078/bin  # jstat -gc 26799 5000
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709387.4  180608.0 166270.8 22400.0 18766.9     61   17.137  33    394.263  411.400
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709387.4  180608.0 166270.8 22400.0 18766.9     61   17.137  33    394.263  411.400
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709387.2  180608.0 166292.3 22400.0 18766.9     61   17.137  34    409.916  427.052
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709387.2  180608.0 166292.3 22400.0 18766.9     61   17.137  34    409.916  427.052
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709387.2  180608.0 166292.3 22400.0 18766.9     61   17.137  34    409.916  427.052
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709236.9  180608.0 166306.0 22400.0 18769.6     61   17.137  35    426.082  443.219
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709236.9  180608.0 166306.0 22400.0 18769.6     61   17.137  35    426.082  443.219
200192.0 211456.0  0.0    0.0   919552.0 919552.0 2796544.0  2709236.9  180608.0 166306.0 

7. 堆转储,分析dump.hprof 文件

先通过  arhtas  的heapdump命令得到hprof文件。( 参考:arthas)通过浏览器下载: http://localhost:8563/arthas-output/ 

[arthas@9312]$ heapdump arthas-output/dump.hprof
Dumping heap to arthas-output/dump.hprof ...
Heap dump file created

 

 

然后分析hprof文件, 分析方法有很多中我使用的是JDK自带的bin/jvisualvm.exe 分析

文件- 装入-选择下载的dump.hprof文件

因为SWT时线程被挂起,所以泄露的程序应该有线程信息, 根据对象和线程栈发现了可疑程序

"autoArrivalTimeChangeQuartzSchedule_Worker-1" #361 prio=5 os_prio=0 tid=0x00007fae4419c800 nid=0x6e97 runnable [0x00007fae36f2d000]
   java.lang.Thread.State: RUNNABLE
	at java.text.DateFormatSymbols.<init>(DateFormatSymbols.java:145)
	at sun.util.locale.provider.DateFormatSymbolsProviderImpl.getInstance(DateFormatSymbolsProviderImpl.java:85)
	at java.text.DateFormatSymbols.getProviderInstance(DateFormatSymbols.java:364)
	at java.text.DateFormatSymbols.getInstance(DateFormatSymbols.java:340)
	at java.util.Calendar.getDisplayName(Calendar.java:2110)
	at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1125)
	at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966)
	at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)
	at java.text.DateFormat.format(DateFormat.java:345)
	at com.star.sms.business.customer.job.GwNpDealContext.getDateList(GwNpDealContext.java:277)

8.分析线上代码

使用arhtas 的jad命令查看线上代码,发现275-279行提交的代码存在死循环。至此找到内存泄露代码

[arthas@9312]$ jad com.star.sms.business.customer.job.GwNpDealContext getDateList

ClassLoader:
+-org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@105c375d[stariboss-customer:1.0.0(id=130)]
  +-org.eclipse.osgi.baseadaptor.BaseAdaptor$1@d280fb

Location:
/E:/Jboss/jboss-4.2.3-9.0.0R1-8089-hebei-dev/server/default/tmp/stariboss_configuration/org.eclipse.osgi/bundles/130/1/bundlefile

        public List<String> getDateList(String startTime, String endTime, GwNpUserType type) {
            ArrayList<String> dateList = new ArrayList<String>();
/*246*/     SimpleDateFormat format = null;
/*247*/     int calendarField = 0;
/*248*/     if (type.equals((Object)GwNpUserType.HOR)) {
                format = new SimpleDateFormat("yyyyMMddHH");
/*250*/         calendarField = 11;
/*251*/     } else if (type.equals((Object)GwNpUserType.DAY)) {
                format = new SimpleDateFormat("yyyyMMdd");
/*253*/         calendarField = 5;
/*254*/     } else if (type.equals((Object)GwNpUserType.MONTH)) {
                format = new SimpleDateFormat("yyyyMM");
/*256*/         calendarField = 2;
            } else {
/*258*/         this.log.info((Object)"=====GwNpUserType is INVALID======");
/*259*/         return dateList;
            }
            try {
/*263*/         Date startTime1 = null;
/*264*/         Date endTime1 = null;
/*265*/         if (StringUtils.hasText((String)startTime)) {
/*266*/             startTime1 = format.parse(startTime);
/*267*/             endTime1 = format.parse(endTime.substring(0, startTime.length()));
                } else {
/*269*/             startTime = this.assigStartTime(startTime, calendarField);
/*270*/             startTime1 = DateFormatUtil.parseStrToDate4((String)startTime);
/*271*/             endTime1 = DateFormatUtil.parseStrToDate4((String)endTime);
                }
/*274*/         Calendar tempStart = Calendar.getInstance();
/*275*/         tempStart.setTime(startTime1);
                while (endTime1.getTime() >= startTime1.getTime()) {
/*277*/             dateList.add(format.format(startTime1));
/*279*/             startTime1 = tempStart.getTime();
                }
            }
            catch (Exception e) {
                // empty catch block
            }
/*284*/     return dateList;
        }

三 问题总结

本问题是因为开发提交了几行未经测试的代码引起, 此代码直接引起内存泄露,系统频繁GC。这也是提交未测试代码引起故障的典型案例。


 上一篇:了解高可用


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PID原理

PID控制器&#xff08;比例-积分-微分控制器&#xff09;&#xff0c;由比例单元&#xff08;P&#xff09;、积分单元&#xff08;I&#xff09;和微分单元&#xff08;D&#xff09;组成。 可以通过调整这三个单元的增益Kp&#xff0c;Ki和Kd来调定其特性&#xff0c;PID控制…

PowerDesigner 15 安装、汉化、逆向生成ER图、物理模型转逻辑模型、生成sql及简单使用

文章目录 前言PowerDesigner 15 安装、汉化、逆向生成ER图、物理模型转逻辑模型、生成sql及简单使用1. 安装2. 汉化3. 使用4. 逆向生成ER图4.1. 创建新模型4.2. 根据sql逆向生成er图 5. 物理模型新建表6. 物理模型转逻辑模型7. 生成sql语句 前言 如果您觉得有用的话&#xff0c…

Modelsim10.7仿真报错

把之前老版本的modelsim换掉了&#xff0c;新的装好仿真发现有点小毛病&#xff0c;记录以下 使用modelsim10.7仿真时出现错误&#xff0c;编译通过但报以下错误 ** Note: (vsim-3812) Design is being optimized…** INTERNAL ERROR: vopt returned success but vsim could …

arthas的简单使用

目录 arthas是什么为什么要使用arthasarthas能做什么安装arthas前提准备arthas主要命令trace命令watch命令monitor命令jad命令dashboard命令Thread命令sc命令mc命令redefine命令 实战演练1.定位到需要修改的类2.将定位到的.class文件反编译成.java文件3.修改.java文件4.将修改后…

不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 转载自内网穿透工具的文章&#xff1a;Python一行代码实现文件共享【内网穿透公网访问…

Spring Bean生命周期源码详解

文章目录 Bean生命周期源码生成BeanDefinitionSpring容器启动时创建单例Bean合并BeanDefinitiongetBean()方法加载类实例化前实例化BeanDefinition的后置处理实例化后依赖注入执行Aware回调初始化前初始化初始化后销毁逻辑 Bean生命周期源码 我们创建一个ApplicationContext对…

深度学习:神经网络的前向传播过程

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 哲学与爱情是我永远都搞不懂的两件事情 注&#xff1a; 以三层神经网络为例说明神经网络的前向传播过程激活函数采用 R e L U ReLU ReLU 函数 w…

搞懂位图和布隆过滤器

文章目录 位图腾讯面试题位图概念位图实现位图的应用位图的应用题 布隆过滤器布隆过滤器提出布隆过滤器概念布隆过滤器实现原理布隆过滤器的应用场景如何选择哈希函数个数和布隆过滤器长度 - - 目的减少误判率布隆过滤器的实现布隆过滤器优点布隆过滤器缺陷 海量数据面试题哈希…

科普帖:如何提升Watch Buds的音质体验,看这里!

对于追求小巧便携的友友们来说&#xff0c;华为Watch Buds耳机可谓是非常惊喜的存在。华为Watch Buds耳机形态独树一帜&#xff0c;同时在耳机控制上做了一个广域耳廓触控功能&#xff0c;是华为首次采用的功能。即耳机、耳廓或靠近耳屏的脸颊区域都可操控&#xff0c;双击可接…

【MYSQL】Java的JDBC编程(idea连接数据库)

1. 配置 &#xff08;1&#xff09;新建一个项目 &#xff08;2&#xff09;Build System 那里选择Maven,下一步Create &#xff08;3&#xff09;配置pom.xml文件 首先查看自己的MYSQL版本&#xff1a;进入MySQL命令窗口 我的MYSQL版本是8.0版本的. 下一步&#xff0c;…

【Java基础】Java总览

一、what-什么是Java&#xff1f; Java是一种面向对象的编程语言&#xff0c;其他面向对象的编程语言还有C#&#xff0c;C&#xff0c;Python&#xff0c;Python&#xff0c;golang&#xff0c;VB等。 1、和其他语音对比 对比项\语言CCJava上线时间1972年1979年1995年特点面向…

[pgrx开发postgresql数据库扩展]3.hello world全流程解析

数据库的扩展开发框架 一般来说&#xff0c;数据库的扩展开发主要有的目的就是扩展数据库引擎的能力&#xff08;不管是用pgrx还是其他的框架都一样&#xff09;&#xff1a; 例如PostgreSQL上最著名的扩展PostGIS&#xff0c;就是扩展了PG数据库的空间数据支持能力&#xff…

Linearx配置环境

代码地址 gitssh.dev.azure.com:v3/linearx/PowerDDS/PowerDDS LinearX-5G Wifi pwd: 50186058 Windows报错可以搜索错误代码找官方给出的解决方案 最新版本cmake&#xff1a;ubuntu 20.04安装(升级)cmake - 知乎 (zhihu.com) gtest&#xff1a;gtest的安装_liuzubing的博客…

图论 Kruskal 最小生成树算法

前置知识 关于最小生成树 先说「树」和「图」的根本区别&#xff1a;树不会包含环&#xff0c;图可以包含环 树就是「无环连通图」 生成树是含有图中所有顶点的「无环连通子图」 你要保证这些边&#xff1a; 1、包含图中的所有节点。 2、形成的结构是树结构&#xff08;即不…

NFS共享存储服务

目录 一、NFS简介二. NFS工作原理实验&#xff1a;准备一台服务器&#xff0c;一台客户端。实现共享目录服务器上发布共享目录配置操作客户端配置操作 总结 一、NFS简介 NFS&#xff08;Network File System 网络文件服务&#xff09; NFS 是一种基于 TCP/IP 传输的网络文件系…

五一国际劳动节知多少!祝五一劳动节快乐! Happy International Workers‘Day!

五一国际劳动节简称五一节&#xff0c;在每年的5月1日&#xff0c;它是全世界劳动人民的共同节日。5.1 International labor Days call 5.1 sections, May 1 in every year. It is the whole world labor common festival of the people. 劳动是人类的幸福之源。 Work is the t…

JQuery-原理示意图-- 选择器-- 选择器综合代码--jQuery 的 DOM 操作--增删改查节点--常用遍历节点方法--多选框应用--全部综合代码

目录 JQuery 基本介绍 jQuery 的原理示意图 JQuery 基本开发步骤 说明: jQuery简单示例 jQuery 对象和 DOM 对象 什么是 jQuery 对象 DOM 对象转成 jQuery 对象 应用实例 jQuery 对象转成 DOM 对象 代码演示 jQuery 选择器 jQuery 选择器介绍 jQuery 选择器的优…

Adaptive AUTOSAR 文档官方如何阅读

目前很多关于 Adaptive AUTOSAR 的文章都是官方文档的简化翻译&#xff0c;不如直接看官方文档更全面深入。 Adaptive AUTOSAR 文档官方下载地址 Adaptive Platform AUTOSARhttps://www.autosar.org/standards/adaptive-platform About The AUTOSAR Adaptive Platform impl…

JavaScript 教程---菜鸟教程

文章目录 JavaScript 教程JavaScript 输出JavaScript 对象JavaScript 函数JavaScript 事件 JS 函数JS 类JS HTML DOMJS 高级教程JS 浏览器 BOMJS 库 JavaScript 教程 JavaScript 输出 JavaScript 可以通过不同的方式来输出数据 使用window.alert()弹出警告框。 <script&…

物联网产品的开发的难点,致命点是什么?

物联网产品的开发的难点&#xff0c;致命点是什么&#xff1f; 当下是万物互联的时代&#xff0c; 物联网产品本身的难度因行业而异。但是物联网设备上云通信交互就成了各个行业需要首先解决的问题。 物联网通信问题从产品设计一开始&#xff0c;如果不能很好的解决&#xff0c…