JVM实战所需命令及工具(持续更新)

一、JVM实战

1、JVM 监控工具

      1、 jps,显示系统所有虚拟机进程信息的命令行工具

jps命令语法:

jps [-q] [-mlvV] [hostid]
jps [-help]
命令参数说明:
-q:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
-mlvV:我们可以指定这些参数的任意组合。
-m:显示Java虚拟机启动时传递给main()方法的参数。
-l:显示主类的完整包名,如果进程执行的是JAR文件,也会显示JAR文件的完整路径。
-v:显示Java虚拟机启动时传递的JVM参数。
-V:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
hostid:指定的远程主机,可以是ip地址和域名, 也可以指定具体协议,端口。如果不指定,则显示本机的Java虚拟机的进程信息。
-help:显示jps命令的帮助信息。
在没有指定任何参数的情况下,jps命令会显示每个Java虚拟机进程的本地虚拟机唯一ID,后面跟着主类名称或JAR文件名的简短形式。

例:显示主类的完整包名或JAR文件名,并且显示JVM参数:

D:\work001\jingmasc\untitled>jps -lv
8452  exit -Xms1024m -Xmx2033m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -XX:CICompilerCount=2 -Dsun.io.useCanonPrefixCache=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapD
umpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Djdk.attach.allowAttachSelf=true -Dkotlinx.coroutines.debug=off -Djdk.module.illegalAccess.silent=true -javaagent:C:\Users\Public\.jetbrains\jetbrains-agent-v3.2.1.c46b.ed7=by https://zhile.io -Djb.vmOptionsFile
=C:\Users\Administrator\.IntelliJIdea2019.3\config\idea64.exe.vmoptions -Djava.library.path=D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\jbr\\bin;D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\jbr\\bin\server -Didea.jre.check=true -Dide.native.launcher=true
 -Didea.paths.selector=IntelliJIdea2019.3 -XX:ErrorFile=C:\Users\Administrator\java_error_in_idea_%p.log -XX:HeapDumpPath=C:\Users\Administrator\java_error_in_idea.hprof
17864 sun.tools.jps.Jps -Denv.class.path=.;C:\Program Files\Java\jdk1.8.0_121\lib;C:\Program Files\Java\jdk1.8.0_121\lib\tools.jar -Dapplication.home=C:\Program Files\Java\jdk1.8.0_121 -Xms8m
20328 org.jetbrains.jps.cmdline.Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=D:/work001/jingmasc/untitled -Dpreload.config.path=C:/Users/Administrator/.IntelliJIdea2019.3/config/option
s -Dexternal.project.config=C:\Users\Administrator\.IntelliJIdea2019.3\system\external_build_system\untitled.ea730363 -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=5883263180847300690 -
Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2019.3 -Didea.home.path=D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5 -Didea.config.path=C:\Users\Administrator/.IntelliJIdea2019.3/config -Didea.plugins.path=C:\Users\Adm
inistrator/.IntelliJIdea2019.3/config/plugins -Djps.log.dir=C:/Users/Administrator/.IntelliJIdea2019.3/system/log/build-log -Djps.fallback.jdk.home=D:/Program Files/JetBrains/IntelliJ IDEA 2019.3.5/jbr -Djps.fallback.jdk.version=11.0.6 -Dio.netty.noUnsafe=true -Dja
va.io

      2、 jstat,监视分析虚拟机运行状态的命令行工具

jstat命令语法:

jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
命令参数说明:
option:参数选项
1. -t:可以在打印的列加上Timestamp列,用于显示系统运行的时间
2. -h:可以在周期性数据输出的时候,指定输出多少行以后输出一次表头
3. vmid:Virtual Machine ID( 进程的 pid)
4. interval:执行每次的间隔时间,单位为毫秒
5. count:用于指定输出多少次记录,缺省则会一直打印

jstat -options (option 可以从下面参数中选择)	
1.-class 用于查看类加载情况的统计
2.-compiler 用于查看HotSpot中即时编译器编译情况的统计
3.-gc 用于查看JVM中堆的垃圾收集情况的统计
4.-gccapacity 用于查看新生代、老生代及持久代的存储容量情况
5.-gcmetacapacity 显示metaspace的大小
6.-gcnew 用于查看新生代垃圾收集的情况
7.-gcnewcapacity 用于查看新生代存储容量的情况
8.-gcold 用于查看老生代及持久代垃圾收集的情况
9.-gcoldcapacity 用于查看老生代的容量
10.-gcutil 显示垃圾收集信息
11.-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次仅当前正在发生的垃圾收集的原因
12.-printcompilation 输出JIT编译的方法信息

