JVM 11 调优指南:如何进行JVM调优,JVM调优参数

JVM 11的优化指南:如何进行JVM调优,以及JVM调优参数有哪些”这篇文章将包含JVM 11调优的核心概念、重要性、调优参数,并提供12个实用的代码示例,每个示例都会结合JVM调优参数和Java代码

本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

JVM 11的优化指南

JVM调优简介

JVM调优是通过调整Java虚拟机的配置参数来提升应用程序的性能和资源利用效率的过程。这包括调整堆内存大小、选择合适的垃圾收集器,以及调整其他性能相关的参数。

JVM调优的重要性

  • 提高性能:通过调优,可以提升应用程序的响应速度和处理能力。
  • 资源优化:合理的配置可以使应用更高效地利用系统资源。
  • 稳定性增强:避免过度的资源消耗和频繁的垃圾回收,从而提高应用的稳定性。

JVM 11调优参数

  • 堆内存设置-Xms-Xmx 设置堆的起始大小和最大大小。
  • 垃圾收集器选择-XX:+UseG1GC 使用G1垃圾收集器,适用于大堆和多核处理器。
  • 性能监控-XX:+PrintGCDetails-XX:+PrintGCDateStamps 打印垃圾收集细节。

企业级 JVM 11 的调优参数,机器配置是8核32G

为配置有8核和32GB内存的机器推荐JVM 11调优参数时,需考虑应用的类型、负载特性等。以下是一套企业级的JVM调优参数推荐,适用于大多数中大型Java应用:

1、堆内存设置

  • -Xms16g:设置初始堆内存为16GB。这个设置使得JVM在启动时即分配较大内存,减少运行时动态扩展带来的性能损耗。
  • -Xmx16g:设置最大堆内存为16GB。这样做可以防止频繁的垃圾回收,并保证应用程序有足够的内存。

2、垃圾收集器选择

  • -XX:+UseG1GC:使用G1垃圾收集器,适用于需要快速响应和大内存管理的应用。

3、G1垃圾收集器的进一步优化

  • -XX:MaxGCPauseMillis=200:尽可能将GC暂停时间控制在200毫秒以内,以减少应用停顿。
  • -XX:ParallelGCThreads=8:设置并行GC线程数,通常设置为CPU核心数。
  • -XX:ConcGCThreads=4:设置G1垃圾回收器的并发线程数,通常为ParallelGCThreads的一半。

4、元空间设置

  • -XX:MetaspaceSize=256m:设置初始元空间大小为256MB。
  • -XX:MaxMetaspaceSize=512m:设置最大元空间大小为512MB,以防止元空间过度使用内存。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的, 七千页的BAT大佬写的刷题笔记,让我offer拿到手软

5、GC日志记录

  • -Xlog:gc:file=gc.log:time,level:filecount=5,filesize=20M*:配置GC日志输出,包括日志文件的位置、大小和轮转。

6、性能调优

  • -XX:+UseStringDeduplication:开启字符串去重功能,减少堆内存的占用。
  • -XX:+DisableExplicitGC:禁用显式GC调用(如System.gc() ),避免不必要的GC操作。

7、高级调优选项

  • -XX:+UnlockExperimentalVMOptions:解锁实验性VM选项,用于开启一些最新的优化功能。
  • -XX:+UseLargePages:启用大页面支持,有助于提高大内存机器的性能。

注意事项

  • 根据应用的实际性能和资源使用情况调整这些参数。
  • 应用性能监控工具可以帮助您更好地理解应用运行情况。
  • 在生产环境中逐渐调整参数,并密切关注每次调整后的影响。

合理的JVM调优可以显著提升应用的性能和稳定性。不过,请记得调优是一个持续的过程,需要根据应用的具体表现来不断调整和优化。

实用代码示例

示例1:设置和监控堆内存大小

JVM启动参数:

java -Xms512m -Xmx1g -jar YourApp.jar
  • -Xms512m:设置初始堆内存为512MB。
  • -Xmx1g:设置最大堆内存为1GB。

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的堆内存使用情况。

