java 进程内存_JAVA进程内存分析

我们经常会碰到JAVA进程的内存问题。比如,堆内设了2G,但JAVA进程总内存却远远超过这个值,4G,6G ... 。那么,我就需要分析到底内存分配到哪里了。

笔者采用Linux top命令和JAVA NMT解决了堆外内存泄漏问题。问题描述如下:

一些应用在不确定的时间点,内存会突增,直到内存耗尽,java进程被os杀死。诊断步骤:

1. 使用 top + 定时器,2分钟一次拍照,并保存到本地文件系统。

2. 使用NMT+定时器,2分钟一次拍照,并保存到本地文件系统。

通过top能定位到是哪个进程内存消耗产生大的波动。NMT能定位Java进程内部的内存消耗。最后,发现java进程内的internal部分内存波动较大。最后通过查看heap dump发现了DirectByteBuf的大量实例未释放,定位到gc root,找到问题。

这里,top和NMT的一些细节信息需要做个笔记:

1. top统计的是实实在在消费的内存。如:top -p 得到下图:RES(常驻内存)是进程真实消耗的内存,预定内存不会统计在内。比如:Java 启动参数设置:-Xms1024M -Xmx1024M, RES不会等于1024M+,而是实际使用的内存。如果Java堆生成对象,top的RES会动态增长。但,GC后,RES不会缩减。

67ac3edcf82b78d6cba2e4681c4f3033.png

2. NMT信息,如下图

java heap部分:reserved=-Xmx设置的值,committed初始值=-Xms设置的值,最终通过创建对象达到-Xmx的值。其他值未找到答案,知道的话告知一声。

f745114ffc656ed5cd9cf6a6ed899b1e.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值