JVM 11的优化指南:如何进行JVM调优,以及JVM调优参数有哪些”这篇文章将包含JVM 11调优的核心概念、重要性、调优参数,并提供12个实用的代码示例,每个示例都会结合JVM调优参数和Java代码
本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享
JVM调优是通过调整Java虚拟机的配置参数来提升应用程序的性能和资源利用效率的过程。这包括调整堆内存大小、选择合适的垃圾收集器,以及调整其他性能相关的参数。
为配置有8核和32GB内存的机器推荐JVM 11调优参数时,需考虑应用的类型、负载特性等。以下是一套企业级的JVM调优参数推荐,适用于大多数中大型Java应用:
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的, 七千页的BAT大佬写的刷题笔记,让我offer拿到手软
合理的JVM调优可以显著提升应用的性能和稳定性。不过,请记得调优是一个持续的过程,需要根据应用的具体表现来不断调整和优化。
JVM启动参数:
java -Xms512m -Xmx1g -jar YourApp.jar
Java代码:
public class HeapSizeMonitoring {
public static void main(String[] args) {
// 获取运行时环境
Runtime runtime = Runtime.getRuntime();
// 打印JVM的初始内存和最大内存配置
System.out.println("JVM初始内存大小:" + runtime.totalMemory() / (1024 * 1024) + " MB");
System.out.println("JVM最大内存大小:" + runtime.maxMemory() / (1024 * 1024) + " MB");
}
}
此代码示例演示了如何在Java应用程序中监控当前JVM的堆内存使用情况。
JVM启动参数:
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar YourApp.jar
Java代码:
import java.util.ArrayList;
import java.util.List;
public class G1GCExample {
public static void main(String[] args) {
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // 每次分配1MB的空间
if (list.size() > 100) {
list.clear(); // 清空列表以释放内存
}
}
}
}
此代码示例展示了在使用G1垃圾收集器时的内存分配和清理过程。
JVM启动参数:
java -Xss256k -jar YourApp.jar
Java代码:
javaCopy code
public class ThreadStackSizeExample {
public static void main(String[] args) {
// 创建并启动一个新线程
Thread thread = new Thread(() -> {
try {
Thread.sleep(10000); // 让线程休眠一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
System.out.println("线程堆栈大小设置为256KB...");
}
}
这段代码展示了如何设置线程的堆栈大小,并创建一个简单的线程来展示这一设置的实际应用。
JVM启动参数:
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar YourApp.jar
Java代码:
import java.util.ArrayList;
import java.util.List;
public class G1GCExample {
public static void main(String[] args) {
System.out.println("G1垃圾收集器已启用,GC的详细信息和时间戳将被打印...");
// 创建一个列表,用于存储分配的内存块
List<byte[]> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
// 每次循环分配1MB的内存块
list.add(new byte[1024 * 1024]);
// 每当列表中有100个内存块时,清空列表,释放内存
if (list.size() >= 100) {
list.clear();
// 建议执行一次垃圾收集
System.gc();
}
}
}
}
此代码示例展示了如何在使用G1垃圾收集器的情况下进行内存分配和清理。
JVM启动参数:
java -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar YourApp.jar
Java代码:
import java.util.concurrent.TimeUnit;
public class GCMonitoringExample {
public static void main(String[] args) throws InterruptedException {
System.out.println("垃圾收集信息监控已启用,GC的基本信息、详细信息和时间戳将被打印...");
// 分配内存并稍作等待,以便观察GC的行为
byte[] allocation1 = new byte[512 * 1024 * 1024]; // 分配约512MB的空间
TimeUnit.SECONDS.sleep(10); // 睡眠10秒
byte[] allocation2 = new byte[512 * 1024 * 1024]; // 再分配约512MB的空间
TimeUnit.SECONDS.sleep(10); // 睡眠10秒
// 提示垃圾收集
System.gc();
}
}
此代码示例演示了如何通过分配大量内存并加入等待时间来观察GC的行为,同时启用了详细的GC信息打印。
JVM启动参数:
java -Xss1024k -jar YourApp.jar
Java代码:
public class ThreadStackSizeExample {
public static void main(String[] args) {
System.out.println("线程堆栈大小已设置为1024KB...");
// 创建并启动一个新线程,展示设置的堆栈大小
Thread thread = new Thread(() -> {
recursiveMethod(0);
});
thread.start();
}
// 一个简单的递归方法,用于演示堆栈的深度
private static void recursiveMethod(int depth) {
if (depth < 1000) {
recursiveMethod(depth + 1);
} else {
System.out.println("达到递归深度:" + depth);
}
}
}
这段代码设置了线程的堆栈大小,并通过递归调用来测试堆栈深度的限制。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的, 七千页的BAT大佬写的刷题笔记,让我offer拿到手软
JVM启动参数:
java -XX:+TraceClassLoading -XX:+TraceClassUnloading -jar YourApp.jar
Java代码:
public class ClassLoadingMonitoring {
public static void main(String[] args) {
System.out.println("类加载和卸载监控已启动,相关信息将打印到控制台...");
// 这里不需要特定的Java代码来触发类的加载或卸载
// 类加载和卸载的信息将通过JVM参数直接打印到控制台
// 可以考虑加载一些额外的类或使用ClassLoader来观察输出
}
}
此代码示例用于展示如何开启和查看JVM的类加载和卸载信息,对于理解类的生命周期非常有用。
JVM启动参数:
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -jar YourApp.jar
Java代码:
import java.util.ArrayList;
import java.util.List;
public class GCMonitoringExample {
public static void main(String[] args) {
System.out.println("垃圾回收监控已启用,详细信息将记录到日志文件...");
// 创建一个列表,用于模拟内存占用
List<Object> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(new Object());
// 每1000个对象后进行一次清理,模拟内存释放
if (i % 1000 == 0) {
list.clear();
System.gc(); // 手动请求垃圾回收
}
}
}
}
此代码示例展示了如何通过创建对象并在特定时刻清理,以触发和监控垃圾回收过程。
JVM启动参数:
java -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics -jar YourApp.jar
Java代码:
public class StringDeduplicationExample {
public static void main(String[] args) {
System.out.println("字符串去重功能已启用,相关统计信息将打印...");
// 创建一个字符串列表
List<String> stringList = new ArrayList<>();
// 添加大量重复字符串,触发字符串去重
for (int i = 0; i < 100000; i++) {
stringList.add("Hello, JVM!"); // 添加重复的字符串
}
// 触发垃圾回收,以便观察字符串去重效果
System.gc();
}
}
此代码示例通过创建大量重复的字符串,并触发垃圾回收,来展示字符串去重功能的效果。
JVM启动参数:
java -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:+PrintGCDetails -jar YourApp.jar
Java代码:
public class ParallelGCMonitoring {
public static void main(String[] args) {
System.out.println("并行垃圾收集器已启用,GC详细信息正在打印...");
// 这里模拟一些内存分配以触发GC
List<byte[]> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(new byte[1024 * 1024]); // 每次分配1MB的空间
}
// 清理引用,触发GC
list.clear();
System.gc(); // 建议执行垃圾收集
}
}
这段代码用于演示并行垃圾收集器的使用,通过分配内存并清理来触发垃圾收集。
JVM启动参数:
java -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics -jar YourApp.jar
Java代码:
public class StringDeduplicationExample {
public static void main(String[] args) {
System.out.println("字符串去重功能已启用,统计信息正在打印...");
// 创建重复的字符串
String repeatedString = "Hello, World!";
List<String> stringList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
stringList.add(new String(repeatedString)); // 通过new创建新的字符串实例
}
// 建议执行垃圾收集来触发字符串去重
System.gc();
}
}
这段代码通过创建大量重复的字符串实例,演示了字符串去重功能的效果。
JVM启动参数:
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xlog:gc -jar YourApp.jar
Java代码:
import java.util.concurrent.TimeUnit;
public class ZGCMonitoring {
public static void main(String[] args) throws InterruptedException {
System.out.println("ZGC垃圾收集器已启用,GC日志正在输出...");
// 创建对象并模拟短暂的暂停,触发GC
for (int i = 0; i < 100; i++) {
byte[] allocation = new byte[10 * 1024 * 1024]; // 分配约10MB的空间
TimeUnit.MILLISECONDS.sleep(100); // 暂停100毫秒
}
}
}
此代码示例演示了如何使用ZGC垃圾收集器,并通过分配内存和短暂暂停来触发垃圾收集。
开源:项目文档 & 视频 Github-Doc
合理的JVM调优可以显著提升应用的性能和稳定性。不过,请记得调优是一个持续的过程,需要根据应用的具体表现来不断调整和优化。
本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享