zoukankan      html  css  js  c++  java
  • Java虚拟机常用的性能监控工具

    基础故障处理工具

    jps: 虚拟机进程状况工具

    功能:来处正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及本地虚拟机唯一ID。

    它是使用频率最高的命令行工具,因为其他JDK工具大多需要输入他查询到的LVMID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程,LVMID就是操作系统的进程ID,但是如果启动了多个虚拟机进程,无法根据进程名称来定位时3,就必须依赖jps命令显示主类的功能才能区分了。

    格式:

    jps [ options ] [ hostid ]
    

    参数对应的作用。

    image-20200823115930704

    jstat:虚拟机统计信息监控工具

    功能:用于监视虚拟机各种运行状态(类加载、内存、垃圾收集、即时编译)信息的命令行工具。

    在存文本控制台环境的服务器上,他是运行期定位虚拟机性能问题的常用工具。

    jstat格式:

    jstat [ option vmid [interval[s|ms] [count]] ]
    

    vmid在本地虚拟机中和LVMID一致,如果是远程的虚拟机进程,

    格式是:[protocol:][//]lvmid[@hostname[:port]/servername]

    option参数分为三类:类加载,垃圾收集、运行期编译状况。

    image-20200823120507000

    例如:查看虚拟机进程2764的垃圾收集的具体状况。

    java -gcutil 2764
    S0   S1   E    O     P     YGC YGCT  FGC FGCT  GCT
    0.00 0.00 6.20 41.42 47.20 16  0.105  3  0.472 0.577
    

    S0,S1分别是Survivor0,Survivor1,里面是空的,老年代O代表Old,永久代P代表Permanent,分别使用了41.42%,47.20%空间。YGC就是年轻代GC,一共发生了16次,耗时0.105s,FGC老年代GC发生了3次,耗时0.472s,GCT代表GC一共花费了0.577s。

    jinfo:Java配置信息工具

    功能:实时查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显示指定的参数列表,但是如果想要知道未被显示指定的参数的系统默认值,除了查询其他资料,只剩使用jinfo -flag选项进行查询了。

    jinfo命令格式:

    jinfo [option] pid
    

    例如查询CMS触发百分比的参数值

    jinfo -flag CMSInitiatingOccupancyFraction 1444
    -XX:CMSInitiatingOccupancyFraction=85
    

    jmap:Java内存映像工具

    功能:用于生成对转储快照(dump文件或者叫做heap dump)。还可以查询finalize执行队列、Java堆和方法区的详细信息。

    其实不使用jmap,也能转储对快照,使用 -XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出后自动生成堆转储快照文件。也可以用 kill -3向进程发出退出信号,也能获取堆转存快照。

    jmap命令格式:

    jmap [option] vmid
    

    可选参数如下图所示

    image-20200823122402235

    使用jmap生成dump文件,其中3500是通过jps查询到的本地虚拟机进程ID(LVMID)

    jmap -dump:format=b,file=eclipse.bin 3500
    Dumping heap to C:UsersIcyFenixeclipse.bin ...
    Heap dump file created
    

    jhat:虚拟机堆转储快照分析工具

    功能:JDK提供jhat(Java Heap Analysis Tool)命令是和jmap命令配合使用,用来分析jmp生成的dump文件。

    jhat内置一个微型的web服务器,生成分析结果后,可以在浏览器中查看,输入http://localhost:7000,不过不会在虚拟机运行的那台机器上用jhat分析堆转储快照,因为分析锁消耗的内存资源太大,一般会将dump文件转到其他机器上然后在用jhat分析,不过现在有比jhat更好用的分析功能。VisualVM,以及IBMHeapAnalyzer等。

    使用格式:

    jhat eclipse.bin
    ....
    Server is ready.
    

    jstack: Java堆栈跟踪工具

    功能:用于生成虚拟机当前时刻的线程快照(thereaddump或者javacore文件)。

    为什么要生成线程快照?其实就是说生成线程快照的作用。

    为了定位线程长时间处于停顿的原因,如遇上了死循环,死锁,请求外部资源时间过长没收到响应等。通过jstack命令可以获知没有响应的线程在后台干了什么事。

    jstack 格式:

    jstack [option] vmid
    

    可选参数的作用;

    image-20200823124042202

    可视化故障处理工具

    JHSDB:基于服务性代理的调试工具

    JHSDB是一款基于服务性代理的进程外部调试工具。服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言实现的API集合。它可以在独立的虚拟机的进程里分析其他虚拟机的内部数据。或者从进程内存快照中还原出他的运行细节。通过JHSDB可以找到代码中创建的对象所在的位置以及他们的引用在哪。

    JConsole: Java监视与管理控制台

    JConsole是一款基于JMX的可视化监视、管理工具。主要工作是通过JMX(Java Manage-ment Extensions)的MBean对系统进行信息收集和参数动态调整。而JMX是一种开放的技术,即可以用在虚拟机本身也可以用在虚拟机软件上。

    启动JConsole

    进入JDK/bin目录下,通过jconsole.exe启动JConsole,系统会自动搜索出本机运行的所有虚拟机进程。

    image-20200823153333762

    内存监控

    内存页签的作用相当于可视化的jstat命令,用于监视被收集器管理的虚拟机内存的变化趋势。

    image-20200823153310397

    线程监控

    点击线程标签的功能就相当于可视化jstack命令,与当了线程挺短的情况可以使用这个标签来进行分析。

    image-20200823153533583

    VisualVM:多合-故障处理工具

    VisualVM是功能最强大的运行监视和故障处理程序之一。他除了常规的运行监视、故障处理还提供了性能监分析的功能。并且它还支持大量的扩展,可以安装多数插件。

    有了插件,VisualVM可以做到:

    • 显示虚拟机进程以及进程的配置、环境信息。
    • 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息。
    • 堆转存快照分析
    • 方法级的程序运行性能分析,找出被调用最多。运行时间最长的方法。
    • 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行bug反馈。

    这玩意是在JDK6 Update7中首次发布,但并不意味着他只能在JDK6及以上运行,它具有向下兼容的特性,能兼容JDK1.4.2版本。

    刚开始VisualVM没有任何插件,所以先安装插件才能实现基本的功能。

    手工安装插件并不常用,VisualVM的自动安装功能已可找到大多数所需的插件,在有网络连接的环境下,点击“工具->插件菜单”,弹出插件页签,在页签的“可用插件”及“已安装”中列举了当前版本VisualVM可以使用的全部插件,选中插件后在右边窗口会显示这个插件的基本信息,如开发者、版本、功能描述等。

    image-20200823175834101

    Java Mission Control:可持续在线的监控工具

    持续收集数据的JFR(Java Fight Recoder)和运行监控Java虚拟机的JMC(Java Mission Control)。

    JFR是一套内嵌在HotSpot虚拟机里面的金控和基于事件的信息收集框架,在于其他的监控工具相比,JFR在生产环境中对吞吐量的影响不超过1%,并且JFR监控过程的开始和结束都是动态的,不需要重启应用。

    JMC不经可以下载到独立程序,还可以作为Eclipse的插件直接使用。它与虚拟机之间采用JMX协议进行通信,一方面用来显示虚拟机MBean提供的数据,另一方面用来作为JFR的分析工具展示JFR的数据。

    JFR与JMC的配合相当于录屏软件与超级播放器的组合,JFR会对选择的虚拟机(可以是本地的也可以是远程的)运行的整个过程都会保存成日志,保存到内存或者是某个文件中,然后JMC从内存或者文件中读取并展示这些事件数据,还能进行性能分析。

    image-20200823214043952

    以垃圾搜集为例,HotSpot的MBean中一般有各个分代大小、收集次数、时间、占用率等数据(根据收集器不同有所差别),这些都属于“结果”类的信息,而JFR中还可以看到内存中这段时间分配了哪些对象、哪些在TLAB中(或外部)分配、分配速率
    和压力大小如何、分配归属的线程、收集时对象分代晋升的情况等,这些就是属于“过程”类的信息,相比于结果类信息过程信息更加准确有效的分析问题。

    来自《深入理解Java虚拟机第三版 周志明著》

  • 相关阅读:
    flock对文件锁定读写操作的问题 简单
    hdu 2899 Strange Fuction(二分)
    hdu 2199 Can you solve this equation? (二分)
    poj 3080 Blue Jeans (KMP)
    poj 2823 Sliding Window (单调队列)
    poj 2001 Shortest Prefixes (trie)
    poj 2503 Babelfish (trie)
    poj 1936 All in All
    hdu 3507 Print Article (DP, Monotone Queue)
    fzu 1894 志愿者选拔 (单调队列)
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121879.html
Copyright © 2011-2022 走看看