JVM问题查找

21 篇文章 0 订阅

问题已经解决,把常用命令在这里记一下,省得每次去查。

1、top

使用top查找到负载较高的进程,第一个就是。

如图,查找到的PID为:31749

小技巧:打开top后,键入小写c出现应用名,键入大写P按CPU排序,键入大写M按内存排序

2、jstack 31749 > stack.txt

生成Java线程栈信息到文件stack.txt,其实可以在线看的,但是为了便于分析还是下载到本地(命令:sz -y stack.txt)

3、top -H -p 31749

查看31749进程下占用Cpu较高的线程

可以查到线程ID为31789、31816、31840、31859

我们把从十进制转为十六进制,任取一个网站(如:http://tool.oschina.net/hexconvert/)

对应的十六进制为:7c2d、7c48、7c60、7c73

4、打开之前保存的stack.txt文件,搜索上述四个线程ID,查看可能的问题

5、jmap -heap 31749

因为之前查找到的问题是GC的问题,所以还查了堆的一些情况

堆的情况一目了然,熟悉JVM的同学看到这里估计一种见到亲人的感觉

6、jmap -dump:format=b,file=heap.bin 31749

下载堆的快照到文件heap.bin,使用sz -y heap.bin保存到本地

7、在本地执行(需安装Java并配置环境变量) jhat heap.bin

执行成功后,会告诉你一个端口,这里是7000,即访问地址:localhost:7000

jhat还可以打开两个转储文件做对比:jhat -baseline heap1.bin heap2.bin 会显示两个堆之间的差值

8、访问localhost:7000

有两个分析较为重要,在页面最下:

1. Instance Counts for All Classes (excluding platform)

2. Heap Histogram

 

9、jmap -histo:live 31749 > histo.txt

这也是个很好用的命令,可以直接查看对象个数和大小

10、jstat -gc 31749

主要注意一下GC次数是否频繁

YGC :从应用程序启动到采样时年轻代中gc次数

FGC :从应用程序启动到采样时old代(全gc)gc次数

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值