JVM排查定位


源自笔者某次回去等通知的故事

1. jps

列出正在运行的虚拟机进程、及其pid,命令参数有:

-l:输出主类全限定类名

-v:虚拟机进程启动时的JVM参数

jps -l

2. jstat

监视虚拟机各种运行状态,命令参数有:

-gc:监视堆状况

-gcutil:与-gc一致,不同于显示百分比

jstat -gcutil pid 时间间隔 查询次数
jstat -gcutil 11564 250 20
Surviro from Eden Old MeteSpace CSS YGC总次数 YGC总花费时间 FGC总次数 FGC总时间 GCT垃圾回收总时间

3. jinfo

实时产看和调整虚拟机各项参数,参数有:

-flag [ +-name / name=value ] 来运行时修改参数

jinfo pid
jinfo 11564

4. jmap

生成堆转储快照(headdump),或者 设置参数 -XX:+HeadDumpOnOutOfMemoryError参数,溢出时自动生成快照文件,文件中可以获取到:

  • 对象信息:类、成员变量、直接量以及引用值
  • 类信息:类加载器、名称、超类、静态成员
  • Garbage Collections Roots:JVM可达的对象
  • 线程栈以及本地变量:获取快照时的线程栈信息,以及局部变量的详细信息

其参数有:

-dump:生成Java堆转储文件,然后用VisualVM来打开

jmap -dump:format=b,file=filename pid
jmap -dump:format=b,file=C:\Users\Howl\Desktop\2020-6-3-heapdump.hprof 11564

-histo:查看堆中对象详细信息,包括类,实例数量,合计容量

jmap -histo pid
jmap -histo 11564
  • 可以定位哪个类溢出

5. jsatck

生成当前线程存储快照(Threaddump),常用于定于线程长时间停顿

6. 可视化工具

6.1 JConsole

查看各种堆、方法区、线程等信息

内存标签页:相当于jstat命令,可以查看堆和方法区的情况

线程标签页:相当于jstack命令,可以查看各线程停顿情况,可以检测死锁

类标签页:查看总加载类数目以及当前加载的类的数量

VM概要标签页:各种JVM参数

6.2 VisualVM

功能最强大的运行监控和故障处理程序之一,在JConsole的基础上可以生成查看dump文件,还有更多可安装插件的功能

可以生成dump,查看实例占用空间大小

7. 排查总结

7.1 CPU过高

  • top P M X 找到占用高的进程id
    • top -Hp pid 找到占用高的线程nid,转换16进制,(printf '%x\n' pid)
  • jstack pid 来查看线程的详细信息
    • 线程状态(关注WAITING、BLOCKED),是否大量线程等待这个资源-----停顿情况
    • 死锁 (Deadlock),自动检测一下-----停顿情况
    • 然后根据打印的栈信息可定位代码位置-----查看死循环问题

7.2 频繁GC

问题一般是大量对象涌入撑满导致

  • jstat -gcutile pid 查看是否频繁GC,根据次数和时间对比
    • 是否堆年轻代老年代需要调优

7.3 OOM

无非就是内存泄漏,年轻代大量涌入无法清除,进入老年代也无法清除

  • 生成dump快照 或 自动设置的快照-XX:-XX:+HeadDumpOnOutOfMemoryError
  • 用分析工具分析:查看哪个类和实例数过大,本来就定位线程了,只需看该线程的对象信息即可

7.3 死锁

  • 直接JConsole排查死锁
  • jstack 查看wating on Condition、等条件状态

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 栈与队列

    栈(stack)是一种只能在一端进行插入或删除操作的线性表。特点是先进后出(把它想象成羽毛球筒,最先进去的羽毛球最后才能拿出来)

    晚上没宵夜
  • Tomcat的设置

    因为logging默认使用utf-8,而我们的windows的日志输出控制台使用系统的GB2312,所以去conf中修改logging的配置编码为GB2312即...

    晚上没宵夜
  • Holder类

    这个类在 javax.xml.ws.Holder 中,笔者在很多地方都遇到过XXXHoler类,只知道包装了我们需要的值,但不知道为什么要包装多一层。其实Hol...

    晚上没宵夜
  • Python学习笔记(七)——进程和线程

    很多时候,子进程并不是自身,而是一个外部进程。我们创建了子进程后,还需要控制子进程的输入和输出。

    后端技术漫谈
  • PostgreSQL中的八级锁

    锁是实现数据库并发控制必不可少的功能,PostgreSQL数据库通过其特有的多版本属性实现了MVCC,实现了读不阻塞写,写不阻塞读。PostgreSQL中表锁有...

    数据库架构之美
  • vue-loader&vue-template-compiler详解

    在 vue 工程中,安装依赖时,需要 vue 和 vue-template-compiler 版本必须保持一致,否则会报错。

    奋飛
  • Linux下如何查看自己的服务器有没有无线网卡

    还是实验室那台破服务器,连不上网。有没有界面,所以想着如何用一些命令来链接上 热点。 当然,在linux下链接wifi没有win下那么一点就好了! ...

    Gxjun
  • AkShare-股票数据-流通股东

    目标地址: https://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CirculateStockHolder...

    AkShare
  • Webpack创建、运行vue.js项目及其目录结构详解

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄
  • 【干货】适合NLP初学者的8个免费资源分享

    微软全球执行副总裁沈向洋博士曾表示“懂语言者得天下,人工智能对人类影响最为深刻的就是自然语言方面。”现在很多研究人员都在进入自然语言领域,希望可以解决“让机器理...

    用户2769421

扫码关注云+社区

领取腾讯云代金券