文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

强大的JVM监控工具!

2024-12-03 01:48

关注
名称 主要作用
jps 查看正在运行的Java进程
jstack 打印线程快照
jmap 导出堆内存映像文件
jstat 查看jvm统计信息
jinfo 实时查看和修改jvm配置参数
jhat 用于分析heapdump文件

jps:查看正在运行的Java进程

jps可以列出正在运行的Java进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及进程id

「如果想看一个命令的后面加 -help参数即可」

  1. [root@VM-0-14-centos ~]# jps -help 
  2. usage: jps [-help] 
  3.        jps [-q] [-mlvV] [
  4.  
  5. Definitions: 
  6.     :      [:

「可以看到可以监控远程服务,但是基于安全考虑,一般不使用」

常见的选项如下

选项 作用
-q 只输出进程id
-m 输出传递给主类main函数的参数
-l 输出主类全类名,如果进程执行的是Jar包,输出jar包名字
-v 程序启动时指定的jvm参数
  1. cis@mt002:~$ jps 
  2. 70208 KmpService 
  3. 183525 LinkAnalysisServer 
  4. 25160 MipSerachServer 
  1. cis@mt002:~$ jps -l 
  2. 70208 com.st.kmp.main.KmpService 
  3. 183525 com.st.cis.main.LinkAnalysisServer 
  4. 25160 com.st.cis.main.MipSerachServer 

jstack:打印线程快照

「查看某个Java进程中所有线程的状态。一般用来定位线程出现长时间停顿的原因,如发生死循环,死锁,请求外部资源长时间等待等!」

  1. public class DeadLockDemo { 
  2.  
  3.     private static Object lockA = new Object(); 
  4.     private static Object lockB = new Object(); 
  5.  
  6.  
  7.     public static void main(String[] args) { 
  8.  
  9.         Thread threadA = new Thread(() -> { 
  10.             synchronized (lockA) { 
  11.                 try { 
  12.                     TimeUnit.SECONDS.sleep(1); 
  13.                 } catch (InterruptedException e) { 
  14.                     e.printStackTrace(); 
  15.                 } 
  16.                 System.out.println("get lockA"); 
  17.                 synchronized (lockB) { 
  18.                     System.out.println("threadA run finish"); 
  19.                 } 
  20.             } 
  21.         }); 
  22.  
  23.         Thread threadB = new Thread(() -> { 
  24.             synchronized (lockB) { 
  25.                 try { 
  26.                     TimeUnit.SECONDS.sleep(1); 
  27.                 } catch (InterruptedException e) { 
  28.                     e.printStackTrace(); 
  29.                 } 
  30.                 System.out.println("get lockB"); 
  31.                 synchronized (lockA) { 
  32.                     System.out.println("threadB run finish"); 
  33.                 } 
  34.             } 
  35.         }); 
  36.  
  37.         threadA.setName("myThreadA"); 
  38.         threadB.setName("myThreadB"); 
  39.         threadA.start(); 
  40.         threadB.start(); 
  41.     } 

「我写了一个死锁的例子,启动后执行jps找到进程id为19457」

  1. peng@pengdeMacBook-Pro ~ % jps 
  2. 19457 DeadLockDemo 
  3. 19458 Launcher 
  4. 2658  
  5. 19459 Jps 

接着执行如下命令,列出了这个进程每个线程的执行状态

  1. jstack 19457 

「从图中可以看到有很多线程,GC线程,myThreadA,myThreadB等,其中myThreadA和myThreadB的线程状态为BLOCKED,并且在最后提示出了死锁发生的位置」

jmap:导出堆内存映像文件

「jmap主要用来用来导出堆内存映像文件,看是否发生内存泄露等。」

生产环境我们一般会配置如下参数,让虚拟机在OOM异常出现之后自动生成dump文件

  1. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/peng 

执行如下命令即可手动获得dump文件

  1. jmap -dump:file=文件名.dump 进程id 

「分析堆内存的工具有很多,如Java VisualVM,jhat等。但个人觉得最好用的就是Eclipse Memory Analyzer,没有之一」

jstat:查看jvm统计信息

「jstat可以显示本地或者远程虚拟机进程中的类装载、 内存、 垃圾收集、 JIT编译等运行数据」

用jstat查看一下类装载的信息。我个人很少使用这个命令,命令行看垃圾收集信息真不如看图形界面方便,就不多做介绍了。

  1. [root@VM-0-14-centos ~]# jstat -class 19402 
  2. Loaded  Bytes  Unloaded  Bytes     Time    
  3.  10229 19679.1       52    76.0       5.33 

含义如下

Loaded 解释
Loaded 加载类的个数
Bytes 加载类的字节数
Unloaded 卸载类的个数
Bytes 卸载类的字节数
Time 花费的时间

jinfo:实时查看和修改jvm配置参数

jinfo的作用是实时地查看和修改虚拟机各项参数。

「使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表」,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 1.6或以上版本的话,使用java -XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)

「jinfo flags pid在高版本才能正常使用,我在jdk1.8这个版本不能正常使用」

应用程序设置如下参数

  1. -Xmx10m -Xms10m 

查看最大堆内存和是否打印GC日志,可以看到不打印GC日志 接着设置打印GC日志,再次查看,打印GC日志

  1. peng@pengdeMacBook-Pro ~ % jinfo -flag MaxHeapSize 20253          
  2. -XX:MaxHeapSize=10485760 
  3. peng@pengdeMacBook-Pro ~ % jinfo -flag PrintGCDetails 20253 
  4. -XX:-PrintGCDetails 
  5. peng@pengdeMacBook-Pro ~ % jinfo -flag +PrintGCDetails 20253 
  6. peng@pengdeMacBook-Pro ~ % jinfo -flag PrintGCDetails 20253  
  7. -XX:+PrintGCDetails 

「Xmx是MaxHeapSize的别名」

本文转载自微信公众号「Java识堂」,可以通过以下二维码关注。转载本文请联系Java识堂公众号。

 

来源:Java识堂 内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