侧边栏壁纸
博主头像
程序员の小站博主等级

行动起来,活在当下

  • 累计撰写 51 篇文章
  • 累计创建 35 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

JVM性能监控篇

Administrator
2024-10-22 / 0 评论 / 0 点赞 / 1 阅读 / 8612 字
温馨提示:
本文最后更新于 2024-10-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

!!!本章内容看这里====尚硅谷_JVM精讲与GC调优第7篇-JVM性能监控篇====!!!

1. JVM监控及诊断工具–命令行

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

jps(Java Process Status)显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。

基本语法
jps [options] [hostid]

options可写参数:

参数 参数说明
-q 仅仅显示LVMID (local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
-l 输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径
-m 输出虚拟机进程启动时传递给主类main()的参数
-v 列出虚拟机进程启动时的JVM参数。 比如:-Xms20m -Xmx50m是启动程序指定的jvm参数

如果某Java进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该Java的进程。

1.2 jstat查看JVM统计信息

jstat(JVM Statistics Monitoring Tool)用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。

基本语法
jstat -< option> [-t] [-h< lines>] < vmid> [< interval> [< count>]]

  1. option参数
    • 类装载相关
      • -class:显示ClassLoader的相关信息,类的装载、卸载数量、总空间、类装载所消耗的时间等
    • 垃圾回收相关
      • -gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
      • -gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
      • -gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
      • -gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因。
      • -gcnew:显示新生代GC状况
      • -gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
      • -geold:显示老年代GC状况
      • -gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
      • -gcpermcapacity:显示永久代使用到的最大、最小空间。
    • JIT相关的
      • -compiler:显示JIT编译器编译过的方法、耗时等信息
      • -printcompilation:输出已经被JIT编译的方法
  2. interval参数:用于指定输出统计数据的周期,单位是毫秒,即查询间隔
  3. count参数:用于指定查询的总次数
  4. -t参数:可以在输出信息前加上一个Timestamp列,显示程序的运行时间,单位:秒。我们可以比较Java进程的启动时间以及总GC时间。或者两次测量的间隔时间以及总GC时间的增量,来得出GC时间占运行时间的比例。如果该比例超过20%,则说明目前堆的压力较大;如果该比例超过90%,则说明堆里几乎没有可用空间,随时都可能抛出OOM异常
  5. -h参数:可以在周期性数据输出时,输出多少行数据后输出一个表头信息

jstat还可以用来判断是否出现内存泄漏。在长时间运行的Java程序中,我们可以运行jstat命令连续获取多行性能数据,并取这几行数据中OU列(即已占用的老年代内存)的最小值。然后,我们每隔一段较长的时间重复一次上述操作,来获得多组 OU 最小值。如果这些值呈上涨趋势,则说明该 Java 程序的老年代内存已使用量在不断上涨,这意味着无法回收的对象在不断增加,因此很有可能存在内存泄漏。

-gc结果说明

  1. 新生代相关
    • S0C是第一个幸存者区的大小
    • S1C是第二个幸存者区的大小
    • S0U是第一个幸存者区已使用的大小
    • S1U是第二个幸存者区已使用的大小
    • EC是Eden空间的大小
    • EU是Eden空间已使用的大小
  2. 老年代相关
    • OC是老年代大小
    • OU是老年代已使用的大小
  3. 方法区
    • MC是方法区的大小
    • MU是方法区已使用的大小
    • CCSC是压缩类空间的大小
    • CCSU是压缩类空间已使用的大小
  4. 其他
    • YGC是指从应用程序启动到采用young gc次数
    • YGCT是指从应用程序启动到采样时young gc消耗的时间
    • FGC是指从应用程序启动到采样时full gc次数
    • FGCT是指应用程序启动到采样时full gc 消耗的时间
    • GCT是指从应用程序启动到采样时gc的总时间

1.3 jinfo实时查看和修改JVM配置信息

jinfo(Configuration Info for Java)查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个査找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。
image.png

基本语法
jinfo [options] pid java的进程ID必须要加上
image.png

  • jinfo -sysprops PID 可以查看由System.getProperties()取得的参数
  • jinfo -flags PID 查看曾经赋过值的一些参数
  • jinfo -flags 具体参数 PID 查看某个java进程的具体参数值
    jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值,甚至可以在运行时修改部分参数,并使之立即生效。但是,并非所有参数都支持动态修改。参数只有被标记为manageable的flag可以被实时修改。其实,这个修改能力是极其有限的。可以查看被标记为manageable的参数:java -XX:+PrintFlagsFinal -version | grep manageable。针对boolean类型用jinfo -flag[+|-]具体参数 PID,对于非boolean类型的jinfo -flag 具体参数=具体参数值 PID

拓展:

  1. java -XX:+PrintFlagsInitial:查看所有JVM参数启动的初始值
  2. java -XX:+PrintFlagsFinal: 查看所有JVM参数的最终值
  3. java -XX:+PrintCommandLIneFlags:查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值

1.4 jmap导出内存映射文件&内存使用情况

jmap(JVM Memory Map)作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。开发人员可以在控制台中输入命令“jmap -help”查阅jmap工具的具体使用方式和一些标准选项配置。

基本语法

  • jmap [option] < pid>
  • jmap [option] < executable < core>
  • jmap [option] [server_id@]< remote server IP or hostname>

其中 option包括:
image.png
说明:这些参数和linux下输入显示的命令多少会有不同,包括也受jdk版本的影响。

  • -dump:生成Java堆转储快照(dump文件),特别的-dump:live只保存堆中存活对象
  • -heap:输出整个堆空间的详细信息,包括GC的使用,以及内存的使用信息等
  • -histo:输出堆中对象的统计信息,包括类、实例数量和合集容量。特别的-histo:live只统计堆中存活对象
  • -permstat:以ClassLoader为统计口径输出永久代的内存状态信息,仅在Linux/solaris平台中有效
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象,仅在Linux/solaris平台有效
  • -F:仅虚拟机进程堆-dump选项没有任何响应时,可以使用此选项强制执行生成dump文件,仅在Linux/solaris平台有效
  • -h|-help:jmap工具使用的帮助命令
  • -J< flag> 传递参数给jmap启动的jvm

2. JVM监控及诊断工具–GUI篇

3. JVM运行时参数

3.1 JVM参数选项类型

类型一:标准参数项
此类型的特点是比较稳定,后续版本基本不会发生变化。以-开头。
选项包括:

  • -d32          使用 32 位数据模型 (如果可用)
  • -d64          使用 64 位数据模型 (如果可用)
  • -server      选择 “server” VM。默认VM是server
  • -cp  <目录和 zip/jar 文件的类搜索路径>
  • -classpath <目录和 zip/jar 文件的类搜索路径>用; 分隔目录,JAR档案和ZIP档案列表,用于搜索类文件
  • -D <名称>=<值>设置系统属性
  • -verbose:[class|gc|jni] 启用详细输出
  • -version      输出产品版本并退出
  • -showversion  输出产品版本并继续
  • -? -help      输出此帮助消息
0

评论区