JVM性能调优的主要方法有:
- 垃圾收集器选择:选择合适的垃圾收集器可以极大地影响JVM性能。
- 对CPU密集型应用,选择吞吐量优先的收集器,如Parallel Scavenge。
- 对内存密集型应用,选择延迟优先的收集器,如CMS。
- G1收集器适用于大多数应用场景,是Java 9默认的收集器。
- 堆内存大小调整:
- Xms用于设置JVM启动时分配的最小堆内存。
- Xmx用于设置JVM可以使用的最大堆内存。
- 一般将Xms和Xmx设置为相同,避免JVM启动时的内存调整。
- 栈内存大小调整:
- Xss用于设置每个线程的栈内存大小。
- 一般默认的1MB大小足够,可根据需要适当调大,但不宜超过4MB。
- 本地方法栈大小调整:
- XX:ReservedCodeCacheSize用于设置本地方法栈的大小。
- 默认为240MB。如果程序使用大量native代码,需要适当增大。
- 新生代/老年代内存比例:
- XX:NewRatio用于设置新生代与老年代的内存比例。
- 默认为2,代表新生代内存是老年代内存的1/3。可以适当增大这个比例。
- 大对象和长期存活对象进入老年代阈值:
- XX:PretenureSizeThreshold用于设置直接进入老年代的大对象阈值,默认为0。
- XX:MaxTenuringThreshold用于设置对象在新生代经历多少次GC后进入老年代,默认为15。
以上是JVM性能调优最为常用和重要的几个方法。来看一个简单例子:
我们可以编写一个Java程序,在运行时使用-Xmx等参数调整对应的值,观察JVM性能的变化。
public class TuningDemo {
public static void main(String[] args) {
System.out.println("启动!使用默认JVM参数运行");
method1(); // 运行一段时间
System.out.println("调整JVM参数重新运行!");
// 调整对应的参数,如-Xmx、-Xms、-Xss等
method1();
}
private static void method1() {
// 运行一个长循环,消耗大量内存
}
}
运行这个程序,观察默认参数下与调优后JVM的内存占用、GC次数和时间等指标,可以直观地看出JVM调优的效果。
所以,熟练掌握JVM调优方法,可以让我们针对不同的应用选择最优的JVM配置,使应用性能达到最高。