9.jvm调优相关工具-java自带

news/2024/7/5 8:21:41 标签: jvm, java, java自带调优工具, jps, jmap

目录

概述

做了一些 1.81.17.x jdk对比,最重要的是实际操作一次。
这些是java自带的命令,属于离线,应急之用。

相关文章在此总结如下:

文章地址
jvm基本知识地址
jvm类加载系统地址
双亲委派模型与打破双亲委派地址
运行时数据区地址
运行时数据区-字符串常量池、程序计数器、直接内存地址
jvm中对象创建流程与内存分配地址
jvm对象内存布局地址
GC基本原理地址

jdk工具包

命令行:

命令英文中文
jpsjvm Process status tooljvm进程状态工具,查看进程基本信息
jstatjvm statistics monitoring tooljvm统计监控工具、查看堆、GC详细信息
jinfojava configuration info查看配置参数信息,支持部分参数运行时修改
jmapjava memory map分析堆内存工具、dump堆内存快照
jhatjava heap analysis tool堆内存dump文件解析工具
jstackjava stack tracejava 堆栈跟踪工具

可视化工具

工具说明缺点
VisualVM性能分析可视化工具不能在linux命令行这种交互方式(不介绍)

jps_37">jps

查看 java 进程,相当于 linux 下的 ps 命令,它只列出java进程。

# 列出java程序进程ID和jar包全名称
jps

当无部署的java应用时,如下
注意: 此时 jps 只显示当前应用程序进程ID与一个jar,而不是 jar 包全名

[root@hadoop01 jk-demo]# nohup /data/soft/jdk-17.0.9/bin/java -Xms1024m -Xmx1024m -jar jk-demo.jar  &
[1] 6634
[root@hadoop01 jk-demo]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@hadoop01 jk-demo]# jps
6634 jar
6922 Jps

再来比较一下

[root@hadoop01 jk-demo]# nohup /data/soft/jdk-17.0.9/bin/java -Xms1024m -Xmx1024m -jar /data/soft/jk-demo/jk-demo.jar  &
[1] 4778
[root@hadoop01 jk-demo]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@hadoop01 jk-demo]# jps
5188 Jps
4778 jk-demo.jar

命令台输出
在这里插入图片描述

由此: 现在能清楚的知道进程ID对应的哪个jar包了

jps_q_72">jps -q

没有什么意义

[root@hadoop01 jk-demo]# jps -q
4778
11421

jps_m_80">jps -m

[root@hadoop01 jk-demo]# nohup /data/soft/jdk-17.0.9/bin/java -Xms1024m -Xmx1024m -jar /data/soft/jk-demo/jk-demo.jar  123 abc  &
[1] 16859
[root@hadoop01 jk-demo]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@hadoop01 jk-demo]# jps -m
16859 jk-demo.jar 123 abc
17053 Jps -m

jps_v_91">jps -v

[root@hadoop01 soft]# jps -v
19137 Jps -Dapplication.home=/data/soft/jdk1.8 -Xms8m
16859 jk-demo.jar -Xms1024m -Xmx1024m

jps_l_99">jps -l

输出jar包所在的绝对路径

[root@hadoop01 soft]# jps -l
21845 sun.tools.jps.Jps
16859 /data/soft/jk-demo/jk-demo.jar

jstat

jstat可以查看java程序运行时相关信息,可以通过它查看运行时堆信息的相关情况。

jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

options由以下值构成

参数详解
-class显示ClassLoader的相关信息
-compilercompiler 显示 JIT编译的相关信息
-gc显示与GC相关信息
-gccapacitygccapacity 显示各个代的容量和使用情况
-gccause显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnewgcnew 显示新生代信息
-gcnewcapacitygcnewcapacity 显示新生代大小和使用情况
-gcoldgcold 显示老年代信息
-gcoldcapacitygcoldcapacity 显示老年代大小
-gcpermcapacitygcpermcapacity 显示永久代大小
-gcutilgcutil 显示垃圾收集信息

jstat -gc

下面输出的是进程内存区域及GC详细信息

jstat -gc 16859  250  4
16859 : 进程ID
250   : 采样间隔 250ms,不带单位默认 ms,可以写成 1s
4     : 采样数4

在这里插入图片描述
由上图可知,信息直观比较细

参数详解如下

