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调优参数,主要包含如下:
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性能调优主要包含以下方法,大概分为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年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》