JDK监控和故障处理命令有 jps
、jstat
、jmap
、jhat
、jstack
、jinfo
。
jps:显示指定系统内所有的 HotSpot 虚拟机进程。
jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。
jstat -options
例:
[root@host /]# jstat -gc 500991
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CSU YGC YGCT FGC FGCT GCT
512.0 1024.0 0.0 600.1 90112.0 72763.9 729088.0 31753.9 69720.0 66252.1 8320.0 7738.2 367 4.329 3 0.739 5.067
jmap:可dump堆内容进行分析
常用命令:
jmap [pid] # 查看具体情况
jmap -dump:live,format=b,file=xxx.xxx [pid] #将当前Java进程的内存占用情况导出来
jmap -histo:live [pid] >a.log # 显示 存活 得对象信息
jmap -finalizerinfo [pid] # 查看 等待执行finalize 方法的数量
jmap -heap [pid] # 堆摘要信息
[root@host xxx]# jmap -heap 500991
Attaching to process ID 500991, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
using thread-local object allocation.
Parallel GC with 10 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 16819159040 (16040.0MB)
NewSize = 350748672 (334.5MB)
MaxNewSize = 5606211584 (5346.5MB)
OldSize = 702021632 (669.5MB)
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 = 92274688 (88.0MB)
used = 32007552 (30.5247802734375MB)
free = 60267136 (57.4752197265625MB)
34.68725031072443% used
From Space:
capacity = 524288 (0.5MB)
used = 482840 (0.46047210693359375MB)
free = 41448 (0.03952789306640625MB)
92.09442138671875% used
To Space:
capacity = 1048576 (1.0MB)
used = 0 (0.0MB)
free = 1048576 (1.0MB)
0.0% used
PS Old Generation
capacity = 746586112 (712.0MB)
used = 32515968 (31.0096435546875MB)
free = 714070144 (680.9903564453125MB)
4.355287016107795% used
jhat(JVM Heap Analysis Tool)命令是与 jmap 搭配使用,用来分析 jmap 生成的 dump,jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 的分析结果后,可以在浏览器中查看。
在此要注意,一般不会直接在服务器上进行分析,因为 jhat 是一个耗时并且耗费硬件资源的过程,一般把服务器生成的 dump 文件复制到本地或其他机器上进行分析。
参考:https://blog.csdn.net/weixin_42272869/article/details/124190855
正常我们是通过jmap dump下堆内存使用文件后使用idea插件jprofiler来进行分析。
Mac安装JProfiler和IDE集成 记得单独整理下。。。
通过下面命令dump下来快照文件,通过jprofiler进行分析:
jmap -dump:live,format=b,file=dump.bin 500991
jstack 用于生成 java 虚拟机当前时刻的线程快照。
线程快照是当前 java 虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
调优手段
//设置Serial垃圾收集器(新生代)
开启:-XX:+UseSerialGC
//设置PS+PO,新生代使用功能Parallel Scavenge 老年代将会使用Parallel Old收集器
开启 -XX:+UseParallelOldGC
//CMS垃圾收集器(老年代)
开启 -XX:+UseConcMarkSweepGC
//设置G1垃圾收集器
开启 -XX:+UseG1GC
//设置堆初始值
指令1:-Xms2g
指令2:-XX:InitialHeapSize=2048m
//设置堆区最大值
指令1:`-Xmx2g`
指令2: -XX:MaxHeapSize=2048m
//新生代内存配置
指令1:-Xmn512m
指令2:-XX:MaxNewSize=512m
//GC停顿时间,垃圾收集器会尝试用各种手段达到这个时间
-XX:MaxGCPauseMillis
//survivor区和Eden区大小比率
指令:-XX:SurvivorRatio=6 //S区和Eden区占新生代比率为1:6,两个S区2:6
//新生代和老年代的占比
-XX:NewRatio=4 //表示新生代:老年代 = 1:4 即老年代占整个堆的4/5;默认值=2
//进入老年代最小的GC年龄,年轻代对象转换为老年代对象最小年龄值,默认值7
-XX:InitialTenuringThreshol=7
//新生代可容纳的最大对象,大于则直接会分配到老年代,0代表没有限制。
-XX:PretenureSizeThreshold=1000000
//使用多少比例的老年代后开始CMS收集,默认是68%,如果频繁发生SerialOld卡顿,应该调小
-XX:CMSInitiatingOccupancyFraction
//G1混合垃圾回收周期中要包括的旧区域设置占用率阈值。默认占用率为 65%
-XX:G1MixedGCLiveThresholdPercent=65
XX:MaxDirectMemorySize