Java基础、中级、高级、架构面试资料

唯品会 vjmap 教程

JAVA herman 5758浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

vjmap 是唯品会开源出来的 vjtools 工具集的一个用来排查 java 内存泄漏的工具。与近日在 github 上开源,本文将详细介绍 vjmap 的相关用法。

概述

分代版的jmap(新生代,存活区,老生代),是排查内存缓慢泄露,老生代增长过快原因的利器。因为jmap -histo PID 打印的是整个Heap的对象信息,而很多时候,我们需要专门查看OldGen对象,以及survivor区Age较大的对象。

vjmap 原始思路来源于R大的tbjmap ,翻新后兼容JDK8,支持对存活区老龄剩余对象的查询,能更直接发现问题。

注意:因为vjmap的原理,只支持CMS和ParallelGC,不支持G1.

使用说明

maven编译后得到zip包,解压后运行。

注意:vjmap在执行过程中,会完全停止应用,必须摘流量执行!!!!

必须与目标JVM使用相同用户运行,如果执行时仍然有权限错误,改用root用户执行。

如果使用了kill -9 vjmap的进程来强行终止vjmap, 目标java进程会被卡住不再工作(用正常的kill vjmap则没有问题),必须执行两次 kill -18 目标进程PID来重新唤醒目标java进程。

常用指令

// 打印整个堆中对象的统计信息,按对象的total size排序:
./vjmap.sh -all PID > /tmp/histo.log

// 打印老年代的对象统计信息,按对象的oldgen size排序,暂时只支持CMS:  
./vjmap.sh -old PID > /tmp/histo-old.log

// 打印Survivor区的对象统计信息,默认age>=3: 
./vjmap.sh -sur PID > /tmp/histo-sur.log

// 打印Survivor区的对象统计信息,age>=10
// 先增大晋升阈值-XX:MaxTenuringThreshold=xx, 通过查询age较高的对象,即必定会逃逸到cms区的对象。
./vjmap.sh -sur:minage=10 PID > /tmp/histo-sur.log

其中PID为目标java进程的进程号。

过滤对象大小,不显示过小的对象:

// 按对象的total size进行过滤,只打印占用超过1K的数据
./vjmap.sh -all:minsize=1024 PID > /tmp/histo.log

// 按对象的oldgen size进行过滤,只打印OldGen占用超过1K的数据
./vjmap.sh -old:minsize=1024 PID > /tmp/histo-old.log

// 按对象的survivor size进行过滤,只打印Survivor占用超过1K的数据
./vjmap.sh -sur:minsize=1024 PID > /tmp/histo-sur.log

按class name排序,配合大小过滤生成用于定时比较的报表:

./vjmap.sh -all:minsize=1024,byname PID > /tmp/histo.log
./vjmap.sh -old:minsize=1024,byname PID > /tmp/histo-old.log
./vjmap.sh -sur:minsize=1024,byname PID > /tmp/histo-sur.log

Survivor区年龄大于N的对象统计

Survivor Object Histogram:

 #num  #count     #bytes #Class description
-----------------------------------------------------------------------------------
   1:      37         1k io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry
   2:       2         64 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
Total: 39/    1k over age 2

Heap traversal took 1.3 seconds.

修改记录

  • 兼容JDK8
  • 新功能:Survivor区 age大于N的对象统计
  • 性能提升:直接访问Survivor或OldGen区,而不是用Heap Visitor回调的方式访问整个Heap
  • 新配置项:按对象的大小进行过滤,不显示过小的对象
  • 新配置项:按对象的名称进行排序,用于生成定时比较的报表
  • 输出改进:报表数字的单位化(k,m,g)与对齐,OldGen报表默认按对象在OldGen的大小排序

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 唯品会 vjmap 教程