【README】
本文总结自《黑马程序员视频教程》,墙裂推荐;
本文内容包括:
- jvm调优
- jvm调优工具
- oom排查思路及方法;
- CPU使用率升高排查思路;
【1】jvm调优参数设置
- war包部署在tomcat中设置;
- 修改 TOMCAT_HOME/bin/catalina.sh 文件;
- JAVA_OPS=”-Xms512m -Xmx1024m”
- 修改 TOMCAT_HOME/bin/catalina.sh 文件;
- jar包部署在启动参数设置:启动springboot项目:
- nohup java -Xms512m -Xmx1024m -jar xxx.jar --spring.profiles.active=prod &
- Nohup: 用于在系统后端不挂断的运行命令,退出终端不会影响程序运行;
- 参数&:让命令在后台执行,终端退出后命令仍旧执行;
- nohup java -Xms512m -Xmx1024m -jar xxx.jar --spring.profiles.active=prod &
【2】jvm调优参数有哪些?
- Jvm调优参数列表;
- 设置堆空间大小;
- 虚拟机栈的设置;
- 年轻代中eden区和两个survivor区的大小比例;
- 年轻代晋升老年代阈值;
- 设置垃圾收回器;
补充:jvm调优参数参考官方文档:
va HotSpot VM Options】https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
- 设置堆空间:
- 参数(单位默认为字节):
- -Xms:1024m:设置堆初始化值;
- -Xmx:2g:设置堆最大内存;
- 堆空间设置为多少合适?
- 最大值设置为物理内存的1/4; 初始大小为 1/64;
- 堆太小,可能导致频繁回收,产生stw,暂停用户线程;
- 堆太大,存在风险;发生fullgc时,扫描整个堆空间,导致stw耗时长,暂停用户线程时间长;
- 参数(单位默认为字节):
- 虚拟机栈设置:
- 每个线程默认开启1M内存,用于存放栈帧(调用参数,局部变量等); 一般设置为256k;
- 减少每个线程堆栈,可以产生更多线程;
- 参数:-Xss128k: 对每个线程stack的调整;
- 年轻代中eden区和两个Survivor的比例设置:
- -XXSurvivorRatio=8 表示年轻代中survivor:eden=2:8
- 年轻代晋升为老年代阈值:
- -XX:MaxTenuringThreshold=threshold
- 默认为15,取值范围1~15
- 设置垃圾回收器:
- -XX:+UseParallelGC
- -XX:+UseParallelOldGC
- -XX:+UseG1GC
【3】jvm调优工具
- 命令工具:
- jps:查看正在运行的进程息;
- jstack:查看java进程内线程堆栈信息;
- jmap:查看堆转信息;
- jhat:堆转储快照分析工具;
- jstat:jvm统计检测工具 ;
- 可视化工具:
- jconsole: 用于对jvm的内存,线程,类的监控;
- VisualVM: 能够监控线程,内存情况;
【3.1】命令工具
【3.1.1】jps-查看正在运行的进程
D:\workbench_idea\java8test>jps
16864
8664 JpsCommandDemo
18348 Jps
18732 Launcher
【3.1.2】jstack-查看进程内线程信息
D:\workbench_idea\java8test>jstack 8664
2023-09-02 11:30:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.172-b11 mixed mode):
.................................
【3.1.3】 jmap-生成堆转内存快照,内存使用情况
1) jmap -heap pid 查看堆转内存快照
D:\workbench_idea\java8test>jmap -heap 8664
Attaching to process ID 8664, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4253024256 (4056.0MB)
NewSize = 88604672 (84.5MB)
MaxNewSize = 1417674752 (1352.0MB)
OldSize = 177733632 (169.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 = 66584576 (63.5MB)
used = 9337216 (8.9046630859375MB)
free = 57247360 (54.5953369140625MB)
14.023091473917322% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation
capacity = 177733632 (169.5MB)
used = 0 (0.0MB)
free = 177733632 (169.5MB)
0.0% used
3517 interned Strings occupying 287072 bytes.
2)jmap -dump:format=b,file=d:/temp/jmap_temp.hprof 8664 :【非常重要】
把进程id 为8664的进程内存快照转储到 jmap_temp.hprof 文件;
D:\workbench_idea\java8test>jmap -dump:format=b,file=d:/temp/jmap_temp.hprof 8664
Dumping heap to D:\temp\jmap_temp.hprof ...
Heap dump file created
2.1)如何打开这个文件? 使用 visualVM 打开;
点击文件,选择装入,选择对应的 hprof文件(堆转储);
【3.1.4】jstat -jvm统计检测工具
用来显示垃圾回收信息,类加载信息,新生代统计信息等;
- 1)总结垃圾回收统计: jstat -gcutil pid
- 2)垃圾回收统计: jstat -gc pid
D:\workbench_idea\java8test>jstat -gcutil 8664
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 14.02 0.00 17.30 19.90 0 0.000 0 0.000 0.000
D:\workbench_idea\java8test>jstat -gc 8664
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
10752.0 10752.0 0.0 0.0 65024.0 9118.4 173568.0 0.0 4480.0 775.1 384.0 76.4 0 0.000 0 0.000 0.000
【3.2】可视化工具
【3.2.1】jconsole
用于对jvm内存,线程,类的监控,是一个基于 jmx的GUI性能监控工具 ;
【3.2.2】VisualVM
能够监控线程,内存情况,查看方法的cpu时间和内存中的对象,已被GC对象,反向查看分配的堆栈;
【4】内存溢出排查
1)构建内存溢出场景
public class OOMTest {
public static void main(String[] args) {
ArrayList<String> userNameList = new ArrayList<>();
while(true) {
userNameList.add("zhangsan") ;
}
}
}
步骤1)设置jvm运行参数:
(使用jvm 运行参数获取 dump文件:有些情况是内存溢出后程序中断,而 jmap 打印的是运行程序,所以可以通过ijvm运行参数生成dump文件)
-Xmx10m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\temp\jvm_jmap
运行后,抛oom异常如下:
步骤2)使用 VisualVm 分析dump文件;
jdk/bin/jvisualvm.exe 运行,点击左上角文件按钮,选择装入, 选择 hprof文件;
步骤3)点击显示线程,可以查看oom的代码栈;
【5】 cpu使用率升高排查思路
- 使用 top 命令查看cpu使用情况;(找出使用cpu最多的pid=2266)
- ps H -eo pid,tid,%cpu | grep 2266 :打印cpu中进程2266所有线程使用cpu情况;
- Jstack 2266(pid): 打印进程2266的所有线程;
- 从打印结果中找到第2步线程id对应的代码行号;