首页 > 编程语言 >Java虚拟机之JVM工具监控调优

Java虚拟机之JVM工具监控调优

时间:2023-04-23 10:01:24浏览次数:49  
标签:输出 Java dump 虚拟机 GC JVM 线程

我是攻城师(woshigcs)

前几篇我 们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当 JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacore文 件),堆转储快照(heapdump/hprof文件),熟练掌握这些工具,可以帮我们更好更快弄清或解决一些难易解决的复杂问题。

下面看下SUN JDK自带的几款故障定位工具:

序号

名称

描述

1

jps

JVM Process Status Tool ,显示指定系统内所有的HotSpot虚拟机进程

2

jstat

用于收集hotspot虚拟机各方面的运行数据

3

jinfo

显示虚拟机配置信息

4

jmap

生成虚拟机的内存转储快照

5

jhat

分析heap文件,它会建立一个http/html服务,让用户可以通过浏览器查看分析结果

6

jstack

显示虚拟机的线程快照






1,jps命令几个参数如下:
-q,只输出LVMID省略主类的名称
-m,输出虚拟机进程启动时,传递给主类的main函数的参数
-l,输出主类的全名,如果进程执行的是jar包,输出jar路径
-v,输出虚拟机启动时的JVM参数

2,jstat,虚拟机统计信息监视工具
命令格式,jstat vmid  interval count,如果是远程机器,可以加上机器名和IP地址进行访问。

一个示例: jstat -gc 2764 250 20
选项option代表用户需要查询的虚拟机的信息,主要分为3类:类装载、垃圾回收和运行期的编译情况,具体如下表所示:

Option Function
-class 监视类的装载、卸载数量以及类的装载总空间和耗费时间等
-gc 监视Java堆,包含eden、2个survivor区、old区和永久带区域的容量、已用空间、GC时间合计等信息
-gccapcity 监视内容与-gc相同,但输出主要关注Java区域用到的最大和最小空间
-gcutil 监视内容与-gc相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil输出信息相同,额外输出导致上次GC产生的原因
-gcnew 监控新生代的GC情况
-gcnewcapacity 与-gcnew监控信息相同,输出主要关注使用到的最大和最小空间
-gcold 监控老生代的GC情况
-gcoldcapacity 与-gcold监控信息相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity 输出永久带用到的最大和最小空间
-compiler 输出JIT编译器编译过的方法、耗时信息
-printcompilation 输出已经被JIT编译的方法




另外,使用jstat -gcutil 2764,比较常用的监控命令:



Java虚拟机之JVM工具监控调优_ci



  1. [search@fsedump00yw ~]$ jstat -gcutil 7829
  2.   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT     
  3. 0.02   0.00 100.00  96.31  99.94   6504   53.595     9   12.097   65.692
  4. [search@fsedump00yw ~]$ jstat -gcutil 7829
  5.   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT     
  6. 0.00   0.09   6.05  96.31  99.94   6505   53.598     9   12.097   65.696
  7. [search@fsedump00yw




参数介绍:
E代表Eden,新生代区,两个survivor区,S0和S1,,老年代使用O来表示,永久带使用P表示,YGC(Minor GC)  FULL FGC, FGCT代表FUCC GC耗时,GCT代表总的GC时间。

3,jinfo:实时查看虚拟机调整的各项参数
用法: jinfo option pid
4,jmap,JAVA内存影像工具

用法:jmap [option ] vmid
Option的信息如下表所示

Option Function
-dump 生成对应的dump信息,用法为-dump:[live,]format=b,file={fileName}
-finalizerinfo 显示在F-Queue中等待的Finalizer方法的对象(只在linux下生效)
-heap 显示堆的详细信息、垃圾回收器信息、参数配置、分代详情等
-histo 显示堆栈中的对象的统计信息,包含类、实例数量和合计容量
-permstat 以ClassLoder为统计口径显示永久带的内存状态
-F 当虚拟机对-dump无响应时可使用这个选项强制生成dump快照
示例:jmap -dump:format=b,file=heap.dump 20445


5,jhat ,虚拟机堆转储快照分析工具
hat是用来分析dump文件的一个微型的HTTP/HTML服务器,它能将生成的dump文件生成在线的HTML文件,让我们可以通过浏览器进 行查阅,然而实际中我们很少使用这个工具,因为一般服务器上设置的堆、栈内存都比较大,生成的dump也比较大,直接用jhat容易造成内存溢出,而是我 们大部分会将对应的文件拷贝下来,通过其他可视化的工具进行分析。启用法如下:

jhat {dump_file}


6,jstack JAVA堆栈跟踪工具:
stack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主 要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。通过jstack我们就可以知道哪些进程在后台做 些什么?在等待什么资源等!其运行格式如下:

jstack [option] vmid

相关的option和function如下表所示

Option Function
-F 当正常输出的请求不响应时强制输出线程堆栈
-l 除堆栈信息外,显示关于锁的附加信息
-m 显示native方法的堆栈信息
示例:jstack -l 20445



上面说的都是基于命令行的的JVM指令的一些分析,下面看一下可视化的强大的工具.

1,jconsole,
启动命令:cmd里输入jconsole(配置好JDK环境变量的前提下)
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动,我们可以直接在命令行cmd里面启动,它主要监控内存,类,线程和VM信息,界面如下:



Java虚拟机之JVM工具监控调优_ci_02



Java虚拟机之JVM工具监控调优_JVM_03





2,jvisualvm工具,
在cmd里输入jvisualvm命令启动。
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。
截图如下:


Java虚拟机之JVM工具监控调优_ci_04

标签:输出,Java,dump,虚拟机,GC,JVM,线程
From: https://blog.51cto.com/u_6186189/6216308

相关文章

  • 虚拟机装的系统连不上网怎么办?
    虚拟机是一些用户经常使用的软件,使用了虚拟机之后您就可以在自己的电脑中随意安装不同类型的系统,然后使用了。使用虚拟机就相当于在使用不同系统的电脑,当然也需要联网,所以安装了虚拟机中的系统之后还需要手动设置来联网。1、在本地电脑(不是虚拟机)上按下Win+R打开运行,输入services......
  • Java_final 和 构造代码块
    书上的笔记转移:【REVIEW】:final除了不被重写、不被修改、不被继承、值不可变等等。。。还有以下几个特性: 1.如果成员变量的final修饰未进行赋值,那么是可以在构造方法和构造代码块进行赋值的,如果赋值成功,那么后面都不可能在进行赋值了。 ---2. 静态代码块我知道,就是只执......
  • Java泛型
    Java泛型概念Java泛型是一种在编译时进行类型检查和类型推断的机制,它可以让我们编写更加通用、可重用的代码,提高了代码的可读性和可维护性,同时保证了类型安全。Java泛型的核心思想是类型参数化,即在类、接口或方法的定义中使用类型参数来代替具体的类型,这些类型参数在实例化时被具体......
  • Java 编程问题:四、类型推断
    本章包括21个涉及JEP286或Java局部变量类型推断(LVTI)的问题,也称为var类型。这些问题经过精心设计,以揭示最佳实践和使用var时所涉及的常见错误。到本章结束时,您将了解到将var推向生产所需的所有知识。问题使用以下问题来测试您的类型推断编程能力。我强烈建议您在使用解决方案......
  • java 优雅的记录程序运行时长
    importcn.hutool.core.date.StopWatch;importcn.hutool.core.thread.ThreadUtil;StopWatchtest=newStopWatch("test");test.start("task1");ThreadUtil.sleep(1000);test.stop();test.start("task2");ThreadUtil.sleep(3000);......
  • Java 编程问题:一、字符串、数字和数学
    本章包括39个涉及字符串、数字和数学运算的问题。我们将从研究字符串的一系列经典问题开始,例如计算重复项、反转字符串和删除空格。然后,我们将研究专门用于数字和数学运算的问题,例如两个大数求和和和运算溢出,比较两个无符号数,以及计算除法和模的下限。每个问题都要经过几个解决方......
  • JavaTPoint 数据科学和人工智能中文教程【翻译完成】
    在线阅读在线阅读(Gitee)ApacheCN学习资源目录人工智能DIP教程SAS教程Tableau教程r教程TensorFlow教程NLP教程MATLAB教程强化学习教程Talend教程ANN教程数学计算机教程计算机图形学数据挖掘机器学习NumPy教程PyTorch教程PythonSciPy教程Pandas教程OpenCV教程Matplotlib......
  • JavaTPoint 工具中文教程【翻译完成】
    在线阅读在线阅读(Gitee)ApacheCN学习资源目录Ubuntu上的安装苹果操作系统中的软件安装在CentOS上安装nginx教程Bash教程Git教程LATEX教程SVN教程辅助教程Firebase教程UML教程Tally教程Kubernetes教程Puppet教程GDB教程Nagios教程软件测试Selenium教程敏捷教程JIRA......
  • JavaTPoint PHP 中文教程【翻译完成】
    在线阅读在线阅读(Gitee)ApacheCN学习资源目录PHP教程Laravel教程WordPress教程CodeIgniter教程Magento2教程Joomla教程Phalcon教程YII框架XAMPP教程贡献指南本项目需要校对,欢迎大家提交PullRequest。请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并不要求您做到......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)
    (剑指Offer33.二叉搜索树的后序遍历序列(java解题))1.题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:5/\26/\13示......