关于JVM调优与实践

1.如何开始JVM调优

——tomcat内部署war包

修改TOMCAT_HOME/bin/catalina.sh文件

JAVA_OPTS="-Xms512m -Xmx1024m"

——linux环境下jar包启动springboot项目

启动时使用

nohup java -Xms512m -Xmx1024m -jar x.jar --spring.profiles.active=prod &

nohup:在系统后天不挂断地运行命令,退出终端不影响程序运行

java:启动java虚拟机

-Xms512m:堆初始化大小为0.5GB

-Xmx1024m:堆最大大小为1GB

-jar x.jar:指定要运行的jar文件

--spring.profiles.active:表示启动时使用的是生产环境

&:让命令在后台执行,终端退出后命令仍执行

 

2.JVM都有哪些调优参数

JVM调优主要是调整年轻代,老年代,元空间的内存大小以及使用的垃圾回收器类型

# 堆设置
# 初始化内存推荐为物理内存的1/64;最大设置推荐为物理内存1/4
# 堆太小会导致频繁发生年轻代与老年代的垃圾回收,产生STW影响用户体验
# 堆太大也会存在风险,如果发生了fullgc,会产生一个长时间的STW
-Xms:堆的初始化大小
-Xmx:堆的最大大小 # 不指定单位默认为自己,单位有:k,m,g

# 虚拟机栈设置,每个线程默认开启1m内存:存放栈帧、参数、局部变量
-Xss256k 对线程的stack大小设置,一般推荐256/512k

# 调整eden和survivor区,默认情况下为8:2。增大eden区会减少YGC(youngGC)次数,但是STW时间会延长
-XXSurvivorRatio=8 # 表示年轻代的分配比例,该情况就是默认的survivor:eden=2:8
# 年轻代晋升老年代阈值 默认值为15,取值范围0~15
-XX:MaxTenuringThreshold=threshold


# 设置垃圾回收器
-XX:+UseParallelGC
-XX:+userParallelOldGC

-XX:+UseG1GC

 

3.JVM调优用到哪些工具

  • jps:进程状态信息
  • jstack:查看堆栈内的线程信息,这里的pid通过jps可获取
    • jstack [option] <pid>
  • jmap:用于生成堆转内存快照、内存使用情况
    • jmap -heap pid # 用于显示堆的信息
    • jmap -dump:format=b,flie=heap.hprof pid  # 该指令用于生成hprof文件,format=b表示以hprof二进制格式转储Java堆的新出,file=用于指定快照dump文件的名称
  • jstat:JVM统计监测工具,用来显示垃圾回收信息、类加载信息、新生代统计信息
    • jstat -gcutil pid # 以使用百分比的形式对垃圾回收统计
    • jstat -gc pid # 以实际大小的形式对垃圾回收统计

可视化工具

  • jconsole:对jvm的线程、内存、类的监控
  • visualVM:能够监控线程,内存情况,查看方法的CPU时间和内存对象。只有jdk8有,后续版本不自带,需要去官网下载

 

4.内存泄漏排查问题思路

--内存泄漏通常是指堆内存一些大对象不被回收的情况

通过jmap指令获取dump文件/通过vm参数获取dump文件

// vm指令
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/app/dumps/

使用visualVM加载dump文件:在文件选项卡中选择装入

通过查看堆信息,定位内存溢出为止

 

5.CPU飙升解决思路

linux通过top指令查看CPU占用排行榜

top

在通过ps查看进程中所有线程信息

ps H -eo pid,tid,%cpu | grep <pid>

通过tid获取16进制转换

printf"%x\n" <tid>

根据16进制tid通过jstack去查看线程nid具体信息

jstack <pid>
posted @ 2024-11-07 19:56  天启A  阅读(29)  评论(0)    收藏  举报