当前位置: 首页 > news >正文

jvm内存泄漏的排查tips总结

以下是对这篇原文的总结,部分内容不够详细,请参考原文地址:https://juejin.cn/post/7255634554987020343

内存问题排查方法论

1. 问题定位流程

  • 确定进程:使用 ps aux --sort=-%mem 找出内存占用最高的进程
  • 分层排查:按照堆内 → 堆外的顺序逐步分析
  • 量化分析:通过计算得出具体的内存占用分布

2. 堆内存分析技巧

# 查看堆内存详情
jcmd <pid> GC.heap_info# 查看真实物理内存占用
pmap -X <pid>

image

3. 堆外内存分析技巧

# 使用Arthas快速查看各内存区域
memory# 计算公式
堆外物理内存 = 总占用物理内存 - heap占用的物理内存

jcmd GC.heap_info
image
heap:启动参数里指定了Xmx是4G,从命令结果也可以看出约等于 new generation 1.8G + old geration 2G。
Metaspace: committed 约0.1G左右
通过pmap命令可以看到最真实的JVM heap的物理内存的占有量,因为Heap本质是一个内存池,池子的总大小4G,但是实际物理内存一般达不到4G,而Heap的used也只是池子中使用部分的内存。所以还是要通过操作系统的pmap来查询:
image
如上图,JVM heap是4G的虚拟内存,启动物理内存约占用3144764K即约3G,50M左右置换到了swap空间。
所以heap实际占用约3G。

4. JNI Memory泄漏排查

方向一:gperftools工具分析,查堆栈

# 安装工具
yum install gperftools gperftools-devel graphviz ghostscript# 设置环境变量
export LD_PRELOAD=/usr/lib64/libtcmalloc.so
export HEAPPROFILE=/home/admin/gperftools/heap/hprof# 启动app。。。
# kill app,再运行app_start.sh# 生成对比报告
pprof --pdf --base=heap_before.heap java heap_after.heap > mem-diff.pdf

例如:最大头的是Java_java_util_zip_Inflater_inflateBytes函数在申请堆外内存,共680M,占比680M
image

方向二:内存块分析,看内存块内容

# 查看内存块分布
(pmap -X <pid> | head -2; pmap -X <pid> | awk 'NR>2' | sort -nr -k6) > pmap.log# dump内存块内容
gdb --batch --pid <pid> --ex 'dump memory 103.dump 0x7f8a78000000 0x7f8a7c000000'# 查看内存数据
strings 103.dump

5. 调用栈定位技巧

# 持续打印线程堆栈
while true; do jstack <pid> | grep -A 20 -B 5 "inflateBytes"; sleep 1; done# 或使用arthas拦截方法调用
stack java.util.zip.Inflater inflate

6. GC验证方法

# 手动触发FullGC并查看对象分布
jmap -histo:live <pid>

7. ptmalloc2内存碎片处理

手动释放内存

# 调用malloc_trim释放碎片内存
gdb --batch --pid <pid> --ex 'call malloc_trim()'

优化参数

export MALLOC_ARENA_MAX=8
export MALLOC_MMAP_THRESHOLD_=131072 
export MALLOC_TRIM_THRESHOLD_=131072 
export MALLOC_TOP_PAD_=131072 
export MALLOC_MMAP_MAX_=65536

8. 解决方案选择

推荐方案:替换内存分配器

# 使用jemalloc或tcmalloc
export LD_PRELOAD=/usr/lib64/libjemalloc.so
# 或
export LD_PRELOAD=/usr/lib64/libtcmalloc.so

业务层面优化

  • 修改Kafka压缩算法:gzip → Snappy/LZ4
  • 避免使用JVM的gzip相关JNI调用
  • 其他

9. 关键排查命令总结

ps aux --sort=-%mem          # 找出内存大户进程
jcmd <pid> GC.heap_info      # 查看堆内存
pmap -X <pid>                # 查看真实内存分布  
jstack <pid>                 # 查看线程堆栈
jmap -histo:live <pid>       # 触发GC并查看对象
gdb --batch --pid <pid> --ex 'call malloc_trim()'  # 释放碎片内存

10. 注意事项

  • malloc_trim() 有极小概率导致JVM Crash,使用需谨慎
  • 使用gperftools时,tcmalloc会间接解决问题,影响问题复现
  • 64M内存块是ptmalloc2内存碎片的典型特征
  • 不同内存分配器适用场景不同:小内存高并发用TCMalloc,通用场景用ptmalloc2
http://www.sczhlp.com/news/109775/

相关文章:

  • 新乡微信网站建设wordpress模板带会员
  • 查询网站备案进度查询口碑好的网站推广价格
  • ...东莞网站公司黑龙江牡安建设有限公司网站
  • 建立网站怎么申请网站备案官网
  • 网站标题关键词怎么做wordpress导出excel
  • 网站优化 前端怎么做ui交互设计做什么
  • 成都网站建设公司电话暴雪中国回应与网易停止合作
  • 餐饮公司做网站的好处东莞常平地图全图高清版
  • 查询网站空间宽带哪家好
  • 做网站的工作怎么样中国建筑教育网官网证书查询
  • IPA
  • Chromium历史版本下载方式
  • 【ACM出版】第三届物联网与云计算技术国际学术会议 (IoTCCT 2025)
  • 2025年最全 Wiki 管理工具测评:ONES、Confluence、Notion......哪个更适合你?
  • 杭州定制网站网片网格
  • 企业网站建设不要空间可以吗wordpress评论开启
  • 前端做网站步骤不同网站相似的页面百度收录吗
  • 个人网站做音乐网要备文化酒店网站建设的需求分析报告
  • 响应式网站例子怎么找个人搭建网站
  • 鼠你爱称重
  • 如何做网站收录网站如何从行为数据进行优化
  • 北京网站开发公司网页制作的优势和劣势
  • html静态网站模板郑州经济技术开发区建设局
  • 老虎淘客系统可以做网站吗网站规划建设与管理维护课后答案6
  • 企业建站系统还有没有前景可言国外永久免费服务器
  • 门户网站 备案衡水网站设计公司哪家专业
  • 详细介绍:用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径
  • PlorarD(WEB中等)
  • 神经网络稀疏化设计构架方式和原理深度解析
  • 泉州做网站设计公司中国优秀网站设计