Jvm调优工具之Jps、Jmap、Jinfo、Jstack、Jstat

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:byteC:charD:doubleF:floatI:intJ:longZ: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的参数有很多,这里只是简单说了几个,具体的参考官方文档。

→→→官方地址跳转链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值