示例2:使用G1垃圾收集器并监控GC

JVM启动参数:

java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar YourApp.jar
  • -XX:+UseG1GC:使用G1垃圾收集器。
  • -XX:MaxGCPauseMillis=200:设置期望的最大GC暂停时间为200毫秒。
  • -XX:+PrintGCDetails-XX:+PrintGCDateStamps:打印GC的详细信息和时间戳。

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垃圾收集器时的内存分配和清理过程。

示例3:线程堆栈大小的设置与监控

JVM启动参数:

java -Xss256k -jar YourApp.jar
  • -Xss256k:设置每个线程的堆栈大小为256KB。

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...");}
}

这段代码展示了如何设置线程的堆栈大小,并创建一个简单的线程来展示这一设置的实际应用。

示例4:使用G1垃圾收集器并调优

JVM启动参数:

java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar YourApp.jar
  • -XX:+UseG1GC:使用G1垃圾收集器。
  • -XX:MaxGCPauseMillis=200:尝试将GC的最大暂停时间控制在200毫秒以内。
  • -XX:InitiatingHeapOccupancyPercent=45:当堆占用率达到45%时开始GC。
  • -XX:+PrintGCDetails-XX:+PrintGCDateStamps:打印详细的GC信息和时间戳。

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垃圾收集器的情况下进行内存分配和清理。

示例5:监控垃圾收集信息

JVM启动参数:

java -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar YourApp.jar
  • -XX:+PrintGC:打印基本的GC信息。
  • -XX:+PrintGCDetails:打印GC的详细信息。
  • -XX:+PrintGCDateStamps:在GC日志中加入时间戳。

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信息打印。

示例6:设置线程堆栈大小

JVM启动参数:

java -Xss1024k -jar YourApp.jar
  • -Xss1024k:设置每个线程的堆栈大小为1024KB。

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拿到手软

示例7:监控类的加载和卸载

JVM启动参数:

java -XX:+TraceClassLoading -XX:+TraceClassUnloading -jar YourApp.jar
  • -XX:+TraceClassLoading:启用类加载跟踪。
  • -XX:+TraceClassUnloading:启用类卸载跟踪。

Java代码:

public class ClassLoadingMonitoring {public static void main(String[] args) {System.out.println("类加载和卸载监控已启动,相关信息将打印到控制台...");// 这里不需要特定的Java代码来触发类的加载或卸载// 类加载和卸载的信息将通过JVM参数直接打印到控制台// 可以考虑加载一些额外的类或使用ClassLoader来观察输出}
}

此代码示例用于展示如何开启和查看JVM的类加载和卸载信息,对于理解类的生命周期非常有用。

示例8:监控垃圾回收行为

JVM启动参数:

java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -jar YourApp.jar
  • -XX:+PrintGCDetails:打印垃圾回收的详细信息。
  • -XX:+PrintGCDateStamps:在垃圾回收日志中加入时间戳。
  • -Xloggc:gc.log:将垃圾回收日志记录到指定文件。

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(); // 手动请求垃圾回收}}}
}

此代码示例展示了如何通过创建对象并在特定时刻清理,以触发和监控垃圾回收过程。

示例9:配置和使用字符串去重功能

JVM启动参数:

java -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics -jar YourApp.jar
  • -XX:+UseStringDeduplication:开启JVM的字符串去重功能。
  • -XX:+PrintStringDeduplicationStatistics:打印字符串去重的统计信息。

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();}
}

此代码示例通过创建大量重复的字符串,并触发垃圾回收,来展示字符串去重功能的效果。

示例10:使用并行垃圾收集器

JVM启动参数:

java -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:+PrintGCDetails -jar YourApp.jar
  • -XX:+UseParallelGC:使用并行垃圾收集器。
  • -XX:GCTimeRatio=4:设置吞吐量目标,表示99%的时间用于应用程序,1%的时间用于垃圾收集。
  • -XX:+PrintGCDetails:打印垃圾收集的详细信息。

