Java heap dump触发和分析(转)
为了分析java应用的内存泄漏,使用thread dump往往解决不了问题。使用jstat【eg:jstat -gcutil pid 1000 5】工具查看运行的java应用的heap size,perm size ,survivor ratio等,当时你无法知道是什么对象把堆填满了。
什么是 Java heap dump
首先需要搞懂什么是java heap,java heap是分配给实例类和数组对象运行数据区,所有java线程在运行期间共享heap中的数据。Java heap dump相当于java应用在运行的时候在某个时间点上打了个快照(snapshot)。
触发 Java heap dump
有以下方法出发heap dump
- 使用$JAVA_HOME/bin/jmap -dump来触发,eg:jmap -dump:format=b,file=/home/longhao/heamdump.out
- 使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,点击 dumpHeap按钮。生成的dump文件在java应用的根目录下面。
- 在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成dump文件。
- 使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。
分析 Java heap dump
1:使用IBM HeapAnalyzer
IBM HeapAnalyzer是一款免费的JVM内存堆的图形分析工具,它可以有效的列举堆的内存使用状况,帮助分析Java内存泄漏的原因。
下载解压后有一个ha413.jar,执行: java -Xmx512m -jar ha413.jar /home/longhao/heapdump.out
2:jhat
jhat(Java Head Analyse Tool )是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言OQL,分析相关的应用后,可以通过http://localhost:7000来访问分析结果。
示例: $JAVA_HOME/bin/jhat -J-Xmx512m /home/longhao/dump.out
3:Eclipse MemoryAnalyzer
Eclipse Memory Analyzer是一个快速并且功能强大的Java heap分析器,能够帮助你查找内存泄漏和减少内存消耗。在File>Acquire Heap Dump>configure>HPROF jmap dump provider设置一下分析应用的JDK,点击相关应用列表来生成heap dump并分析。
在socket,nio中的有些API中,申请的内存是直接想OS要的,在堆中分析内存是查看不到的,可以通过-XX:MaxDirectMemorySize=来设置应用向OS直接申请的最大内存数。
相关文章
- [Java基础] 使用JMAP dump及分析dump文件
- Java中Date与String的相互转换
- java中子类与父类中隐含的this引用的分析
- JAVA学习(一):Java介绍及其平台、开发环境的配置与搭建
- Java实现 蓝桥杯 算法提高VIP Substrings(暴力)
- Java实现 LeetCode 493 翻转对
- java实现第九届蓝桥杯整理玩具
- java实现第五届蓝桥杯锦标赛
- Java实现第九届蓝桥杯螺旋折线
- Java实现 蓝桥杯VIP 算法提高 棋盘多项式
- (Java实现) 洛谷 P1071 潜伏者
- Java需要强制捕获的异常
- java 11 Java Flight Recorder
- macos:安装java 17.0.6(android studio报错:Unable to locate a Java Runtime.)
- Atitit.java expression fsm 表达式词法分析引擎 v2 qaa.docx
- 结合Java和机器学习技术,如何驾驭大数据提升业务效率和竞争力?
- 【java】Java 包(package)
- HBase(2) Java 操作 HBase 教程
- 【华为OD机试 2023】 过滤组合字符串(C++ Java JavaScript Python)
- 【小白的java成长系列】——顶级类Object源代码分析
- JAVA学习第十九课(java程序的异常处理 (二))
- JAVA基金会 (三)反射 反思的深度分析
- Java如何使用重载方法处理异常?