Jps:查看系统中运行的java线程的pid和实例。
[root@iZ2zehycnr2ydxty3aokeaZ jvm]# jps
307890 JstackTest
307977 Jps
Jmap:可以查看内存信息情况的汇总,包含的实例个数以及占用内存大小
#查看所有对象,包括活跃以及非活跃的
jmap -histo <pid> | more
#查看活跃对象
jmap -histo:live <pid> | more
[root@iZ2zehycnr2ydxty3aokeaZ jvm]# jmap -histo 307890 | more
num #instances #bytes class name (module)
-------------------------------------------------------
1: 765 408368 [I (java.base@18.0.1.1)
2: 7165 332008 [B (java.base@18.0.1.1)
3: 1431 176288 java.lang.Class (java.base@18.0.1.1)
4: 7057 169368 java.lang.String (java.base@18.0.1.1)
5: 887 90440 [Ljava.lang.Object; (java.base@18.0.1.1)
6: 6 33016 [C (java.base@18.0.1.1)
7: 996 31872 java.util.HashMap$Node (java.base@18.0.1.1)
8: 897 28704 java.util.concurrent.ConcurrentHashMap$Node (java.base@18.0.1.1)
9: 258 23776 [Ljava.util.HashMap$Node; (java.base@18.0.1.1)
10: 17 19024 [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base@18.0.1.1)
11: 258 12384 java.util.HashMap (java.base@18.0.1.1)
12: 341 10912 jdk.internal.math.FDBigInteger (java.base@18.0.1.1)
13: 362 8688 java.lang.module.ModuleDescriptor$Exports (java.base@18.0.1.1)
14: 256 6144 java.lang.Long (java.base@18.0.1.1)
15: 248 5952 java.util.ImmutableCollections$Set12 (java.base@18.0.1.1)
16: 62 4960 java.net.URI (java.base@18.0.1.1)
17: 132 4224 java.lang.module.ModuleDescriptor$Requires (java.base@18.0.1.1)
18: 256 4096 java.lang.Byte (java.base@18.0.1.1)
19: 256 4096 java.lang.Integer (java.base@18.0.1.1)
20: 256 4096 java.lang.Short (java.base@18.0.1.1)
21: 62 3968 java.lang.module.ModuleDescriptor (java.base@18.0.1.1)
22: 68 3808 java.lang.Module (java.base@18.0.1.1)
23: 62 3472 jdk.internal.module.ModuleReferenceImpl (java.base@18.0.1.1)
24: 9 3312 java.lang.Thread (java.base@18.0.1.1)
25: 137 3288 java.util.ImmutableCollections$SetN (java.base@18.0.1.1)
26: 195 3120 java.util.HashSet (java.base@18.0.1.1)
27: 39 2496 java.util.concurrent.ConcurrentHashMap (java.base@18.0.1.1)
28: 128 2048 java.lang.Character (java.base@18.0.1.1)
29: 61 1952 jdk.internal.loader.BuiltinClassLoader$LoadedModule (java.base@18.0.1.1)
30: 62 1488 java.lang.module.ResolvedModule (java.base@18.0.1.1)
31: 62 1488 jdk.internal.module.ServicesCatalog$ServiceProvider (java.base@18.0.1.1)
32: 62 1488 jdk.internal.module.SystemModuleFinders$2 (java.base@18.0.1.1)
33: 60 1440 java.lang.module.ModuleDescriptor$Provides (java.base@18.0.1.1)
34: 1 1376 [Ljdk.internal.math.FDBigInteger; (java.base@18.0.1.1)
35: 5 1320 [J (java.base@18.0.1.1)
36: 50 1200 java.util.ImmutableCollections$List12 (java.base@18.0.1.1)
37: 67 1072 java.lang.Object (java.base@18.0.1.1)
38: 1 1040 [Ljava.lang.Byte; (java.base@18.0.1.1)
39: 1 1040 [Ljava.lang.Integer; (java.base@18.0.1.1)
40: 1 1040 [Ljava.lang.Long; (java.base@18.0.1.1)
41: 1 1040 [Ljava.lang.Short; (java.base@18.0.1.1)
42: 60 960 jdk.internal.module.SystemModuleFinders$3 (java.base@18.0.1.1)
43: 21 840 java.io.ObjectStreamField (java.base@18.0.1.1)
44: 30 720 java.util.concurrent.CopyOnWriteArrayList (java.base@18.0.1.1)
45: 26 624 java.util.jar.Attributes$Name (java.base@18.0.1.1)
46: 19 608 java.util.Locale (java.base@18.0.1.1)
47: 19 608 sun.util.locale.BaseLocale (java.base@18.0.1.1)
48: 10 584 [Ljava.lang.String; (java.base@18.0.1.1)
49: 1 528 [Ljava.lang.Character; (java.base@18.0.1.1)
50: 13 520 java.security.AccessControlContext (java.base@18.0.1.1)
51: 12 480 java.lang.OutOfMemoryError (java.base@18.0.1.1)
52: 1 376 java.lang.ref.Finalizer$FinalizerThread (java.base@18.0.1.1)
53: 1 376 jdk.internal.misc.InnocuousThread (java.base@18.0.1.1)
54: 1 368 java.lang.ref.Reference$ReferenceHandler (java.base@18.0.1.1)
55: 14 336 java.util.ImmutableCollections$ListN (java.base@18.0.1.1)
56: 4 320 [S (java.base@18.0.1.1)
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
num:序号
instances:实例数量
bytes:占用空间大小
class name:B:byte; C:char; D:double; F:float; I:int; J:long; Z:boolean; [:数组,如[I表示int[]; [L+类名:其它对象;
#查看内存使用情况
#jdk8之前使用
jmap -heap <进程id>
#jdk8以上使用命令
jhsdb jmap --heap --pid 307890
[root@iZ2zehycnr2ydxty3aokeaZ jvm]# jhsdb jmap --heap --pid 307890
Attaching to process ID 307890, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 18.0.1.1+2-6
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 452984832 (432.0MB)
NewSize = 9764864 (9.3125MB)
MaxNewSize = 150994944 (144.0MB)
OldSize = 19595264 (18.6875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 22020096 (21.0MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 8847360 (8.4375MB)
used = 475832 (0.45378875732421875MB)
free = 8371528 (7.983711242675781MB)
5.378237123842593% used
Eden Space:
capacity = 7929856 (7.5625MB)
used = 475832 (0.45378875732421875MB)
free = 7454024 (7.108711242675781MB)
6.000512493543388% used
From Space:
capacity = 917504 (0.875MB)
used = 0 (0.0MB)
free = 917504 (0.875MB)
0.0% used
To Space:
capacity = 917504 (0.875MB)
used = 0 (0.0MB)
free = 917504 (0.875MB)
0.0% used
tenured generation:
capacity = 19595264 (18.6875MB)
used = 962560 (0.91796875MB)
free = 18632704 (17.76953125MB)
4.912207357859532% used
Heap Configuration: 堆内存的参数配置信息;
Heap Usage: 堆内存使用情况;
Eden Space: 新生代eden区内存使用情况;
From Space: 新生代s0区内存使用情况;
To Space: 新生代s1区内存使用情况;
网上有很多用jmap导出dump文件堆用工具进行堆内存使用分析的,个人感觉这种方法不适用用生产环境,生产环境如果允许可以使用阿里的Arthas,或者在项目启动启动过程中添加dump打印日志,然后将dump文件取出生产环境分析。
#服务启动添加jvm参数(不推荐使用)
‐XX:+PrintGCDetails ‐XX:+HeapDumpOnOutOfMemoryError ‐XX:HeapDumpPxath=***/dumpFileName
Jinfo:查看正在运行的Java应用程序的扩展参数
#查看服务启动的参数
jinfo -flags pid
#查看java系统参数
jinfo -sysprops pid
[root@iZ2zehycnr2ydxty3aokeaZ ~]# jinfo -flags 310147
VM Flags:
-XX:CICompilerCount=2 -XX:InitialHeapSize=29360128 -XX:MaxHeapSize=452984832 -XX:MaxNewSize=150994944 -XX:MinHeapDeltaBytes=196608 -XX:MinHeapSize=8388608 -XX:NewSize=9764864 -XX:NonNMethodCodeHeapSize=5826188 -XX:NonProfiledCodeHeapSize=122916026 -XX:OldSize=19595264 -XX:ProfiledCodeHeapSize=122916026 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:SoftMaxHeapSize=452984832 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseSerialGC
[root@iZ2zehycnr2ydxty3aokeaZ jvm]# jinfo -sysprops 307890
Java System Properties:
#Thu Jun 23 17:02:09 CST 2022
file.encoding=UTF-8
file.separator=/
java.class.path=.
java.class.version=62.0
java.home=/usr/local/jdk/jdk-18.0.1.1
java.io.tmpdir=/tmp
java.library.path=/usr/java/packages/lib\:/usr/lib64\:/lib64\:/lib\:/usr/lib
java.runtime.name=Java(TM) SE Runtime Environment
java.runtime.version=18.0.1.1+2-6
java.specification.name=Java Platform API Specification
java.specification.vendor=Oracle Corporation
java.specification.version=18
java.vendor=Oracle Corporation
java.vendor.url=https\://java.oracle.com/
java.vendor.url.bug=https\://bugreport.java.com/bugreport/
java.version=18.0.1.1
java.version.date=2022-04-22
java.vm.compressedOopsMode=32-bit
java.vm.info=mixed mode, sharing
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Oracle Corporation
java.vm.specification.version=18
java.vm.vendor=Oracle Corporation
java.vm.version=18.0.1.1+2-6
jdk.debug=release
line.separator=\n
native.encoding=UTF-8
os.arch=amd64
os.name=Linux
os.version=4.18.0-193.14.2.el8_2.x86_64
path.separator=\:
sun.arch.data.model=64
sun.boot.library.path=/usr/local/jdk/jdk-18.0.1.1/lib
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.java.command=com.lcf.jvm.JstackTest
sun.java.launcher=SUN_STANDARD
sun.jnu.encoding=UTF-8
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
sun.stderr.encoding=UTF-8
sun.stdout.encoding=UTF-8
user.country=US
user.dir=/usr/local
user.home=/root
user.language=en
user.name=root
user.timezone=Asia/Shanghai
Jstack:查看jvm线程堆栈的常用工具命令,可以获取每个线程内部的调用链以及每个线程当前的运行状态从而可以分析出死锁、循环、响应慢等性能问题。监控java程序运行过程发生问题或者崩溃的代码块。
→→→通过Jstack工具查找服务器cpu使用率暴增到100%
Jstat:可以监控jvm的运行状态,类加载情况,jvm内存使用和GC垃圾回收以及JIT编译信息等数据。
#查看当前一次jvm虚拟机运行的情况
jstat -gc pid
#查看jvm使用情况,每过一秒打印一次
jstat -gc pid 1000(毫秒)
#查看jvm使用情况,每过一秒打印一次,总共打印十次
jstat -gc pid 1000(毫秒) 10
[root@iZ2zehycnr2ydxty3aokeaZ ~]# jstat -gc 310147 1000
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
896.0 896.0 0.0 0.0 7744.0 309.8 19136.0 940.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 - - 0.000
#S0C:第一个幸存区的大小,单位KB
#S1C:第二个幸存区的大小
#S0U:第一个幸存区的使用大小
#S1U:第二个幸存区的使用大小
#EC:伊甸园区的大小
#EU:伊甸园区的使用大小
#OC:老年代大小
#OU:老年代使用大小
#MC:方法区大小(元空间)
#MU:方法区使用大小
#CCSC:压缩类空间大小
#CCSU:压缩类空间使用大小
#YGC:年轻代垃圾回收次数
#YGCT:年轻代垃圾回收消耗时间,单位s
#FGC:老年代垃圾回收次数
#FGCT:老年代垃圾回收消耗时间,单位s
#GCT:垃圾回收消耗总时间,单位s
→→→通过Jstat工具来对程序优化
jvm的参数有很多,这里只是简单说了几个,具体的参考官方文档。