如何使⽤sz命令下载较⼤⽂件到本地
今天排查⽣产机器内存使⽤率持续升⾼的问题时,准备使⽤jmap dump命令⽣成堆内存快照⽂件,然后下载到本地使⽤⼯具分析,查看到底是哪块代码导致的对象持续增多并且⽆法回收,我⼤概描述下问题:因为机器的内存使⽤率持续升⾼,导致java服务时隔⼀段时间⼜被重新启动。这篇⽂章不会详细讲解如何分析这个问题,主要是讲讲我在使⽤jmap dump遇到的⼀个问题:在⽣产机器上⽣成的dump快照⽂件⽐较⼤(七⼋百M),使⽤sz命令下载的时候会失败。我也会描述我在整个操作过程中遇到的⼀个个的⼩问题。
⼀、简单介绍我的操作过程
这块主要是讲下我的操作过程,如果只看问题的解决⽅案可以直接跳到后⾯,如果有需要的也可以⼀起学习⼀下相关操作命令。这⾥我假设⼤家都知道如何登陆⽣产机、有⼀定排查机器问题的基础,知道jmap以及相关的命令,所以不做太多额外的内容讲解。
①登陆到机器,准备使⽤如下命令查看是哪个服务进程内存使⽤率⽐较⾼:
top -c  // -c 参数显⽰进程对应的服务名,⾮常⽅便知道是哪个应⽤
②根据进程号,使⽤jmap查看进程对应的java服务的对象⽣成分布情况(⾮docker部署的服务)
发现出现这个错误,最直接的原因是识别不到jdk环境,所以⽆法使⽤jmap命令,但是我们使⽤java -version还是可以看到⽣产机器是有jdk环境的,这时我们就需要切换到jdk的bin⽬录下才可以使⽤相应的java命令,所以我们就得到机器安装的jdk⽬录,以及进⼊到对应的⽬录下:
根据上⾯⼏个命令,就可以顺利进⼊到bin⽬录,可以看到java相关命令都在这⾥⾯,其中就有我们要⽤的jmap命令,现在我们可以再使⽤上⾯的jmap命令查看对象分布情况:
jmap命令有很多参数,我这⽤的是-histo:查看堆中对象数量和⼤⼩,⼤家可以⽹上学习其他的参数,其中 head -20 意思是显⽰排在最前的20条数据,因为jmap打印出来的信息⾮常多,后⾯占内存少的对象信息也没必要打印出来占位置。另外注意这⾥进⼊到bin⽬录使⽤的命令是 ./jmap ⽽不是直接的jmap,直接使⽤jmap还是不⾏。
③使⽤jmap dump⽣成对应的快照⽂件
./jmap -dump:format=b,file=/tmp/heapDump20210219.hpof 28724
注意:1.我这⾥准备使⽤MAT⼯具进⾏分析,所以⽣成的快照⽂件格式后缀需要是.hpof,不然MAT⼯具⽆法打开,如果你准备使⽤jdk⾃带的jvisualvm的话则⽣成.dump⽂件,这⾥不详细说
2.我这⾥⽣成的⽂件是/tmp⽬录下,因为存在当前登录⽤户在当前⽬录⽆权限创建⽂件等问题,所以放在了/tmp⽬录下。
④我们进⼊到/tmp⽬录查看⽣成的⽂件
我⽤的是ls -lh 命令,这个命令可以直观的看到⽂件的⼤⼩,并且单位会显⽰为K、M和G,⾮常直观,如果使⽤的是 ll 命令则单位是字节,是⼀长串的数字。
⑤最开始我是直接使⽤sz heapDump20210219.hpof 来下载到本地,但是因为⽂件太⼤,会出现莫名其妙问题,下载⼀会后 iTerm2 页⾯会疯狂刷乱码,⼀直刷。然后我将⽂件压缩,再下载
// 压缩⽂件命令
tar zcvf   heapDump20210219.hpof
可以看到压缩后,⽂件从530M 压缩到 75M
⑥然后再使⽤ sz 进⾏下载,还是会有问题,⽂件还是⼤了,问题现象就是:可以正常显⽰下载中,但是呢下着下着 命令⾏显⽰成功了,但是本地的⽂件消失了,所以还是下载不了,⽂件太⼤
⼆、⽂件太⼤,⽆法使⽤sz命令下载解决办法
jdk怎么使用
核⼼思想:拆!既然⽂件太⼤了,那就把⽂件拆成⼏个⼩⽂件,再⼀个⼀个的下载下来!
①拆成⼩⽂件:我这⾥每个⼩⽂件拆成10M
cat | split -b 10M -
可以看到linux⾃动根据我们给的前缀,拼成完整的拆分后的⽂件名:*.gz.aa、*.gz.ab, *.
②将所有拆分后的⼩⽂件下载到本地
sz a*
这⾥不⽤⼀个⼀个的使⽤sz,直接⽤上⾯命令就可以了,可以看到我指定的本地⽬录就有对应的⼩⽂件了
③合并本地的多个⼩⽂件,这时重开⼀个终端进⼊到本地对应⽬录
然后我们只需要解压,使⽤MAT⼯具打开就可以进⾏使⽤和分析了!到这⾥本篇⽂章就结束啦,希望对你有所帮助!感谢阅读~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。