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

目录

  • 概述
  • jdk工具包
    • jps
      • jps -q
      • jps -m
      • jps -v
      • jps -l
    • jstat
      • jstat -gc
      • jstat -gcutil
      • jinfo
    • jmap
      • jmap heap
      • jmap histo[:live]
      • jmap clstats
      • jmap dump
    • jhat
    • jstack
  • 结束

概述

做了一些 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

查看 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

没有什么意义

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

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

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

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 516859 : 进程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

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

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

在这里插入图片描述

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-201using thread-local object allocation.
Garbage-First (G1) GC with 8 thread(s)Heap Configuration:MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70MaxHeapSize              = 1073741824 (1024.0MB)NewSize                  = 1363144 (1.2999954223632812MB)MaxNewSize               = 643825664 (614.0MB)OldSize                  = 5452592 (5.1999969482421875MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 22020096 (21.0MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 1048576 (1.0MB)Heap Usage:
G1 Heap:regions  = 1024capacity = 1073741824 (1024.0MB)used     = 78066944 (74.450439453125MB)free     = 995674880 (949.549560546875MB)7.270550727844238% used
G1 Young Generation:
Eden Space:regions  = 66capacity = 438304768 (418.0MB)used     = 69206016 (66.0MB)free     = 369098752 (352.0MB)15.789473684210526% used
Survivor Space:regions  = 7capacity = 8388608 (8.0MB)used     = 7832832 (7.469970703125MB)free     = 555776 (0.530029296875MB)93.3746337890625% used
G1 Old Generation:regions  = 2capacity = 627048448 (598.0MB)used     = 1028096 (0.98046875MB)free     = 626020352 (597.01953125MB)0.16395798494983277% used

jmap histo[:live]

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

在这里插入图片描述

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.LaunchedURLClassLoader1       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

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.hqwc.cn/news/185724.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf devexpress添加TreeListControl到项目

此教程示范如何添加TreeListControl到项目和绑定控件自引用数据源&#xff1a; 添加数据模型 绑定tree&#xff0c;并添加如下字段到数据源对象&#xff1a; Key字段包含唯一值索引节点 Parent字段包含父索引节点 添加数据模型&#xff08;Employee和Staff类&#xff09;到…

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

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

Linux使用Docker完整安装Superset3,同时解决please use superset_config.py to override it报错

文章目录 Docker安装Superset流程1. 首先获取镜像2. 生成SSL3. 创建Superset容器4. 更新数据库5. 测试访问Superset Docker安装Superset流程 1. 首先获取镜像 docker pull amancevice/superset2. 生成SSL 接下来我们运行一些额外的程序&#xff1a; openssl rand -base64 4…

电脑监控软,电脑屏幕监控软件

电脑监控软&#xff0c;电脑屏幕监控软件 电脑屏幕监控软件不仅仅是一种工具&#xff0c;更是一种守护。随着互联网的发展&#xff0c;我们工作越来越离不开电脑&#xff0c;但同时&#xff0c;也面临着更多的安全隐患。为了保护个人隐私&#xff0c;提高工作效率&#xff0c;…

canvas画点、线

效果图如下&#xff1a; <template><canvas ref"canvas" class"canvas" width"800" height"600"></canvas><hr /><button id"boldBtn" type"button" ref"boldBtn" click&qu…

【自留地】后端 - PHP - MySQL - Nginx - Python - Java

PHP ThinkPHP6入门手册 【精选】【汇总】ThinkPHP6入门手册_tp6手册_Rudon滨海渔村的博客-CSDN博客文章浏览阅读5.4k次。安装安装Composer【win】https://getcomposer.org/Composer-Setup.exe【Linux & MacOS】curl -sS https://getcomposer.org/installer | phpmv compo…

MPN – 制造零件号

S/4 1610 中的 MPN – 基于 NAST 的输出管理 我试图查找有关 MPN 设置的信息&#xff0c;但找不到详细的配置步骤。在浏览了一些信息和 help.sap 链接后&#xff0c;我能够在 S/4 1610 系统中配置 MPN 设置&#xff0c;这与使用旧输出类型&#xff08;Nast 和输出类型 NEU&…

有能一键批量转换,轻松将PDF、图片转为Word/Excel的软件吗?

随着数字化时代的到来&#xff0c;OCR技术在我们的生活中变得越来越重要。无论是从图片中提取文字&#xff0c;还是将PDF、图片格式的文件转换为Word或Excel格式&#xff0c;OCR软件都能够为我们提供极大的便利。然而&#xff0c;市面上的OCR软件种类繁多&#xff0c;哪一款软件…

2023年咸阳市《网络建设与运维》赛题解析------四、安全配置

安全配置 说明:IP地址按照题目给定的顺序用“ip/mask”表示,IPv4 any地址用0.0.0.0/0,IPv6 any地址用::/0,禁止用地址条目,否则按零分处理。 1.FW1配置IPv4 nat,实现集团产品1段IPv4访问Internet IPv4,转换ip/mask为200.200.200.16/28,保证每一个源IP产生的所有会话将…

3.6 Windows驱动开发:内核进程汇编与反汇编

在笔者上一篇文章《内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作&#xff0c;本章将通过如上案例实现远程进程反汇编功能&#xff0c;此类功能也是ARK工具中最常见的功能之一&#xff0c;通常此类功能的实现分为两部分&#xff0c;内核部分只负责读写…

kubernetes学习笔记-概念

参考&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/overview/ 概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、…

如何将图片转为excel或word?(客户端)

演示软件&#xff1a;金鸣表格文字识别大师3.6.1&#xff08;新版本界面可能会略有不同&#xff09; 第一部分 将图片转为excel或文表混合的word 一般的软件要将图片转为可编辑的excel&#xff0c;都需要待识别的图片要有明显清晰的表格线&#xff0c;但我们程序现已克服了这…