例:可以显示gc的信息,查看gc的次数,及时间:

D:\work001\jingmasc\jm-server-admin>jstat -gc 10552
 S0C     S1C     S0U    S1U      EC       EU        OC         OU       MC     MU     CCSC   CCSU      YGC     YGCT    FGC    FGCT     GCT
80384.0 81920.0  0.0    0.0   812544.0 648161.5  237056.0   88188.0   38616.0 36341.7 5248.0 4764.1     13    0.372    3      0.310    0.683

上图各参数说明:
列名	    描述
S0C	        幸存区Survior1 S0空间容量 (kb)
S1C	        幸存区Survior S1空间容量(kb)
S0U		    幸存区Survior1 S0使用空间(kb)
S1U			幸存区Survior S1 使用空间(kb)
EC			Eden 区空间容量(kb)
EU			Eden 区使用空间(kb)
OC			老年代Old空间容量(kb)
OU			老年代Old(kb)
MC			元空间MetaSpace 空间容量(kb)
MU			元空间MetaSpace使用空间(kb)
CCSC		压缩类空间容量(kb)
CCSU		压缩类使用空间(kb)
YGC		    年轻代gc回收数量
YGCT		年轻代gc收集时间
FGC			full gc执行数量
FGCT		full gc 执行总时间
GCT			总垃圾回收时间
      3、 jinfo,查看和调整虚拟机参数的命令行工具

jinfo命令语法:

jinfo [-option]  <pid>
命令参数说明:
option:参数选项
1.no-option  打印命令行标志和系统属性的【name-value】
2.-flag name   打印指定命令行标志的【name-value】对
3.-flag [+/-]name	启用或禁用指定的命令行标志。+表示启用,- 表示禁用
4.-flag name=value	将指定的命令行标志设置为指定的值,不是所有的flag都可以通过命令行改变
5.-flags	打印传递给JVM的命令行标志
6.-sysprops	以【name-value】对的形式打印Java系统属性
7.-h / -help	打印帮助信息

例:查看最大堆内存:

D:\work001\jingmasc\jm-server-admin>jinfo -flag MaxHeapSize 10552
-XX:MaxHeapSize=4265607168
      4、 jmap,生成虚拟机堆内存转储快照的命令行工具

jmap命令语法:

jmap [-option]  <pid>
命令参数说明:
option:参数选项
1.-dump	 生成dump文件
2.-finalizerinfo	以ClassLoader为统计口径输出永久代的内存状态信息
3.-heap	  输出整个堆空间的详细信息,包括GC的使用、堆配置信息,以及内存的使用信息等
4.-histo	输出堆空间中对象的统计信息,包括类、实例数量和合计容量
5.-permstat	  以ClassLoader为统计口径输出永久代的内存状态信息
6.-F	当虚拟机进程对-dump选项没有任何响应时,强制执行生成dump文件

例1:jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况:

