常用的JVM调优参数和应用场景
常见的JVM调优参数和应用场景
概要
JVM调优可以显著提升Java应用性能,减少响应时间和垃圾回收停顿,优化内存使用,降低内存溢出风险,并提高资源利用率。
以下是一些常用的JVM参数和应用场景的介绍。
一、堆内存设置
-Xms<size> 和 -Xmx<size>:设置初始堆大小和最大堆大小。
1. -Xms<size>
初始化时的堆大小。设置得大一些可以避免频繁动态扩展堆。
2. -Xmx<size>
设置堆内存的最大值。设置的太小可能导致 OutOfMemoryError,设置的太大可能导致 GC 时间过长。
示例:-Xms512m -Xmx4g
这表示堆的初始大小为 512 MB,最大可以扩展到 4 GB。
二、新生代和老年代设置
1. -Xmn<size>
设置新生代大小。通常建议新生代占总堆的1/3,这样可以提高新生代GC的效率。
示例:-Xmn1g,表示新生代大小为1 GB。
2. -XX:NewRatio=<ratio>
设置新生代和老年代的比例。这个比例决定了JVM在堆内存中为新生代和老年代分配的内存大小。
示例:
-XX:NewRatio=2:表示新生代与老年代的比例为1:2(新生代占总堆内存的1/3)。
-XX:NewRatio=4:表示新生代与老年代的比例为1:4(新生代占总堆内存的1/5),适合对象存活时间较长的场景。
三、垃圾回收相关参数
1. -XX:+UseParallelGC
用于选择适合应用场景的垃圾收集器。
使用 Parallel GC(并行垃圾收集器),这是 JDK 1.8 的默认垃圾收集器,适合高吞吐量应用。
使用其他垃圾收集器,示例:
-XX:+UseSerialGC:使用串行垃圾回收器。
-XX:+UseG1GC:使用G1垃圾回收器。
2. -XX:MaxGCPauseMillis=<time>
设置GC最大暂停时间。帮助控制应用的响应时间。
示例:-XX:MaxGCPauseMillis=200,GC最大暂停时间为200毫秒。
注意:
默认情况下,VM没有暂停时间目标值。GC的暂停时间主要取决于堆中实时数据的数量与实时数据量。
该参数应谨慎使用。太小的值将导致系统花费过多的时间进行垃圾回收。原因是为满足最大暂停时间,VM将设置更小的堆,以存储相对少量的对象,来提升回收速率,会导致更高频率的GC。
3. -XX:GCTimeRatio=<ratio>
设置垃圾回收占总运行时间的比例。表示希望在GC花费不超过应用程序执行时间的1/(1+<ratio>),<ratio>为大于0小于100的整数。
默认值是99,表示允许1%的时间用于GC,适合希望优化吞吐量的场景。
示例:-XX:GCTimeRatio=19
那么GC最大花费时间的比率=1/(1+19)=5%,程序每运行100分钟,允许GC停顿共5分钟,其吞吐量=1-GC最大花费时间比率=95%
4. -XX:MaxTenuringThreshold=<value>
设置对象从新生代晋升到老年代的年龄阈值。适合调节对象的存活时间,影响GC频率和性能。
示例:-XX:MaxTenuringThreshold=15,表示对象在新生代存活15次后才会晋升到老年代。
四、线程栈大小
-Xss<size>
设置每个线程的栈大小。栈用于存储方法的局部变量、操作数栈、动态链接和返回地址。较大的栈大小可以支持更深的递归,但会消耗更多的内存。
示例2:-Xss512k
这表示每个线程的栈大小为512 KB。适用于大多数应用,但如果应用涉及较深的递归,可能需要更大的栈。
五、调试和监控参数
1. -XX:+PrintGCDetails
这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时候输出当前的内存各区域分配情况。
打印详细的GC信息,帮助开发者分析内存使用情况。
2. -XX:+PrintGCTimeStamps
在GC日志中添加时间戳,方便分析GC发生的具体时间。
3. -XX:+HeapDumpOnOutOfMemoryError
在发生内存溢出时生成堆转储文件,便于后续分析内存泄漏或不足的问题。
4. -Xloggc:<file>:
将GC日志输出到指定文件,便于后续分析和监控。