参数详解
S0CC容量的意思,年轻代中第一个survivor区(幸存区)的容量(单位kb)
S1C年轻代中第二个survivor区(幸存区)的容量(单位kb)
S0UU已使用的意思,年轻代中第一个survivor(幸存区)目前已使用空间(单位kb)
S1U年轻代中第二个survivor(幸存区)目前已使用空间(单位kb)
EC年轻代中Eden的容量(单位kb)
EU年轻代中Eden目前已使用空间(单位kb)
OCold代的容量是(单位kb)
OUold代目前已使用空间(单位kb)
MCmetaspace的容量(单位kb)
MUmetaspace目前已使用空间(单位kb)
CCSC压缩类空间大小
CCSU压缩类空间使用大小
YGC从应用程序启动到采样时年轻代中gc次数
YGCT从应用程序启动到采样时年轻代中gc所用时间(s)
FGC从应用程序启动到采样时old代(全gc)gc次数,FGC不同的垃圾回收器的意义还有点不一样,要注意
FGCT从应用程序启动到采样时old代(全gc)gc所用时间(s) ,FGC不同的垃圾回收器的意义还有点不一样,要注意
GCT从应用程序启动到采样时gc用的总时间(s)

jstat -gcutil

下面输出的是进程内存区域百分百及GC详细信息。统计后的信息。

jstat -gcutil 16859 1s 5

16859 : 进程ID
250   : 采样间隔 250ms,不带单位默认 ms,可以写成 1s
5     : 采样数5

在这里插入图片描述

参数详解
S0survivor第一个区使用率
S1survivor第二个区使用率
EEden使用率
O老年代使用率
M元空间使用率
CCS压缩空间使用率
# jdk 1.17.x
/data/soft/jdk-17.0.9/bin/jstat -gcutil 16859 1s 5

在这里插入图片描述

jinfo

jinfo可以用来查看正在运行的java程序的扩展参数,甚至支持修改运行时过程中的部分参数

jinfo [option] <pid>

参数详解

参数详解
-flags打印虚拟机 vm 参数
-flag name打印指定虚拟机 vm 参数
-flag [+/-] name打开或关闭虚拟机参数
-flag name=value设置指定虚拟机参数的值
# jdk 1.8
jinfo -flags 16859

在这里插入图片描述

/data/soft/jdk-17.0.9/bin/jinfo -flags 16859

在这里插入图片描述

主要输出 jvm 的配置参数

jmap_216">jmap

jmap用来查看堆内存使用状况,一般结合jhat使用。

  • 命令:jmap pid
  • 描述:查看进程的内存映像信息。使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。
jmap 16859

在这里插入图片描述

jmap_heap_227">jmap heap

这个命令常用。

  • 命令:jmap -heap pid
  • 描述:显示java堆详细信息:打印堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息。
# jdk 1.8
jmap -heap 16859

[root@hadoop01 ~]# jmap -heap 16859
Attaching to process ID 16859, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0.9+11-LTS-201