Java代码:

public class ParallelGCMonitoring {public static void main(String[] args) {System.out.println("并行垃圾收集器已启用,GC详细信息正在打印...");// 这里模拟一些内存分配以触发GCList<byte[]> list = new ArrayList<>();for (int i = 0; i < 100; i++) {list.add(new byte[1024 * 1024]); // 每次分配1MB的空间}// 清理引用,触发GClist.clear();System.gc(); // 建议执行垃圾收集}
}

这段代码用于演示并行垃圾收集器的使用,通过分配内存并清理来触发垃圾收集。

示例11:配置和使用String去重功能

JVM启动参数:

java -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics -jar YourApp.jar
  • -XX:+UseStringDeduplication:开启JVM的字符串去重功能。
  • -XX:+PrintStringDeduplicationStatistics:打印字符串去重的统计信息。

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();}
}

这段代码通过创建大量重复的字符串实例,演示了字符串去重功能的效果。

示例12:设置和监控ZGC垃圾收集器

JVM启动参数:

java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xlog:gc -jar YourApp.jar
  • -XX:+UnlockExperimentalVMOptions:解锁实验性VM选项。
  • -XX:+UseZGC:使用ZGC垃圾收集器。
  • -Xlog:gc:开启GC日志。

Java代码:

import java.util.concurrent.TimeUnit;public class ZGCMonitoring {public static void main(String[] args) throws InterruptedException {System.out.println("ZGC垃圾收集器已启用,GC日志正在输出...");// 创建对象并模拟短暂的暂停,触发GCfor (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,有大厂完整面经,工作技术,架构师成长之路,等经验分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter Linux环境压测Lottery接口

1、把Dubbo插件放到Linux中Jmeter的lib/ext目录下 2、参数化 3、设置线程数 4、把测试计划中的Dubbo路径替换成Linux中的路径 /home/apache-jmeter-5.5/lib/ext 5、上传压测脚本到压力机 6、执行压测&#xff0c;观察是否有消息积压 ①Jmeter中执行压测脚本 ②检查mq控制台是…

数字图像线性滤波——方框、均值、高斯滤波及opencv(C++)实现示例

数字图像线性滤波——方框、均值、高斯滤波及opencv&#xff08;C&#xff09;实现示例 一、图像滤波概念简介二、方框滤波及opencv实现示例1、方框滤波的公式2、opencv方框滤波boxfilter()函数&#xff08;1&#xff09;函数介绍&#xff08;2&#xff09;opencv实现实例&…

微信小程序案例-03翻页时钟-3

微信小程序实战系列 《微信小程序实战-01翻页时钟-1》《微信小程序实战-02翻页时钟-2》 文章目录 微信小程序实战系列前言动态翻页效果实现clock.wxmlclock.wxssclock.js运行效果 总结 前言 本文继续完成最后一个部分“动态翻页效果”。 动态翻页效果实现 clock.wxml <…

查看SQL Server的表字段类型、长度、描述以及是否可为null

文章目录 初步理解小步测试组合一下参考文章有更详细评述 继续理解得到大部分信息 本文参考&#xff1a;https://blog.csdn.net/josjiang1/article/details/80558068。 也可以直接点击这里文章链接&#xff1a; sql server查询表结构&#xff08;字段名&#xff0c;数据类型&a…

面试常见知识点--树的遍历

一、前序遍历 算法流程: 1.先申请一个栈&#xff0c;记为stk。 2&#xff0e;然后将根节点压入stk中。 3&#xff0e;每次从stk中弹出栈顶节点&#xff0c;记为cur&#xff0c;然后打印cur的值。如果cur的右子树不为空&#xff0c;将cur的右子树压入stk中。如果cur的左子树不为…

CSS 中的伪装大师:伪类和伪元素的奇妙世界

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

JavaScript中的文件下载

在JavaScript中&#xff0c;实现文件下载的功能可以通过多种方式实现&#xff0c;以下是一些常见的方法&#xff1a; 方法 1&#xff1a;使用HTML5的<a>标签 如果你已经有了一个文件的URL&#xff0c;可以简单地使用一个 <a> 标签并设置download属性。这可以通过…

双指针问题——求只包含两个元素的最长连续子序列(子数组)

一&#xff0c;题目描述 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必…

代码随想录 Leetcode203. 移除链表元素

题目&#xff1a; 代码(首刷看解析 2024年1月11日&#xff09;&#xff1a; class Solution { public:ListNode* removeElements(ListNode* head, int val) {if(headnullptr) return nullptr;ListNode* BeforeHead new ListNode(0,head);ListNode* temp BeforeHead;while(te…

【正点原子STM32连载】第三十一章 待机模式实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第三…

逆向分析爬取网页动态

本例子以爬取人民邮电出版社网页新书的信息为例 由于页面是动态的&#xff0c;信息会不停地更新&#xff0c;所以不同时间的爬取结果会不同。

银行的压力测试如何进行?

为什么要进行压力风险测试&#xff1f; 压力风险测试的最终目的是测试银行在极度恶劣的市场环境中是否有足够的资本维持运转。 题主链接中的一级资本充足率(Tier 1 capital ratio) 亦即衡量标准&#xff0c;这个数字越大&#xff0c;表明银行资本约充裕&#xff0c;可以在停止…

Kubernetes (七) service(微服务)及Ingress-nginx

官网地址&#xff1a; 服务&#xff08;Service&#xff09; | Kuberneteshttps://v1-24.docs.kubernetes.io/zh-cn/docs/concepts/services-networking/service/ 一 . 网络通信原理 …

独立安全 | 企业选择系统定制化开发的最主要优势

随着信息化和互联网的迅猛发展&#xff0c;网络经济给企业带来了巨大的好处。越来越多的企业选择利用第三方平台来建设网店系统&#xff0c;这也导致竞争变得越来越激烈。另一方面&#xff0c;选择定制开发独立商城对企业也有很多好处。这些好处包括以下几点&#xff1a; 1.独…

2024年前端面试中JavaScript的30个高频面试题之基础知识

中级 高级知识 充分准备你的下一个JavaScript面试,增强信心! 无论你是老手还是刚进入技术行业,这份2024年必备资源都将帮助你复习核心概念,从基本语言特性到高级主题。 在本文中,我汇总了30个最关键的JavaScript面试题以及详细的答案和代码示例。 深入探索这宝贵的收藏,以确…

NAND Separate Command Address (SCA) 接口数据传输解读

在采用Separate Command Address (SCA) 接口的存储产品中&#xff0c;DQ input burst和DQ output burst又是什么样的策略呢&#xff1f; DQ Input Burst: 在读取操作期间&#xff0c;数据以一种快速并行的方式通过DQ总线传送到控制器。在SCA接口下&#xff0c;虽然命令和地址信…

关于Python里xlwings库对Excel表格的操作(三十一)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”设置绘图区外框线型、颜色、粗细及填充颜色】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安…

【附源码】基于SSM+Java的题库管理系统的设计与实现

基于SSMJava的题库管理系统的设计与实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;We…

JAVA序列化

对象序列化&#xff08;object serialization&#xff09;是java支持的通用机制&#xff0c;可以将任何对象写出到流中&#xff0c;并在之后将其回读。简单来说&#xff0c;就是可以将对象数据保存为文件&#xff0c;甚至可以通过网络传输&#xff0c;在这之后或者别的主机上恢…

企业如何开展百科营销?需要创建哪些百科词条?

在营销工作实践中&#xff0c;小马识途营销顾问经常接到关于百科营销的咨询&#xff0c;现整理了最受关注的九个问题分享给热爱营销工作的小伙伴。 一、什么是百科营销&#xff1f; 百科营销是借助百科知识传播&#xff0c;可以将企业、品牌、人物所拥有的对用户有价值的信息&a…