继续创造,加速成长!这是我参与「日新方案 10 月更文挑战」的第8天,点击检查活动详情

jdk在装置的时分会供给一些功能分析、故障诊断、JVM监控之类的东西,了解这些东西对咱们分析JVM内存、JVM调优有必定的协助,本篇文章来学习一下。

监控类东西

jps

jps(JVM Process Status)是检查正在运转的虚拟机进程的东西。jps能获取进程id,所以会被经常运用。在 linux 中,一般自带了 OpenJdk,一般状况下 JPS 等指令不能用,要么挑选去装置 JPS 等插件,要么把 OpenJdk 卸载,重新装置 Oracle 的 JDK。

语法jps [ options ] [ hostid ]

  • options可选项,有以下挑选:
参数 意义
-q 只显现进程
-m 输出主函数传入的参数
-l 输出运用程序主类完整 package 称号或 jar 完整称号.
-v 列出 jvm 参数
-V 只生成本地JVM标识符列表
-J 向JVM传递参数。例如:-J-Xms48m,设置JVM初始内存为48m
  • hostid :长途地址,可选项,指定特定主机的IP或许域名,也能够指定详细协议端口,不指定则检查当前机器的相关信息,hostid所指机器有必要敞开jstatd服务。

测验:

JVM自带内存调优工具
JVM自带内存调优工具
57312 JvmToolsApplication 这个是我运转的一个用于测验的springboot项目。

jstat

jstat(JVM Statistics Monitoring Tool )是用于监督虚拟机各种运转状况信息的指令行东西。它能够显现本地或许长途虚拟机进程中的类装载、内存、废物收集、JIT 编译等运转数据,在没有 GUI 图形界面,只供给了纯文本控制台环境的服务器上,它将是运转期定位虚拟机功能问题的首选东西。

语法: jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]

  • generalOption :常规选项,必填项。有两个参数可选
    • -help:协助信息
    • -options:对应着下面的outputOptions
  • outputOptions:输出选项,必填项。有以下选项
参数 意义
-class 显现类加载器行为信息
-compiler 显现有关JVM实时编译器行为的核算信息
-gc 显现有关GC堆行为的核算信息。
-gccapacity 显现各分区巨细
-gccause 显现最近一次 GC 核算信息和原因
-gcnew 显现重生代行为的核算信息。
-gcnewcapacity 显现重生代内存巨细
-gcold 显现老时代核算信息
-gcoldcapacity 显现老时代内存巨细
-gcmetacapacity 显现元空间内存巨细
-gcutil 显现GC核算汇总信息
-printcompilation 显现HotSpot 编译核算信息

outputOptions参数后边还能加以下可选参数:

- -h n:每n个样本(输出行)显现一个列标题,默许值为0,显现列标题的第一行数据。
- -t:第一列显现为时间戳
- -J:向运用程序传递发动参数
  • vmid :虚拟机标识
  • interval:指定时间采样距离时间,单位秒(s)或许毫秒(ms),默许单位是毫秒
  • count :采样次数,指定时间内采样多少次。

测验:

  1. 核算gc信息

    JVM自带内存调优工具
    57312 是测验项目JvmToolsApplication在虚拟机中的进程id。

  2. jstat -gc 57312 100 10这个指令是在100ms内获取10次gc核算信息

    JVM自带内存调优工具
    成果中的列分别代表以下意思:

    • S0C:第一个幸存区(From 区)的巨细
    • S1C:第二个幸存区(To 区)的巨细
    • S0U:第一个幸存区的运用巨细
    • S1U:第二个幸存区的运用巨细
    • EC:伊甸园(Eden)区的巨细
    • EU:伊甸园(Eden)区的运用巨细
    • OC:老时代巨细
    • OU:老时代运用巨细
    • MC:办法区巨细
    • MU:办法区运用巨细
    • CCSC:紧缩类空间巨细
    • CCSU:紧缩类空间运用巨细
    • YGC:年青代废物收回次数
    • YGCT:年青代废物收回耗费时间
    • FGC:老时代废物收回次数
    • FGCT:老时代废物收回耗费时间
    • GCT:废物收回耗费总时间

故障诊断类东西

jinfo

jinfo(Configuration Info for Java) 能够实时地检查和调整虚拟机的各项参数。jinfo不仅能获取到虚拟机指令行参数,还能获取到体系参数。

语法:

  • jinfo [ option ] pid:检查和调整本地进程虚拟机参数

option:

  • -flag name:name为jvm参数名
  • -flag [+|-]name:敞开或许封闭一个Boolean的jvm参数
  • -flag name=value:设置jvm参数值
  • -flags:查询虚拟机参数
  • -sysprops:能够检查由 System.getProperties()取得的参数

