jvm的相关命令行指令和问题分析集锦

145 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

背景

  1. 整理并记录jvm常用指令

  2. 整理常见问题及分析过程

过程

  • jvm常用指令
  1. java -X 查询有哪些非标准参数

  2. java -XX:+PrintCommandLineFlags -version 查询使用了哪个垃圾收集器和java版本号

  3. jps 查询有哪些java进程

  4. jinfo pid 查询关于此java进程的一些基础信息

  5. jstat -gc pid 查询关于此进程的垃圾收集情况

  6. jstack pid 查询关于此进程的线程情况

  7. jmap -heap pid 查询关于此进程的堆情况。(堆信息转成文件存储)。不允许在生产环境,直接执行此指令。

  8. jconsole, jvisulvm不允许远程连接生产观测。本地开发或者测试是可以连接的。

  9. arthas开源工具,直接可在生产环境使用。

  • 问题及处理过程

  • 如果在生产环境上,出现了cpu居高不下的情况,如何定位问题?

  1. 把arthas-boot.jar上传到服务器上,启动。这个arthas只是一个工具,一个排查问题的工具而已,并不是说,一开始就与我们的服务同时部署起来,而是出现了问题后,自己通过这个工具进行一系列的排错即可。

  2. 使用的线程池,一定要有一个详细的名称。这样出现了问题,才好排错。

  3. 业务线程, 读业务逻辑,去分析和思考。

  4. jvm的线程(一般是GC线程,比如FGC频繁,或者一次FGC时间长)

  • 如果生产环境出现了死锁情况,如何排查或者说如何定位问题?
  1. 使用arthas工具,关联到此java进程。

  2. arthas thread -b, 得到哪些线程被阻塞住了,寻找代码相关业务逻辑,定位问题,找到原因。

  • 如何在开发或者测试环境,快速查询java实例的个数呢?
  1. jmap -histo pid | head -20
  • 如果在生产环境上出现了OOM,怎么办?

    1. 先解决问题。给多分配一些空间,重启服务。
    2. 在生产环境上,肯定是不能直接使用jmap命令的。因此,最好的方式就是,服务启动的时候,一定要配置一个参数:-XX:+HeapDumpOnOutOfMemeryError
    3. 有了这个堆转储文件,得找到一个合适的工具(jvisulvm)去分析这个文件。定位问题,然后分析代码,然后找到问题的原因,最后解决问题。
    4. 把文件拿到,在windows中,通过jvisulvm工具加载进来,打开即可。
  • 如果在生产环境出现了栈溢出,怎么办?

  1. 先解决问题。给-XSS多分配一点儿,默认是512k, 可以分配1m

  2. 在jvm中,一个方法一个栈帧,方法调用方法太多,就会造成,一个线程下,栈空间无法存放更多的栈帧了,总的来说,还是扩大栈的容量即可。

小结

  • 熟悉jvm常量指令。

  • 熟悉常见问题,及其解决思路,这些都不是理论,而是可以直接动手操作的。练习到熟悉。反复写反复练。