如何排查JVM内存占用过高

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等都可以的

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值