测验:

  • flag测验 能够经过java -XX:+PrintFlagsFinal –version指令获取虚拟机参数,这是一个很长的列表,其间红框部分假如是manageable则表明能够在运转时修正。
    JVM自带内存调优工具
    咱们就随便找一个参数UseTLAB进行查询,能够看到它是否敞开
    JVM自带内存调优工具
  • 获取虚拟机参数 先修正一下项目发动参数,加上-XX:+PrintGC -XX:SurvivorRatio=6
    JVM自带内存调优工具
    重启项目,并经过jps获取到进程id
    JVM自带内存调优工具
    再经过jinfo -flags 67776指令获取项目发动参数
    JVM自带内存调优工具
    还能够获取上面装备的某一个参数jinfo -flag SurvivorRatio 67776
    JVM自带内存调优工具

经过 jinfo 指令,咱们能够在生产上临时翻开一下 GC日志或许进行一些数据的装备(不需要重启运用条件下),也是咱们去排查问题的一个关键指令。

jmap

jmap(Memory Map for Java) 打印给定进程或长途调试服务器的同享目标内存映射或堆内存详细信息。jmap也可用于生成堆转储快照(一般称为 heapdump 或 dump 文件),除此之外它还能够查询 finalize 履行行列、Java 堆和永 久代的详细信息,如空间运用率、当前用的是哪种收集器等。和 jinfo 指令一样,jmap 有不少功能在 Windows 平台下都是受限的,除了生成 dump 文件的 -dump 选项和用于检查每个类的实例、空间占用核算的-histo 选项在所有操作体系都供给之外,其他选项都只能在 Linux/Solaris 下运用。

语法:jmap [ options ] pid

options 有如下选项:

  • -heap:打印 heap 的概要信息
    JVM自带内存调优工具
    概要信息意义:
Heap Configuration: ##堆装备状况,也便是 JVM 参数装备的成果[往常说的 tomcat 装备 JVM 参数,便是在装备这些]
   MinHeapFreeRatio         = 0	//最小堆运用份额
   MaxHeapFreeRatio         = 100  //最大堆可用份额
   MaxHeapSize              = 4261412864 (4064.0MB)  //最大堆空间巨细
   NewSize                  = 88604672 (84.5MB) ) //重生代分配巨细
   MaxNewSize               = 1420296192 (1354.5MB) //最大可重生代分配巨细
   OldSize                  = 177733632 (169.5MB) //老时代巨细
   NewRatio                 = 2  //重生代份额
   SurvivorRatio            = 6  //重生代与 suvivor 的份额
   MetaspaceSize            = 21807104 (20.796875MB)  //元空间巨细
   CompressedClassSpaceSize = 1073741824 (1024.0MB)  //类指针紧缩空间巨细
   MaxMetaspaceSize         = 17592186044415 MB // 最大元空间巨细
   G1HeapRegionSize         = 0 (0.0MB) //G1收集器Region单元巨细
Heap Usage:  //堆内存实际的运用状况
PS Young Generation  //重生代
Eden Space: //Eden 区
   capacity = 66584576 (63.5MB) //Eden容量
   used     = 27941200 (26.646804809570312MB) //Eden区已运用巨细
   free     = 38643376 (36.85319519042969MB) //未运用
   41.96347214105561% used  //运用份额
From Space: //survior1 区
   capacity = 11010048 (10.5MB) 
   used     = 8497840 (8.104171752929688MB)
   free     = 2512208 (2.3958282470703125MB)
   77.18258812313988% used
To Space:  //survior2 区
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
PS Old Generation //老时代运用状况
   capacity = 115867648 (110.5MB)
   used     = 10553152 (10.06427001953125MB)
   free     = 105314496 (100.43572998046875MB)
   9.10793666925905% used
  • -histo 打印每个 class 的实例数目,内存占用,类全名信息. 语法:jmap –histo:live <pid>,live参数表明核算活跃状况的目标

    JVM自带内存调优工具
    -histo 打印的实例数目太多了,看不过来,显现那么多也没什么用,所以在Linux体系上能够运用jmap –histo <pid> | head -10指令只展现前10行,详细行数能够自己定义。

  • -finalizerinfo :打印正等候收回的目标的信息

  • –clstats:打印堆中类加载器信息,它会打印类加载器的姓名、活跃度、地址、父加载器、加载了多少个类等。

  • -dump:[live,] format=b, file=filename:生成的堆转储快照

    JVM自带内存调优工具
    经过-dump指令能够在指定文件夹生成dump文件,之后再调配jhat来分析dump文件,dump文件的后缀也能够是hprof 或许bin,dump文件本身是一个二进制文件。

  • -h或-help:打印协助信息

  • -J:传递虚拟机参数

jhat

jhat (Heap Dump Browser)能够让一个dump文件以web服务的的形式拜访。

