JVM内存溢出常用排查命令

最近,有一个项目在不超过的12小时内,一定会内存溢出(java.lang.OutOfMemoryError:Java heap space)。由于当时比较忙,没有时间去具体分析,所以暂时只是加大了JVM的参数,最小和最大堆内存都设置成1024m(-Xms1024m -Xmx1024m),可是,效果并不好,同样坚持不到一天,又是内存溢出。所以可以判断,肯定是代码写的有问题,哪里的对象没有释放。

jmap:Java内存映像工具

jmap(Memory Map for Java)命令可以生成堆转储快照,也可以显示Java堆详细信息。下面列举两个常用的命令:

1.jmap -dump:live,format=b,file=文件名.hprof [pid]
解释:此命令用于生成堆转储快照

live说明dump出存活的对象

[pid]是java进程id

2.jmap -heap [pid]

解释:此命令显示Java堆详细信息,如使用哪种回收器、参数配置、分代情况等。


jstack:Java堆栈跟踪工具

jstack( Stack Trace for Java) 命令可以生成虚拟机当前时刻的线程快照 。

1.jstack -l [pid] >> 文件名.txt
解释:将线程转储到指定的文件。此文件包含虚拟机内每一条线程正在执行的方法,可以查看是否发生死锁,死循环等问题。

jstat: 虚拟机统计信息监视工具

jstat( JVM Statistics Monitoring Tool) 可以监视虚拟机各种运行状态信息的命令行工具。
1.jstat -gcutil [pid]
解释:监视Java 堆的情况,包括Eden区、2个Survior区、老年代、永久代等已使用空间占总空间的百分比和垃圾收集时间合计


上图解释: 当前java程序的新生代Eden区(E, 表示Eden) 使用了87.14%的空间, 2个Survivor区(S0、 S1, 表示Survivor0、 Survivor1),其中Survivor1使用了75.00%的空间, 老年代(O, 表示Old) 和永久代(P, 表示 Permanent) 则分别使用了53.47%和38.73%的空间。 程序运行以来共发生Minor GC(YGC, 表示Young GC) 727981次, 总耗时6817.293秒; 发生Full GC(FGC, 表示Full GC)1316次, 总耗时(FGCT, 表示Full GC
Time) 为173.784秒; 所有GC总耗时(GCT, 表示GC Time) 为6991.077秒。

总结

通过以上命令,很好的帮我定位到了问题所在,当然堆转储后的文件为二进制文件,还需要通过其他工具进行分析查看,这里使用的是JProfile。

希望以上内容可以对你有所帮助,喜欢的话,点个赞支持一下!

相关文章

「Java后端」开发环境搭建指南

1. Java1.1 Java安装及配置统一使用Oracle Java,版本为1.8,安装完成后配置环境变量JAVA_HOME及PATH。在命令行执行java -version应显示正确版本号。2....

第十五章:Java测试和调试(完结)

在软件开发的过程中,测试和调试是不可或缺的环节。测试是用于验证程序的正确性和稳定性,而调试则是用于排查和修复程序中的错误。本章将介绍Java中的测试和调试相关的概念、方法、工具和技巧。15.1 Jav...

JVM常用指令

目录:一.引言二.基础故障处理工具2.1 概述2.2. jps:虚拟机进程状况工具2.3. jstat:虚拟机统计信息监视工具2.3. jinfo:java配置信息工具2.5. jmap:Java...

Java手写数据库(第一章)

第一章 准备知识(一) 实现的步骤定义语法文件,我们使用JavaCC定义语法文件(sql.jj)描述Sql语句的词法和语法规则。构建词法分析器与语法分析器,使用JavaCC的命令行工具javacc将S...

CI&CD落地实践9-Sonar Scanner使用配置&SonarQube项目命令行接入

前言在前面一篇《代码质量扫描工具SonarQube原理及环境搭建》中,我们介绍了Sonarqube的架构组成、工作原理以及环境搭建相关操作。本篇将会重点介绍:Sonar Scanner的使用配置;利用...