👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,春招努力找工作中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:努力找工作 ");
JVM是什么
jvm是运行Java二进制字节码的环境
好处:一次编写,到处执行;自动内存管理,垃圾回收
组成部分:类加载子系统、运行时数据区、执行引擎、本地方法接口
运行流程
- 源代码编译成clss文件后,由类加载子系统进行对class文件编译成二进制字节码文件;
- 运行时数据区会把字节码文件加载到内存空间;
- 执行引擎会把字节码翻译成底层的系统指令;
- 本地方法接口会调用本地方法完成指令的执行。
JVM调优的参数值在哪里可以设置
war包部署可以在tomacat中设置
- 修改TOMCAT_HOME/bin/catalina.sh文件
jar包部署可以在启动参数中设置
- 通常在linux系统下直接加参数启动springboot项目
常用的JVM调优参数有什么
堆大小的设置: 物理内存的1/64 ~ 1/4
-Xms:堆初始大小
-Xmx:堆最大大小
虚拟机栈的设置: 每个线程默认1m的内存,但一般256k够用
-Xss线程栈大小,-Xss256k
年轻代空间比例设置: 默认8:1:1
-XXSurvivorRatio=8,表示survivor:eden=2:8
年轻代晋升老年代阈值:默认15,大小0~15
-XX:MaxTenuringThreshold=15
设置垃圾回收器
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:+UseG1GC
常用的JVM调优工具
命令工具
- jps:进程状态信息
- jstack:查看Java进程内线程的堆栈信息
- jmap:查看堆栈信息
- jhat:堆转储快照分析工具
- jstat:JVM统计监测工具
可视化工具
- jconsole:对jvm的内存、线程、类的监控
- VisualVM:监控线程、内存情况
使用示例
- 查看Java进程:jps
- 查看Java进程6563的堆栈信息:jstack 6563
- 查看Java进程6563的堆信息:jmap - heap 6563
- 输出Java进程6563的dump文件:map -dump:format=b,file=myheap.hprof 6563
JVM内存溢出的排查思路
- 获取堆内存快照dump
- visualVM分析dump文件
- 通过对信息的情况,定位内存溢出问题
怎么获取dump文件?
方法一:利用jvm参数
- -XX:+HeapDumpOutOfMemoryError -XX:HeapDumpPath=/home/app/dumps/
方法二:利用jmap命令
- jmap -dump:format=b,file=heap.hprof pid进程号
方法三:利用arthas命令
- heapdump /path/xiaofu.hprof
CPU飙高的排查思路
- top命令定位是哪个进程占用cpu过高
- ps H -eo pid,tid,%cpu | grep 进程pid号 定位这个进程中的哪个线程占用cpu
- jstack 进程pid号
- 将定位到的线程id转换成16机制,在第三步中查找对用的线程
cpu飙高发生的原因可能有什么?
- while的无限循环会导致CPU使用率飙升
- 频繁的Young GC会导致CPU使用率飙升
- System.currentTimeMillis() 做计时,大概占用了10-20%cpu,会不停的调用CPU,占用率飙升
最后
慢慢的来,别着急!学会有质量的走过每一步
我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路
欢迎添加小符微信:A13781678921,一起加油