上面咱们用jmap东西生成了一个dump文件,现在能够经过jhat 东西,让它再浏览器端拜访到。

JVM自带内存调优工具
Server is ready表明发动成功,端口号为7000,然后在浏览器端拜访http://localhost:7000/,能够看到dump文件内容
JVM自带内存调优工具
语法:jhat [ options ] heap-dump-file

  • -stack false|true:封闭目标分配调用栈跟踪。 假如分配位置信息在堆转储中不可用. 则有必要将此标志设置为 false. 默许值为 true.
  • -refs false|true:封闭目标引证跟踪。 默许值为 true. 默许状况下, 回来的指针是指向其他特定目标的目标,如反向链接或输入引证, 会核算/核算堆中的所有目标。
  • -port port-number:http端口号指定,便是上面经过浏览器拜访的端口号,默许是7000
  • -exclude exclude-file:指定一个文件,该文件列出应从可达目标查询中排除的数据成员。
  • -baseline exclude-file:指定基线堆转储。两个堆转储中具有相同目标ID的目标被标记为不是新的。其他目标被标记为新的。这关于比较两个不同的堆转储十分有用。
  • -debug int:设置debug等级,0意味着不输出debug信息,等级越高输出的日志越详细。
  • -version:版本号

jhat指令在JDK9、JDK10中现已被删除了,官方主张运用VisualVM替代。

jstack

jstack(Stack Trace for Java)指令用于生成虚拟机当前时间的线程快照。线程快照便是当前虚拟机内每一条线程正在履行的办法仓库的调集,生成线程快照的主 要目的是定位线程呈现长期停顿的原因,如线程间死锁、死循环、请求外部资源导致的长期等待等都是导致线程长期停顿的常见原因。

语法:jstack [ options ] pid

JVM自带内存调优工具
options 选项:

  • -m:打印一起具有Java和本机C/C++帧的混合模式堆跟踪。
  • -l:打印有关锁的其他信息,例如拥有java.util.concurrent同步器的列表

可视化东西

关于桌面操作体系,java供给了jconsole和jvisualvm可视化东西。可视化东西便是将上面几个指令行东西整合到一起运用的一个东西。

jconsole

jconsole指令发动一个图形控制台东西,该东西允许您监督和办理本地或长途核算机上的Java运用程序和虚拟机。

指令行输入Jconsole指令挑选要监控的程序,可挑选本地进程也能够挑选长途进程,假如挑选长途进程的话要在服务器敞开JMX,一般不敞开。

JVM自带内存调优工具

进入控制台首页

JVM自带内存调优工具

  • 概览:能够看到堆内存的运用量、线程、类加载的改变、CPU占用率
  • 内存:能够看到各个分区的运用量改变,也能够履行GC操作
    JVM自带内存调优工具
  • 线程:能够看到线程数改变状况,也能够检查详细线程详细信息,检测是否有死锁
    JVM自带内存调优工具
  • 类:类加载数量改变的折线图,可根据时间规模进行挑选
    JVM自带内存调优工具
  • VM概要:检查JVM各种信息的汇总
    JVM自带内存调优工具
  • MBean:检查Mbean信息、特点信息、办法信息等。经过getProperty能够获取体系特点,比如在输入框输入sun.desktop,就会弹出对应的特点值。
    JVM自带内存调优工具
    JConsole发动的时分还能够附加其他参数:
  • -interval=n:更新距离频率,单位秒(s),默许4秒更新一次
  • -notile:关于2个及以上衔接不平铺窗口
  • -pluginpath plugins:发动的一起指定一个插件

jvisualvm

jvisualvm是一个监控运转时java运用程序的图形界面东西。jvisualvm大致和Jconsole差不多,便是多了抽样器和profiler,感爱好的能够自己试一下。

指令行输入jvisualvm就能够发动jvisualvm可视化界面了。

JVM自带内存调优工具
挑选要检查的运用程序就能够进入监控界面
JVM自带内存调优工具
jhat指令是用来加载jmap生成的dump文件的,前面不是说官方主张运用VisualVM替代jhat指令嘛,那便是说jvisualvm也能够加载dump文件。
JVM自带内存调优工具
挑选堆dump
JVM自带内存调优工具
翻开就能看到之前生成的dump文件里面的内容了
JVM自带内存调优工具

jvisualvm还能够装置插件

JVM自带内存调优工具
这儿挑选装置Visual GC
JVM自带内存调优工具
装置好之后就能够看到jvm内存改变状况,经过Visual GC能够很好地理解JVM运转时区域信息。
JVM自带内存调优工具

总结

以上便是关于JVM的一些优化东西,这儿仅仅简单的介绍了一下,有爱好的能够深入了解一下,对JVM进行优化时大有用处。