D:\work001\jingmasc\jm-server-admin>jmap -heap 10552
Attaching to process ID 10552, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4265607168 (4068.0MB)
   NewSize                  = 89128960 (85.0MB)
   MaxNewSize               = 1421869056 (1356.0MB)
   OldSize                  = 179306496 (171.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 1091043328 (1040.5MB)
   used     = 101573248 (96.8677978515625MB)
   free     = 989470080 (943.6322021484375MB)
   9.309735497507209% used
From Space:
   capacity = 63963136 (61.0MB)
   used     = 19452144 (18.551010131835938MB)
   free     = 44510992 (42.44898986816406MB)
   30.411492019403177% used
To Space:
   capacity = 80216064 (76.5MB)
   used     = 0 (0.0MB)
   free     = 80216064 (76.5MB)
   0.0% used
PS Old Generation
   capacity = 242745344 (231.5MB)
   used     = 90320856 (86.13668060302734MB)
   free     = 152424488 (145.36331939697266MB)
   37.208069374957816% used

22340 interned Strings occupying 1969064 bytes.

例2:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看:

D:\work001\jingmasc\jm-server-admin>jmap -dump:format=b,file=./dump.dat 10552
Dumping heap to D:\work001\jingmasc\jm-server-admin\dump.dat ...
Heap dump file created
      5、 jhat,显示和分析虚拟机的转储快照文件的命令行工具

jhat命令语法:

jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
命令参数说明:
option:参数选项
1.-J< flag >: 因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx
2.-stack false|true: 关闭跟踪对象分配调用堆栈。如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.
3.-refs false|true: 关闭对象引用跟踪。默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。
4.-port port-number: 设置 jhat HTTP server 的端口号. 默认值 7000。
5.-exclude exclude-file: 指定对象查询时需要排除的数据成员列表文件。 例如, 如果文件列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。
6.-baseline exclude-file: 指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用。
7.-debug int: 设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息。
9.-version: 启动后只显示版本信息就退出。

例:jhap会解析jmap生成的dump文件,并在本地启动一个web服务器:

D:\work001\jingmasc\jm-server-admin> jhat -port 9998 ./dump.dat
Reading from ./dump.dat...
Dump file created Mon Mar 13 11:07:55 CST 2023
Snapshot read, resolving...
Resolving 2363820 objects...
Chasing references, expect 472 dots........................................................
.............................................
Eliminating duplicate references.......................................................
.................
Snapshot resolved.
Started HTTP server on port 9998
Server is ready.

jhat加载dump.dat 文件后,即可在浏览器查看,如下图:
在这里插入图片描述

      6、 jstack,生成虚拟机的线程快照的命令行工具

jstack命令语法:

jstack [-option] <pid> // 打印某个进程的堆栈信息
命令参数说明:
option:  参数选项
指令	    说明
1.-F        当jstack指令无响应时,强制打印一个堆栈信息
2.-m	    打印包含Java和C/C++帧的混合模式堆栈跟踪
3.-l	    打印关于锁的其他信息,比如拥有java.util.concurrent ownable同步器的列表
4.-h/-help  打印帮助信息

例:输出线程及锁详情:

D:\work001\jingmasc\jm-server-admin>jstack -l 10552
2023-03-13 20:50:38
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.121-b13 mixed mode):

"logback-9" #300 daemon prio=5 os_prio=0 tid=0x000000002d712800 nid=0x4528 waiting on condition [0x000000000135f000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c1c28810> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - None

      7、 jcmd,虚拟机诊断工具,从JDK 7 提供

jcmd命令语法:

Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
   or: jcmd -l
   or: jcmd -h
命令参数说明:
option:  参数选项
1.pid:   接受诊断命令请求的进程ID。
2.main class: 接受诊断命令请求的进程main类。jcmd会将诊断命令请求发送给指定main class的所有Java进程。
3.command:   command必须是一个有效的jcmd命令,可以使用jcmd pid help命令查看可用的命令列表。如果pid是0,那么command将会被发送给所有Java进程。main class会用来去匹配(局部匹配或全量匹配)。如果未指定任何选项,他将会列出正在运行的Java进程标识符以及用于启动该进程的main class和命令参数(相当于使用了-l参数)
4.PerfCounter.print:  打印指定Java进程上可用的性能计数器。
5.-f filename:   从指定文件中读取命令并执行。在file中,每个命令必须写在单独的一行。以“#”开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有stop关键字的命令,将会终止对file的处理。
6.-l: 查看所有JVM进程。jcmd不使用参数与jcmd -l效果相同。 

例:查看所有JVM进程,类似jps功能:

D:\work001\jingmasc\jm-server-admin>jcmd
8452
10552 com.AdminApplication
9228 sun.tools.jcmd.JCmd
      8、 JConsole,基于JMX的可视化监视和管理工具

              1、启动JConsole
                   mac 在终端输入jconsole即可。
                   windows 在cmd输入jconsole或者找到Java安装目录下bin目录下的jconsole.exe
在这里插入图片描述

              2、JConsole监控页
在这里插入图片描述

      9、 jvisualvm,图形化虚拟机使用情况的分析工具

              1、启动jvisualvm
                   mac 在终端输入jvisualvm即可。
                   windows 在cmd输入jvisualvm或者找到Java安装目录下bin目录下的jvisualvm.exe
在这里插入图片描述
              2、jvisualvm监控页
在这里插入图片描述

      10、 Java Mission Control,监控和管理 Java 应用程序的工具

              1、启动Java Mission Control
                   mac 在终端输入jmc即可。
                   windows 在cmd输入jmc
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值