JVM调优详解(万字图文全面总结)

JVM调优详解(万字图文全面总结)-mikechen

JVM调优属于JVM非常重要的内容,下面我就重点来详解JVM调优相关的参数,以及JVM调优步骤等内容@mikechen

JVM调优定义

JVM调优是指通过对JVM运行时参数和垃圾回收机制进行配置和优化,从而使Java应用程序在运行时表现更好的过程。

 

 

JVM调优原则

JVM性能调优的原则如下:

1.优先调整堆内存大小

堆内存大小是影响JVM性能的重要因素,需要根据应用程序的内存使用情况适当调整初始堆大小(-Xms)和最大堆大小(-Xmx),以避免频繁的Full GC。

 

2.根据应用程序的内存使用情况调整年轻代大小

年轻代内存大小会影响GC的频率和时间,需要根据应用程序的内存使用情况适当调整年轻代大小(-Xmn)。

 

3.根据应用程序的并发情况选择垃圾回收器

垃圾回收器的选择要根据应用程序的并发情况来确定,如果应用程序有较高的并发性,建议选择CMS或G1垃圾回收器。

 

4.尽量避免Full GC

Full GC会导致应用程序长时间停止,需要根据应用程序的内存使用情况和GC日志进行调整,尽可能避免Full GC的发生。

 

5.监控JVM性能

需要实时监控JVM的性能指标,包括内存使用情况、GC时间、GC频率等指标,及时发现问题并进行调整和优化。

 

6.建议使用64位JVM

64位JVM支持更大的堆内存,可以更好地处理大量数据和高并发情况,建议在服务器上使用64位JVM。

 

JVM调优参数

JVM调优参数是指在JVM启动时设置的一组参数,用于优化JVM的性能。

JVM调优参数,主要包含如下:

JVM调优详解(万字图文全面总结)-mikechen

1.JVM初始分配的堆内存大小

参数:

-Xms

JVM初始分配的堆内存大小,默认是物理内存的1/64。

例如:-Xms1g表示初始堆内存大小为1GB。

2. JVM最大分配的堆内存大小

JVM最大分配的堆内存大小,默认是物理内存的1/4。

参数:

-Xmx

例如:-Xmx2g表示最大堆内存大小为2GB。

一般设置-Xms、-Xmx这两个参数相等,可以避免在每次GC 后动态调整堆的大小带来的影响。

 

3.设置新生代的内存大小

参数:

-Xmn

例如:Xmn2g设置年轻代大小为2G。

 

4.设置每个线程的栈内存大小

参数;

-Xss

例如:Xss512k,设置线程栈大小为512K。

 

5.调整新生代和老年代的比例

参数:

-XX:NewRatio

例如:-XX:NewRatio=2表示年轻代和老年代的比例为1:2。

 

8.调整Eden区和Survivor区的比例

XX:SurvivorRatio 用于设置新生代中 survivor 空间(from/to)和 eden 空间的大小比例。

参数:

-XX:SurvivorRatio

例如:-XX:SurvivorRatio=8表示Eden区和Survivor区的比例为8:1:1。

 

9.在内存溢出错误发生时自动生成堆转储文件

参数:

-XX:+HeapDumpOnOutOfMemoryError

内存溢出错误发生时自动生成堆转储文件,以便后续分析。

 

 

JVM性能调优

JVM调优详解(万字图文全面总结)-mikechen

JVM性能调优主要包含以下方法,大概分为5个步骤:

1.监控GC的状态

使用各种JVM调优工具,查看当前日志,分析当前JVM调优参数设置,并且分析当前堆内存快照和gc日志。

根据实际的各区域内存划分和GC执行时间,觉得是否进行优化。

举一个例子: 系统崩溃前的一些现象:

  •  每次垃圾回收的时间越来越长;
  •  FullGC的次数越来越多;
  • 逐渐到达OutOfMemoryError的临界值;

这个时候就需要分析JVM内存快照dump。

2.生成堆的dump文件

可以通过Java的jmap命令来生成该文件,需要分析dump文件。

 

3.分析dump文件

打开这个3G的堆信息文件,显然一般的Window系统没有这么大的内存,必须借助高配置的Linux,几种工具打开该文件:

  •  Visual VM;
  •  MAT;
  •  JDK 自带的Hprof工具等;

文件太大,建议使用Eclipse专门的静态内存分析工具Mat打开分析。

 

4.分析和调整

这里会涉及到如下内容:

  • 调整垃圾回收机制,提高垃圾回收效率,避免长时间的停顿;
  • 调整线程池大小,避免线程过多导致的性能下降;
  • 优化代码,减少不必要的对象创建和内存占用等。

 

5.不断的试验和试错

最后,就需要通过不断的试验和试错,分析并找到最合适的参数,并则将这些参数应用到所有服务器。

 

JVM调优实战

假设我们的应用程序在运行过程中,发现了频繁的Full GC问题,使用VisualVM进行监控,发现堆内存使用率经常达到90%以上,GC频率也比较高。

我们可以按照以下步骤进行JVM性能调优

1.调整堆内存大小

根据应用程序的内存使用情况,适当调整堆内存大小,我们可以将初始堆大小(-Xms)设置为2GB,最大堆大小(-Xmx)设置为4GB。

 

2.调整年轻代大小

根据应用程序的内存使用情况,适当调整年轻代大小,我们可以将年轻代大小(-Xmn)设置为1GB。

 

3.选择合适的垃圾回收器

由于我们的应用程序是一个高并发的应用程序,建议选择CMS(Concurrent Mark Sweep)垃圾回收器。

我们可以将垃圾回收器参数(-XX:+UseConcMarkSweepGC)添加到JVM启动参数中。

 

4.测试性能

在调整JVM参数后,对应用程序进行性能测试,验证JVM性能是否得到了优化。

 

5.持续监控和优化

定期监控JVM性能,发现问题及时进行调整和优化。

以上就是JVM调优详解,更多JVM内容,请查看:JVM(Java虚拟机)从0到1全部合集,强烈建议收藏!

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法