如何排查JVM内存占用过高
1、当程序没有内存溢出OOM(out of memory)时注意:jmap需要依赖jdk的devel包查询命令:# jmap-histopid先用top命令查询程序的pid# top找到pid后# jmap-histo878193
·
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等都可以的
更多推荐
已为社区贡献2条内容
所有评论(0)