JVM内存溢出常用排查命令

createh54个月前 (01-10)技术教程52

最近,有一个项目在不超过的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方法和参数传递

第五章:Java方法和参数传递在Java编程中,方法是一种重要的概念,它能够将一段代码封装成一个可重复使用的单元。本章将详细介绍Java方法的定义和调用,方法的重载和重写,以及Java中的参数传递方式...

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

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

探秘Clojure:编程世界的“隐藏高手”

为什么你该认识 Clojure在编程语言的浩瀚星空中,Clojure 宛如一颗遗世独立的小众星辰,散发着独特而迷人的光芒。尽管它的知名度远不及 Java、Python 等主流语言,但在专业开发者的圈子...

开发环境搭建-Java开发环境安装搭建与配置JDK

大家好啊,我是测评君,欢迎来到web测评。什么是JDKJDK是Java Development Kit的首字母缩写,意为Java开发工具包,是整个Java的核心。其不提供具体的开发软件,仅向程序员提供...

Java9模块化出来这么久了,你了解过没(入门使用指南)

1.概述Java9在包之上引入了一个新的抽象级别,正式名称为 Java 平台模块系统(JavaPlatform Module System,JPMS) ,简称模块。接下来,这篇文章将会介绍模块化的基本...

一台机器下,多个Java版本的粗放与精细管理

前言在软件开发过程中,经常会遇到“古老”的项目,这些项目的JDK还处于Java 6、Java 7甚至更早的版本。同时,在学习新的JDK特性时,往往又需要安装最新版本的JDK。鉴于这些情况,我们就需要在...