使用Java语言开发应用程序,虽然JVM帮我们进行了GC收集、清除工作;但是使用不当的话,还是会导致某些对象常驻堆空间无法给垃圾收集器清除,导致内存泄露、内存溢出等情况,今天盘点一下在项目中进行内存泄露分析和GC分析的一些常用、好用的工具。
0x01:JDK自带工具
在处理内存泄露方面JDK本身就自带了大量监控、分析工具,主要有如下一些:
- jps:可查看当前系统运行的所有java进程
- jstat:查看具体某个Java进程的GC情况
- jmap: 查看某个Java进程的堆内存使用情况
- jvisualvm:可视化查看堆内存与metaspace占用情况
- jstack:查看具体某个java进行的线程堆栈情况
0x02:Eclipse Memory Analyzer
官网有如下一段英文介绍:
The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.
Use the Memory Analyzer to analyze productive heap dumps with hundreds of millions of objects, quickly calculate the retained sizes of objects, see who is preventing the Garbage Collector from collecting objects, run a report to automatically extract leak suspects.
大致的意思如下:
Eclipse Memory Analyzer(简称MAT)是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者。
代码语言:javascript复制官网地址:https://www.eclipse.org/mat/
这款工具在分析内存泄露方面非常好用,可以图形化展示通过jmap命令打印出来的内存快照,而且是免费的。
0x03:JProfiler
JProfiler 是一个商用的主要用于检查和跟踪系统(限于Java开发的)的性能的工具。JProfiler可以通过实时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler提供许多与IDE整合和应用服务器整合的插件。JProfiler可视化的让用户可以找到效能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。
代码语言:javascript复制官网地址:https://www.ej-technologies.com/products/jprofiler/overview.html
JProfiler唯一的不好就是需要购买版权;但是功能还是杠杠的。
0x04:Arthas
首先阿里出品必属精品,Arthas当然也非常好用。
Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题。Arthas诊断使用的是命令行交互模式,支持JDK6 ,Linux、Mac、Windows 操作系统,命令还支持使用 tab 键对各种信息的自动补全,诊断起来非常利索。
代码语言:javascript复制代码仓库地址:https://github.com/alibaba/arthas
- 从官网可以知道Arthas有以下一些特征
- 检查是否加载了类,或在哪里加载了类。(对于解决jar文件冲突很有用)
- 反编译一个类以确保代码按预期运行。
- 查看类加载器统计信息,例如,类加载器的数量,每个类加载器加载的类的数量,类加载器的层次结构,可能的类加载器泄漏等。
- 查看方法调用详细信息,例如方法参数,返回对象,引发的异常等。
- 检查指定方法调用的堆栈跟踪。当开发人员想知道所述方法的调用者时,这很有用。
- 跟踪方法调用以查找慢速子调用。
- 监视方法调用统计信息,例如qps,rt,成功率等。
- 监视系统指标,线程状态和cpu使用情况,gc统计信息等。
- 支持命令行交互模式,并启用了自动完成功能。
- 支持telnet和websocket,可通过命令行和浏览器启用本地和远程诊断。
- 支持分析器/火焰图
- 支持JDK 6 。
- 支持Linux / Mac / Windows。
0x05:操作系统命令
无论怎么说,操作系统本身的命令是基础。通过Linux本身的一些命令也是可以对java进行一定程度的检查与检测的。不过根据不同的Linux版本,使用的命令可能存在一些差异,下面以CentOS为例说明:
- free:查看内存占用、剩余情况
- top:实时监控所有进程的内存、CPU、IO等情况
- lsof:该命令的功能很多,其中有一项功能可以查看某个进程打开的文件句柄情况
Linux操作系统的命令非常多,涉及到内存、io、网络、磁盘等情况都可以找到相关命令来监控。具体场景再去查找相关资料进行相关处理。
0x06:GCViewer
GCViewer是一款实用的GC日志分析软件,免费开源使用,不过需要先安装jdk或者java环境才可以使用,因为它本身就是Java语言开发的。软件为GC日志分析人员提供了强有力的功能支持,大大提高分析GC日志的效率。
代码语言:javascript复制官网地址:https://www.tagtraum.com/gcviewer.html