JVM命令

常用java命令

  1. jps——查看虚拟机进程信息
    jps [options]
  • 第一列是VMpid,第二列class或jar的名称
  • hostid指定主机,不写为当前机器,格式 [protocol:]<<//>hostname><:port>
  • q:仅显示lvmid;
  • -m:输出主函数传入的参数;
  • -l: 输出应用程序主类完整package名称或jar完整名称;
  • -v: 输出jvm启动时指定的jvm参数;
  • -V: 输出通过.hotsportrc或-XX:Flags=指定的jvm参数

2.jstat——显示虚拟机运行时状态信息
jstat [options] [intervals[s|ms]] [count]
intervals:输出间隔时间
count:输出总次数
option参数:

  • class 加载class的数量,字节大小和未加载的class数量大小以及加载时间
    $ jstat -class 11589
    Loaded Bytes Unloaded Bytes Time
    7035 14506.3 0 0.0 3.67
  • compiler HotSpot JIT编译器行为统计
    $ jstat -compiler 1262
    Compiled Failed Invalid Time FailedType FailedMethod
    2573 1 0 47.60 1 org/apache/catalina/loader/WebappClassLoader findResourceInternal
  • gc 分别输出survivoro、Eden和老年代的空间和已用空间大小,以及年轻代和老年代gc的次数,耗时以及gc总耗时
    $ jstat -gc 1262
    S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
    26112.0 24064.0 6562.5 0.0 564224.0 76274.5 434176.0 388518.3 524288.0 42724.7 320 6.417 1 0.398 6.815

  • gccapacity 除上条输出信息外,还输出每个堆区域的最小(大)空间限制
    $ jstat -gccapacity 1262
    NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
    614400.0 614400.0 614400.0 26112.0 24064.0 564224.0 434176.0 434176.0 434176.0 434176.0 524288.0 1048576.0 524288.0 524288.0 320 1

  • gccasue 同gcutil,和最后一次执行gc的原因以及当前执行gc的原因
    $ jstat -gccause 28920
    S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
    12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242 Allocation Failure No GC
  • gcnew 输出新生代空间的gc性能数据
  • gcnewcapacity 新生代空间大小的统计数据
  • gcold 老年代空间的gc性能数据
  • gcoldcapacity 老年代空间大小的统计数据
  • gcpermcapacity 持久代的空间大小统计数据
  • gcutil 同gc,只不过输出的是已使用空间占总空间的百分比
    $ jstat -gcutil 28920
    S0 S1 E O P YGC YGCT FGC FGCT GCT
    12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242
  • printcompilation HotSpot编译方法统计
  1. jstack——查看线程调用栈信息
    jstack [option] LVMID
  • LVMID:jps命令,或将占用cpu或其他资源多的pid找出来(可以通过top命令),然后转成16进制的数,即为lvmid
  • -F : 当正常输出请求不被响应时,强制输出线程堆栈
  • -l : 除堆栈外,显示关于锁的附加信息
  • -m : 如果调用到本地方法的话,可以显示C/C++的堆栈
  1. jmap [ -option ] –生成heap dump文件
  • dump,-dump[:live,]format=b,file=,live说明是否只dump存活的对象.或者使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件
  • heap 显示堆详细信息,如使用哪种回收器、参数配置、分代情况等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ jmap -heap 28920
Attaching to process ID 28920, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)//GC 方式

Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 2082471936 (1986.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 1310720 (1.25MB)//对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 17592186044415 MB//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 5439488 (5.1875MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize = 21757952 (20.75MB) //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
MaxPermSize = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
G1HeapRegionSize = 0 (0.0MB)

Heap Usage://堆内存使用情况
PS Young Generation
Eden Space://Eden区内存分布
capacity = 33030144 (31.5MB)//Eden区总容量
used = 1524040 (1.4534378051757812MB) //Eden区已使用
free = 31506104 (30.04656219482422MB) //Eden区剩余容量
4.614088270399305% used //Eden区使用比率
From Space: //其中一个Survivor区的内存分布
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
To Space: //另一个Survivor区的内存分布
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
PS Old Generation //当前的Old区内存分布
capacity = 86507520 (82.5MB)
used = 0 (0.0MB)
free = 86507520 (82.5MB)
0.0% used
PS Perm Generation//当前的 “永生代” 内存分布
capacity = 22020096 (21.0MB)
used = 2496528 (2.3808746337890625MB)
free = 19523568 (18.619125366210938MB)
11.337498256138392% used

670 interned Strings occupying 43720 bytes.
  • finalizerinfo 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • histo 显示堆中对象统计信息,包括类,实例数量和合计数量
1
2
3
4
5
6
7
8
9
10
11
12
13
$ jmap -histo:live 28920 | more
num #instances #bytes class name
----------------------------------------------
1: 83613 12012248 <constMethodKlass>
2: 23868 11450280 [B
3: 83613 10716064 <methodKlass>
4: 76287 10412128 [C
5: 8227 9021176 <constantPoolKlass>
6: 8227 5830256 <instanceKlassKlass>
7: 7031 5156480 <constantPoolCacheKlass>
8: 73627 1767048 java.lang.String
9: 2260 1348848 <methodDataKlass>
10: 8856 849296 java.lang.Class

class name:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象

  • permstat 打印永久代统计信息
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ jmap -permstat 28920
    Attaching to process ID 28920, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 24.71-b01
    finding class loader instances ..done.
    computing per loader stat ..done.
    please wait.. computing liveness.liveness analysis may be inaccurate ...

    class_loader classes bytes parent_loader alive? type
    <bootstrap> 3111 18154296 null live <internal>
    0x0000000600905cf8 1 1888 0x0000000600087f08 dead sun/reflect/DelegatingClassLoader@0x00000007800500a0
    0x00000006008fcb48 1 1888 0x0000000600087f08 dead sun/reflect/DelegatingClassLoader@0x00000007800500a0
    0x00000006016db798 0 0 0x00000006008d3fc0 dead java/util/ResourceBundle$RBClassLoader@0x0000000780626ec0
    0x00000006008d6810 1 3056 null dead sun/reflect/DelegatingClassLoader@0x00000007800500a0
  • F当-dump没有响应时,强制生成dump快照

  1. jhat(JVM Heap Analysis Tool),用来分析jmap 生成的dump(耗费资源,一般将服务器的dump拷贝下来分析,MAT分析比jhat更好点)
    jhat [dumpfile]
    $ jhat -J-Xmx512m dump.hprof
    浏览器访问Http://localhost:7000即可
  2. jinfo jps -v口令只能查看到显式指定的参数,如果想要查看未被显式指定的参数的值
    jinfo [option] [args] LVMID
    -flag : 输出指定args参数的值
    -flags : 不需要args参数,输出所有JVM参数的值
    -sysprops : 输出系统属性,等同于System.getProperties()
  3. jdps
    jdps <classses…>
    用来分析.class文件,目录或jar文件的路径名

    jdps -R -doutput ~/tmp HelloWorld.class
    jdps -p java.lang xxx.jar
    查看jar包的所有package(模块信息)
    jdps –inverse –require java.lang(jdk9以上)
    查看当前目录和环境路径下那些包依赖指定的包

    JVM参数配置分析

配置文件位置:eclipse.ini、TOMCAT_HOME/bin/catalina.sh(.bat)、idea有-vm option

坚持原创技术分享,您的支持将鼓励我继续创作!