只需4个步骤,分析解决在生产环境下JVM内存泄露问题

作者:未完成交响曲

发现异常

首先通过我们内部搭建的日志平台发现我们线上环境一个java应用有大量的http接口请求超时,登录linux服务器查看网络环境没有问题,判断是应用自身运行异常,重启应用后发现异常还在,开始查找问题。

初步查找问题

通过指令:jstat -gcutil 查看jvm内存占用和gc情况:

发现老年代内存占用比例过高,并且每次fullGC后并没有有效回收。老年代内存占用百分比变化趋势大致如下:

初步判断大量请求超时和服务瘫痪的直接原因:
每次fullGC后的内存占用越来越高
内存占用增长速度越来越快
fullGC的频率越来越高
最终占用达到100%,服务完全瘫痪

分析处理

使用指令:jmap -histo:live *** | more 查看堆内存中的对象数量和大小

发现Log4jLogEvent这个对象实例很多,占用内存也异常的大,初步分析是异步日志传输速度跟不上,导致日志对象堆积在内存中。
尝试使用调整Flume传输日志参数:提高flume单次传输量,减少最大延迟时间
重启应用并监控接口调用情况发现应用暂时恢复正常了。

后续分析

在前一步分析内存的同时,使用指令:jmap -dump:format=b,file=heapDump.hprof将实时内存信息导出(dump过程比较慢,所以在问题暂时处理完后进行后续分析),使用mat分析内存结构:

可以看到主要占据堆内存的对象信息,果然是Flume异步传输日志堵塞的问题。

总结

对jvm内存泄露这类问题的解决,主要是要善于利用jvm提供的类似jstat、jmap等工具来分析查找问题。这次问题虽然解决,但是后续还是存在出现此类问题的风险。所以除了加强jvm问题排查能力的同时,我们也将建立应用监控平台的计划提上日程,希望能对jvm内存、线程等应用实时运行指标进行监控,便于尽早发现问题。

欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

原文地址:https://blog.51cto.com/14442094/2426782

时间: 2024-10-03 13:44:34

只需4个步骤,分析解决在生产环境下JVM内存泄露问题的相关文章

四步法分析定位生产环境下MySQL上千条SQL中的问题所在

第一步:通过以下两种方式之一来打开慢查询功能 (1)方式一:通过修改mysql的my.cnf文件 如果是5.0或5.1等版本需要增加以下选项: log-slow-queries="mysql_slow_query.log" 如果是5.5版本以上可以增加如下选项: slow-query-log=On slow_query_log_file="mysql_slow_query.log" log-query-not-using-indexes 但是以上修改mysql配置文

解决在VSAN环境下嵌套ESXI出错的问题

在VSAN环境下,如果直接在esxi上嵌套esxi,在按下F11开始安装时,会出现以下报错 可以参考此文章解决:https://tsmith.co/2013/running-nested-esxi-5-5-on-vsan/ 即在当前 主ESXi系统上(物理机),通过SSH登陆运行以下命令:esxcli system settings advanced set -o /VSAN/FakeSCSIReservations -i 1

解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题

关键点:- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status代理方法 iOS7环境下当APP首次调用startUpdatingLocation方法开启定位服务时,系统会自动将该APP的定位子选项加入设置中的定位权限列表,并弹框提示用户是否为该APP定位服务授权. 可是在iOS8环境下,使用定位服务的方式较之前版本发生改变,调用s

Analyzer tool(MAT)分析JVM内存泄露案例

1.监控目的 2.常用分析工具 3.分析案例-MATMAT 介绍及分析:启动MAT, 然后选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件.文件加载完后,可以看到如图 1所示的界面:从图1可以看到他的大部分功能:? Histogram 可以列出内存中的对象,对象的个数及大小? Dominator Tree 可以列出哪个线程以及线程执行的哪些对象占用空间? Top consumers 通过图形列出最大的object? Leak Suspects 通过MA自动分析泄漏

只需一步教你解决Win10下Android Studio terminal无法使用的问题

Android Studio集成和添加了一些实用的工具,其中一个便是terminal.在Windows平台下Android Studio中的terminal在原理上实际使用的是window中的cmd控制台也就是位于C:\Windows\System32\目录下的cmd.exe.升级了win10的用户会发现,win10下的cmd比以前平台下的cmd改进了不少,但这些改进也导致了Android studio在调用cmd上出现了问题. 解决办法: 打开cmd控制台窗口,在选项中进行如下操作,如图: 然

源码时代Java干货分享|Shell脚本编程学习入门,只需两个步骤,包你学会!

最近在学习shell编程,对于shell脚本中第一行用于指定脚本解释器的代码到底有没有起到指定解释器的作用感到疑惑,如:#!/bin/bash 在网上查找了不少资料,发现网上竟然也分了两大派,一些人认为#!/bin/bash没有起到作用,因为在shell脚本中#表示是注释的意思,而另一些人则认为是起作用的,但是没有给出令人信服的理由,没办法,我只好自己动手做测试了.1.首先我先创建了一个名为test.sh的shell文件,里面内容如下 这个脚本文件中的第二行代码使用了bash语法,不支持POSI

解决eclipse maven install 造成JVM 内存溢出(java.lang.OutOfMemoryError: Java heap space)

maven install 报错信息: The system is out of resources.Consult the following stack trace for details.java.lang.OutOfMemoryError: Java heap space at java.util.HashMap.createEntry(HashMap.java:897) at java.util.HashMap.addEntry(HashMap.java:884) at java.ut

解决Windows x64bit环境下无法使用PLSQL Developer连接到Oracle DB中的问题

本文是原创文章,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/46416455 背景:PLSQL Developer没有64bit的版本,因此,只能通过32bit的Oracle Client连接. 知识点一: Oracle 32-bit Client on Windows 64-bit OS will be registered under hyve key 'Wow6432Node' like: ----------------

基于生产环境的JVM调优-结果分析

硬件:一台centos linux 64位8G,2核的server. 四个生产tomcat. 废话不多说,喷子勿扰,上截图. jvm及tomcat调优配置截图: 结果查看: 先用top获得java虚拟机的进程pid,然后使用jstat -gc pid 5000命令查看每个虚拟机内存使用情况如图: 上面是优化的生产环境,下面我们看看未做任何优化的测试环境,如图: 总结: 不难看出,优化后的生产环境在运行半个月后未进行过任何一次fullGc,而且老年代剩余空间还非常大,更而且生产环境有4台tomca