JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java的JVM调优知识点 jvm调优浅谈

wys521 2024-11-01 15:15:22 精选教程 25 ℃ 0 评论

1、JVM调优的参数可以在哪里设置参数值

通常在Linux系统下之间加参数启动sringboot项目

nohup java -Xms512m -Xmx 1024m -jar xxx.jar --spring.profiles.active=prod &

# nohup :用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行

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

总结:

war包部署在tomcat中设置

修改TOMCAT_HOME/bin/catalina.sh文件

jar包部署在启动参数设置

nohup java -Xms512m -Xmx 1024m -jar xxx.jar --spring.profiles.active=prod &

2、JVM调优的参数都有哪些

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

  • 设置堆空间大小

设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。

-Xms:设置堆的初始化大小,如:1024k/m/g

-Xmx:设置堆的最大大小,如:1024k/m/g

如果不指定单位,默认为字节,指定单位,按照指定的单位设置

堆空间设置多少合适?

最大大小的默认值是物理内存的1/4,初始大小是物理内存的1/64

堆太小,可能会频发的导致年轻代和老年代的垃圾回收,会产生stw,暂停用户线程

对内存大肯定是好的,存在风险,假如发了fullGC,它会扫描整个堆空间,暂停用户线程的时间长

设置参数推荐:尽量大,也要考察一下当前计算机其他程序的内存使用情况

  • 虚拟机栈的设置

每个线程默认会开启1M的内存,用于存放栈帧、调用参数、局部变量等,但一般256k就够用,通常减少每个线程的堆栈,可以产生更多的线程,但这实际上海受限于操作系统。

-Xss 对每个线程stack大小的调整,-Xss138k

  • 年轻代中Eden区和两个Survivor区(幸存区)的大小比例

设置年轻代中Eden区和两个Survivor区的大小比例。该值如果不设置,则默认比例为8:1:1。通过增大Eden区的大小,来减少YGC发生的次数,但有时发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时STW的时间较长,因此需要按照程序情况调优。

-XXSurvivorRatio=8,表示年轻代中的分配比率;survivor:eden = 2.8

  • 年轻代晋升老年代阈值

-XX:MaxTenuringThreashold=threshold

默认为15

取值范围0-15

  • 设置垃圾回收收集器

通过增大吞吐量提高系统性能,可以通过设置并行垃圾回收收集器

-XX:+UseParallelGC

-XX:+UseParallelOldGC

-xx:+UseG1GC

3、JVM调优工具

1、命令工具:

jps 进程状态信息

jstack 查看Java进程内线程的堆栈信息

jmap 查看堆转信息

jhat 堆转存储快照分析工具

jstat JVM统计检测工具

2、可视化工具

jconsole 用于对JVM的内存、线程、类的监控

VisualVM 能够监控线程、内存情况

3、阿里工具阿尔萨斯

4、内存泄露排查思路

内存泄露同城是指堆内存,通常是一些大对象不被回收的情况

1、通过jmap或设置jvm参数获取堆内存快照dump

2、通过工具,VisualVM去分析dump文件,VisualVM可以加载离线的dump文件

3、通过查看堆信息的情况,可以大概定位内存溢出是哪行代码处理问题

4、找到对应的代码,通过阅读上下文的情况,进行修复即可

5、CPU飙高的排查方案与思路

5.1、使用top命令查看占用CPU的情况

# 拿到占用高的进程ID top

5.2、通过top命令查看后,可以查看是哪个进程占用CPU较高

一般top命令排在第一位的是占用较高的那个,也可以搜索具体的应用名称

5.3、使用ps命令查看进程中的线程信息

# 通过上步拿到的进程id查询线程ID

ps H -eo pid,tid,%cpu | grep 进程id

5.4、使用jstack命令查看进程中哪些线程出现了问题,最终定位问题

jstack 线程ID

jstack 命令显示内容中是十进制的地址,需要获取到十进制的线程ID,可以通过Linux命令获取,如下:

printf "%x\n" 线程ID

然后就可以通过这个十进制的线程ID在jstack命令结果文档走搜索具体问题信息了。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表