using thread-local object allocation.
Garbage-First (G1) GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 1073741824 (1024.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 643825664 (614.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 22020096 (21.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 1024
   capacity = 1073741824 (1024.0MB)
   used     = 78066944 (74.450439453125MB)
   free     = 995674880 (949.549560546875MB)
   7.270550727844238% used
G1 Young Generation:
Eden Space:
   regions  = 66
   capacity = 438304768 (418.0MB)
   used     = 69206016 (66.0MB)
   free     = 369098752 (352.0MB)
   15.789473684210526% used
Survivor Space:
   regions  = 7
   capacity = 8388608 (8.0MB)
   used     = 7832832 (7.469970703125MB)
   free     = 555776 (0.530029296875MB)
   93.3746337890625% used
G1 Old Generation:
   regions  = 2
   capacity = 627048448 (598.0MB)
   used     = 1028096 (0.98046875MB)
   free     = 626020352 (597.01953125MB)
   0.16395798494983277% used

jmap_histolive_287">jmap histo[:live]

  • 命令:jmap -histo:live pid
  • 描述:显示堆中对象的统计信息;其中包括每个java类、对象数量、内存大小(单位字节)、完全限定的类名。打印虚拟机内部的类名称会带有一个 * 前缀。如果指定了 live 子选项,则只计算活动的对象。
jmap -histo 16859

在这里插入图片描述

jmap_clstats_296">jmap clstats

这个命令用得不多。

  • 命令:jmap -clstats pid
  • 描述:打印类加载器信息;打印 java 堆内存方法区的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
/data/soft/jdk-17.0.9/bin/jmap -clstats 16859

[root@hadoop01 jdk-17.0.9]# /data/soft/jdk-17.0.9/bin/jmap -clstats 16859
ClassLoader         Parent              CLD*               Classes   ChunkSz   BlockSz  Type
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bcd1c0e0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bd13bce0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc84dcd0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc6009a0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc8dddd0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x0000000000000000  0x00007fd1bc470180       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc871ff0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bca168f0       1       512       394  jdk.internal.reflect.DelegatingClassLoader
0x00007fd147084530  0x00007fd147086808  0x00007fd1bc37c720      54     47104     44253  jdk.internal.loader.ClassLoaders$AppClassLoader
0x00007fd148001000  0x00007fd147084530  0x00007fd1bc416790    4131   2570880   2567758  org.springframework.boot.loader.LaunchedURLClassLoader
                                                                 1       256       127   + hidden classes
0x00007fd1470094d8  0x0000000000000000  0x00007fd1bc84c250       1       512       394  jdk.internal.reflect.DelegatingClassLoader
0x0000000000000000  0x0000000000000000  0x00007fd1bc345440    2379    868352    864303  <boot class loader>
                                                               239     94464     61213   + hidden classes
0x00007fd1470094d8  0x0000000000000000  0x00007fd1bc890290       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd147086808  0x0000000000000000  0x00007fd1bc34e4b0      28     19456     18176  jdk.internal.loader.ClassLoaders$PlatformClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bcd0f5a0       1       512       394  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x0000000000000000  0x00007fd1bc872160       1       384       237  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc84d0e0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bcaec090       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc9b9dd0       1       512       390  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc9e47f0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x0000000000000000  0x00007fd1bc84c680       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc788850       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bca849c0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc84d1a0       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x0000000000000000  0x00007fd1bc8b5a30       1       384       237  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc468670       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x00007fd148001000  0x00007fd1bc872420       1       512       429  jdk.internal.reflect.DelegatingClassLoader
0x00007fd1470094d8  0x0000000000000000  0x00007fd1bca3d970       1       512       429  jdk.internal.reflect.DelegatingClassLoader
Total = 28                                                    6856   3612544   3565598  
ChunkSz: Total size of all allocated metaspace chunks
BlockSz: Total size of all allocated metaspace blocks (each chunk has several blocks)

jmap_dump_342">jmap dump

jmap dump:

  • 命令:jmap -dump:format=b,file=heapdump.hprof pid
  • 描述:生成堆存储 快照 文件;以二进制格式转储 java 堆到指定文件中。如果指定了 live 子选项,堆中只有活动的对象会被转储。浏览 heap dump 可以使用 jhat 读取生成的文件,也可以使用MAT等堆内存分析工具。

**注意:**这个命令执行,jvm会将整个heap的信息dump写入到一个文件,heap 如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证 dump 的信息是可靠的,所以会暂停应用,线上系统慎用!

/data/soft/jdk-17.0.9/bin/jmap -dump:format=b,file=heapdump.hprof 16859

在这里插入图片描述

jhat

  • jhat 命令会解析java堆转储文件,并启动一个 web server。然后用浏览器来查看/浏览dump出来的 heap 二进制文件。
  • jhat 命令支持预先设计的查询,比如:显示某个类的所有实例。还支持对象查询语言(OQL)。OQL有点类似SQL,专门用来查询堆转储。

java 生成堆转储的方式有多种:

  • 使用 jmap -dump 选项可以在 jvm 运行时获取 dump
  • 在虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项,则抛出 OutOfMemoryError 时,会自动挂靠堆转储。
jhat [ options ] heap -dump -file

/data/soft/jdk-17.0.9/bin/jhat ./heapdump.hprof

在这里插入图片描述
**注意:**jdk1.8是有这个命令的。

jhat从jdk1.9的时候已经删除了(JEP 241: Remove the jhat Tool)。现在Oracle官方推荐的分析工具是Eclipse Memory Analyzer Tool (MAT) 和 VisualVM。

jstack

jstack是java虚拟机自带的一种堆栈跟踪工具,用于生成java虚拟机当前时刻的线程快照。

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程 出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等等。

线程快照里留意下面几种状态

  • 死锁,Deadlock(重点关注)
  • 等待资源,Waiting on condition (重点关注)
  • 等待获取管程,Waiting on monitor entry (重点关注)
  • 阻塞,Blocked (重点关注)
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中,Object.wait()或TIMED_WAITING
  • 停止,Parked

使用方式

命令详解
jstack [ option ] pid查看当前时间点,指定里程的dump堆栈信息
jstack [ option ] pid > 文件将当前时间点的指定进程的dump堆栈信息,写入到指定文件中(若存在则覆盖,不存在,自动生成)
jstack [ option ] executable core查看当前时间点,core文件的dump堆栈信息
jstack [ option ] [ server_id@ ] remote server ip or hostname查看当前时间点,远程机器的dump堆栈信息

可选参数说明

-F :当里程挂起,此时 `jstack [-l] pid` 是没有响应的,这时候可使用此参数强制打印堆栈信息,强制jstack,一般情况不需要使用。
-m :打印java和native c/c++ 框架的所有栈信息。可以打印jvm的堆栈,以及Native的栈帧,一般应用排查不需要使用
-l :长列表。打印关于锁的附加信息。例如属于 java.util.concurrent 的 ownable synchronizers 列表,会使用jvm停顿长久得多,比如普通的jstack可能几毫秒,和一次GC没区别,加了-l就是近一秒的时间,-l 建议不要使用,一般情况下不需要使用。
-h or -hel : 打印帮助信息
/data/soft/jdk-17.0.9/bin/jstack 16859

在这里插入图片描述

/data/soft/jdk-17.0.9/bin/jstack 16859 > jvm_stack_info_16859

在这里插入图片描述

/data/soft/jdk-17.0.9/bin/jstack -l 16859 | grep 'java.lang.Thread.State'  | wc -l

在这里插入图片描述

结束

至此,java自带的命令介绍就结束了。如有疑问,欢迎留言。


http://www.niftyadmin.cn/n/5188013.html

相关文章

全球地表水数据集JRC Global Surface Water Mapping Layers, v1.2数据

简介&#xff1a; 全球地表水覆盖&#xff08;Global Surface Water&#xff09;是利用1984至2019年获取的landsat5、landsat7和landsat8的卫星影像&#xff0c;生成分辨率为30米的一套全球地表水覆盖的地图集。用户可以在全球尺度上按地区回溯某个时间上地表水分的变化情况。…

滚雪球学Java(09-2):Java中的关系运算符,你真的掌握了吗?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

阿里云ESSD云盘、高效云盘和SSD云盘介绍和IOPS性能参数表

阿里云服务器系统盘或数据盘支持多种云盘类型&#xff0c;如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等&#xff0c;阿里云服务器网aliyunfuwuqi.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延…

十九章总结 Java绘图

19.1.1 Graphics类 Graphics 类是Java AWT&#xff08;Abstract Window Toolkit&#xff09;包中的一个重要类&#xff0c;用于在图形设备上绘制图形。它是一个抽象类&#xff0c;其实例通常由系统提供。 Graphics 类提供了一系列方法&#xff0c;可以用于绘制文本、图像、形…

Spring Boot使用EhCache完成一个缓存集群

在上一篇在SpringBoot中使用EhCache缓存&#xff0c;我们完成了在Spring Boot中完成了对EhCaChe的使用&#xff0c;这篇&#xff0c;我们将对EhCache的进一步了解&#xff0c;也就是搭建一个EhCache的缓存集群。 集群 在搭建一个EhCache的时候&#xff0c;我们需要先了解&…

2023年中国涂料树脂需求量、市场规模及行业竞争现状分析[图]

涂料用树脂是涂料的主要原材料&#xff0c;是涂料的主要成膜物&#xff0c;且了为涂料成品提供耐醇、耐磨、耐高温、耐高湿、减少涂料在涂装完成后的损耗、保持涂装后外观以及性状的稳定性等功能。 根据生产产品的性状不同&#xff0c;其下游产品&#xff0c;即涂料成品广泛应用…

2023年中国恒温蜡疗仪发展趋势分析:应用前景存有很大发展与探索空间[图]

恒温电蜡疗仪可将蜡熔化&#xff0c;利用蜡自身特点&#xff0c;能阻止热的传导、散热慢、气体和水分不易消失&#xff0c;保温性能优越。利用蜡能紧密贴于体表的可塑性&#xff0c;可加入其他药物协同进行治疗&#xff0c;也可将中药与蜡疗有机地结合在一起&#xff0c;产生柔…

Odoo 15开发手册第七章 记录集 - 使用模型数据

在前面的章节中&#xff0c;我们概览了模型创建以及如何向模型加载数据。现在我们已有数据模型和相关数据&#xff0c;是时候学习如何编程与其进行交互了。 业务应用需要业务逻辑来计算数据、执行验证或自动化操作。Odoo框架API为开发者提供了工具用于实现这种业务逻辑。大多数…