Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏
2015-03-11 18:30
666 查看
Java虚拟机性能管理神器 - VisualVM(6) 排查JAVA应用程序内存泄漏
排除了网络安全因素后,就从程序的运行内部进行排查,首先想到的获取JVM的dmp文件。获取JVM的dmp文件有两中方式:
1. JVM启动时增加两个参数,出现 OOME 时生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
生成堆文件地址:
-XX:HeapDumpPath=/home/test/jvmlogs/
2. 发现程序异常前通过执行指令,直接生成当前JVM的dmp文件,15434是指JVM的进程号
jmap -dump:format=b,file=serviceDump.dat 15434
由于第一种方式是一种事后方式,需要等待当前JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式。
打开dmp文件后,查看类标签,就能看到占用内存的一个排行。
然后通过检查中查找最大的对象,排查到具体线程和对象。
上列中的com.ctfo.trackservice.handler.TrackHandleThread#4就是重点排查对象。
通过代码的比对,在此线程中,有调用DAO接口,负责将数据存储到数据库中。而存储到数据库中时,由于存储速度较慢,导致此线程中的数据队列满了,数据积压,无法回收导致了队列锁定,结果就是程序假死,不处理数据。
通过进一步分析,发现数据库存储时有瓶颈,虽然当前是批量提交,速度也不快。平均8000/秒的存储速度。而数据库有一个DG(备份)节点,采用的是同步备份方式,即主库事务要等DG的事务也完成后才能返回成功,这样就会因为网络因素、DG性能因素等原因导致性能下降。通过与DBA、产品、沟通,将同步备份改为异步备份,实时同步改为异步(异步可能会导致主备有10分钟以内的数据延迟)。速度达到30000/秒。问题解决。
至此,通过VisualVM分析java程序内存泄漏到此结束。不过还有几个问题:1. 如果dmp文件较大,VisualVM分析时间可能很久;另外,VisualVM对堆的分析显示功能还不算全面。如果需要更全面的显示,就可以使用另外一个专业的dmp文件分析工具【Memory
Analyzer (MAT)】,此工具可以作为eclipse的插件进行安装,也可以单独下载使用。如果有感兴趣的朋友,我个人建议还是单独下载使用。下载地址:http://www.eclipse.org/mat/
其他文章:
Java虚拟机性能管理神器
- VisualVM(1) 简介 - JVM轻量级监控分析神器
Java虚拟机性能管理神器
- VisualVM(2) 入门
Java虚拟机性能管理神器
- VisualVM(3) 插件安装与更新路径配置
Java虚拟机性能管理神器
- VisualVM(4) - JDK版本与VisualVM版本对应关系
Java虚拟机性能管理神器
- VisualVM(5) 监控远程主机上的JAVA应用程序
Java虚拟机性能管理神器
- VisualVM(6) 排查JAVA应用程序内存泄漏
Java虚拟机性能管理神器
- VisualVM(7) 排查JAVA应用程序线程泄漏
Java虚拟机性能管理神器
- VisualVM(8) 查找JAVA应用程序耗时的方法函数
Java虚拟机性能管理神器
- VisualVM(9) 排查JAVA应用程序线程死锁
Java虚拟机性能管理神器
- VisualVM(1) 简介 - JVM轻量级监控分析神器
Java虚拟机性能管理神器
- VisualVM(2) 入门
Java虚拟机性能管理神器
- VisualVM(3) 插件安装与更新路径配置
Java虚拟机性能管理神器
- VisualVM(4) - JDK版本与VisualVM版本对应关系
Java虚拟机性能管理神器
- VisualVM(5) 监控远程主机上的JAVA应用程序
Java虚拟机性能管理神器
- VisualVM(6) 排查JAVA应用程序内存泄漏
Java虚拟机性能管理神器
- VisualVM(7) 排查JAVA应用程序线程泄漏
Java虚拟机性能管理神器
- VisualVM(8) 查找JAVA应用程序耗时的方法函数
Java虚拟机性能管理神器
- VisualVM(9) 排查JAVA应用程序线程死锁
1. 发现问题
线上应用部署完成后,运行1~2天左右就会出现假死,或者某天早上8~10点高峰期间突然不处理数据了。由于在测试环境的压力测试没有做完全,也没有遇到相关问题。情况出现后对客户的使用造成很大影响,领导要求赶紧排查出问题原因!2. 排查原因
排查原因前,与运维沟通,了解线上服务器的运行状态,通过ganglila观察网络、CPU、内存、磁盘的运行历史状态,发现程序故障前,都有一波很高的负载,排查线上日志,负载来源在8~9点平台接入数据量成倍增加,通过与产品和市场人员分析,此时段是用户集中上班、接入平台的高峰时段,访问日志也显示,业务场景正常,无网络攻击和安全问题。属于产品业务正常的场景。排除了网络安全因素后,就从程序的运行内部进行排查,首先想到的获取JVM的dmp文件。获取JVM的dmp文件有两中方式:
1. JVM启动时增加两个参数,出现 OOME 时生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
生成堆文件地址:
-XX:HeapDumpPath=/home/test/jvmlogs/
2. 发现程序异常前通过执行指令,直接生成当前JVM的dmp文件,15434是指JVM的进程号
jmap -dump:format=b,file=serviceDump.dat 15434
由于第一种方式是一种事后方式,需要等待当前JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式。
3. 解决方案
获取到dmp文件后,就开始进行分析。将服务器上的dmp文件拷贝到本地,然后启动本地的VisualVM,点击菜单栏【文件】选项,装入dmp文件打开dmp文件后,查看类标签,就能看到占用内存的一个排行。
然后通过检查中查找最大的对象,排查到具体线程和对象。
上列中的com.ctfo.trackservice.handler.TrackHandleThread#4就是重点排查对象。
通过代码的比对,在此线程中,有调用DAO接口,负责将数据存储到数据库中。而存储到数据库中时,由于存储速度较慢,导致此线程中的数据队列满了,数据积压,无法回收导致了队列锁定,结果就是程序假死,不处理数据。
通过进一步分析,发现数据库存储时有瓶颈,虽然当前是批量提交,速度也不快。平均8000/秒的存储速度。而数据库有一个DG(备份)节点,采用的是同步备份方式,即主库事务要等DG的事务也完成后才能返回成功,这样就会因为网络因素、DG性能因素等原因导致性能下降。通过与DBA、产品、沟通,将同步备份改为异步备份,实时同步改为异步(异步可能会导致主备有10分钟以内的数据延迟)。速度达到30000/秒。问题解决。
至此,通过VisualVM分析java程序内存泄漏到此结束。不过还有几个问题:1. 如果dmp文件较大,VisualVM分析时间可能很久;另外,VisualVM对堆的分析显示功能还不算全面。如果需要更全面的显示,就可以使用另外一个专业的dmp文件分析工具【Memory
Analyzer (MAT)】,此工具可以作为eclipse的插件进行安装,也可以单独下载使用。如果有感兴趣的朋友,我个人建议还是单独下载使用。下载地址:http://www.eclipse.org/mat/
其他文章:
Java虚拟机性能管理神器
- VisualVM(1) 简介 - JVM轻量级监控分析神器
Java虚拟机性能管理神器
- VisualVM(2) 入门
Java虚拟机性能管理神器
- VisualVM(3) 插件安装与更新路径配置
Java虚拟机性能管理神器
- VisualVM(4) - JDK版本与VisualVM版本对应关系
Java虚拟机性能管理神器
- VisualVM(5) 监控远程主机上的JAVA应用程序
Java虚拟机性能管理神器
- VisualVM(6) 排查JAVA应用程序内存泄漏
Java虚拟机性能管理神器
- VisualVM(7) 排查JAVA应用程序线程泄漏
Java虚拟机性能管理神器
- VisualVM(8) 查找JAVA应用程序耗时的方法函数
Java虚拟机性能管理神器
- VisualVM(9) 排查JAVA应用程序线程死锁
Java虚拟机性能管理神器
- VisualVM(1) 简介 - JVM轻量级监控分析神器
Java虚拟机性能管理神器
- VisualVM(2) 入门
Java虚拟机性能管理神器
- VisualVM(3) 插件安装与更新路径配置
Java虚拟机性能管理神器
- VisualVM(4) - JDK版本与VisualVM版本对应关系
Java虚拟机性能管理神器
- VisualVM(5) 监控远程主机上的JAVA应用程序
Java虚拟机性能管理神器
- VisualVM(6) 排查JAVA应用程序内存泄漏
Java虚拟机性能管理神器
- VisualVM(7) 排查JAVA应用程序线程泄漏
Java虚拟机性能管理神器
- VisualVM(8) 查找JAVA应用程序耗时的方法函数
Java虚拟机性能管理神器
- VisualVM(9) 排查JAVA应用程序线程死锁
相关文章推荐
- Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁
- Java虚拟机性能管理神器 - VisualVM(7) 排查JAVA应用程序线程泄漏
- Java虚拟机性能管理神器 - VisualVM(5) 监控远程主机上的JAVA应用程序
- Java虚拟机性能管理神器 - VisualVM(8) 查找JAVA应用程序耗时的方法函数
- Java虚拟机性能管理神器 - VisualVM(2) 入门
- Java虚拟机性能管理神器 - VisualVM(1) 简介 - JVM轻量级监控分析神器
- Java虚拟机性能管理神器 - VisualVM(3) 插件安装与更新路径配置
- Java虚拟机性能管理神器 - VisualVM(1) 简介 - JVM轻量级监控分析神器
- Java虚拟机性能管理神器 - VisualVM(4) - JDK版本与VisualVM版本对应关系
- Java虚拟机性能管理神器 - VisualVM(4) - JDK版本与VisualVM版本对应关系
- Java虚拟机性能管理神器 - VisualVM(3) 插件安装与更新路径配置
- Java虚拟机性能管理神器 - VisualVM(2) 入门
- 一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序
- 使用开源的Profiler来测试你的Java应用程序的性能
- 有简易通用权限管理后台的快速C# ASP.NET开发的例子应用程序卖给了曾长期开发JAVA银行程序的大哥
- java性能分析-VisualVM
- Java 运行时监控,第 3 部分: 监控应用程序生态系统的性能与可用性
- java内存泄漏问题排查
- 应用程序性能管理有助于改善SOA
- 通过日志监控并收集 Java 应用程序性能数据