1、当程序没有内存溢出OOM(out of memory)时

注意:jmap需要依赖jdk的devel包
查询class内存占用命令:

# jmap  -histo  pid  展示class类的堆信息

先用top命令查询程序的pid

# jmap  -histo   878193

在这里插入图片描述

可以看到该项目内存的占用情况,就可以分析出是哪里的问题了

注意:这里的[B 和 [C的表示的是数组,[[B 是byte的二维数组

[Z = boolean
[B = byte
[S = short
[I = int
[J = long
[F = float
[D = double
[C = char
[L = any non-primitives(Object)

jmap其他命令:

# jmap  -heap   pid  查询pid的整体堆信息
# jmap  -histo:live  pid>a.log  查询heap中所有生存的对象堆信息,并保存到文件中
  注意: 这个命令执行,JVM会先触发gc,然后再统计信息。
# jmap  -dump:live,format=b,file=a.log pid   内存信息dump到a.log文件中
  注意: jmap -dump 会将整个heap导出,如果heap很大的话,会比较耗时,且会暂停应用,慎用

2、当程序已经访问不了时,需要导出dump日志是要工具分析

# java -XX:+PrintFlagsFinal -version

通过这个命令看jdk是否开启开启堆内存溢出时,自动导出dump文件

HeapDumpOnOutOfMemoryError     堆内存溢出时自动导出开关,默认false
HeapDumpPath                   堆内存溢出时dump文件导出路径

在这里插入图片描述
开启方法:
1、配置方法
在JAVA_OPTIONS变量中增加

-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=${目录}。
例如:export JAVA_OPTS="-Xms2048M -Xmx2048M -Xmn682M -XX:MaxPermSize=96M"

2、参数说明
(1)-XX:+HeapDumpOnOutOfMemoryError参数表示当JVM发生OOM时,自动生成DUMP文件。
(2)-XX:HeapDumpPath={目录} 参数表示生成DUMP文件的路径,
也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。
如果不指定文件名,默认为:java_pid_date_time_heapDump.hprof。

查看dump文件工具
MAT、visualVM等都可以的

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