Java学习篇之JVM 调优
Java学习篇之JVM 调优
- 一、JVM 是什么?
- 二、JVM 官方参数建议
- 三、JVM调优的场景
- 四、如何监控JVM
- 五、JVM调优的流程步骤
- 1. 明确优化目标
- 2. 监控和分析
- 3. 确定调优参数
- 4. 实施调优策略
- 5. 持续观察和调整
- 6. 定期评估和优化
一、JVM 是什么?
JVM,全称Java Virtual Machine(Java虚拟机),是一个能够运行Java字节码的抽象计算机。
JVM是Java跨平台特性的核心。Java源代码在编译成字节码后,可以在任何支持Java的平台上运行,只要该平台安装了相应的JVM。这是因为JVM将Java字节码转换成特定平台上的机器码来执行,从而实现了“一次编写,到处运行”的跨平台特性。
二、JVM 官方参数建议
JVM 经过这么多年的发展和验证,整体是非常健壮的。个人认为99%的情况下,基本用不到 JVM 调优。
通常来说,我们的 JVM 参数配置大多还是会遵循 JVM 官方的建议,例如:
1. 堆内存设置
| 参数 | 描述 | 官方建议/说明 |
|---|---|---|
| -Xms | 设置JVM的初始堆大小 | 默认为物理内存(运行内存)的1/64;对于高并发应用,建议与-Xmx相同 |
| -Xmx | 设置JVM的最大堆大小 | 默认为物理内存(运行内存)的1/4 |
| -Xmn | 设置年轻代的初始和最大大小 | 默认为整个堆的3/8;或使用-XX:NewSize/-XX:MaxNewSize分别设置 |
2. 年轻代与老年代比例
| 参数 | 描述 | 官方建议/说明 |
|---|---|---|
| -XX:NewRatio | 设置年轻代与老年代的比例 | 默认值为2(即老年代是年轻代的2倍) |
| -XX:SurvivorRatio | 设置Eden区与一个Survivor区的大小比例 | 默认值为8,表示Eden区与Survivor区的比例为8:1 |
3. 线程堆栈设置
| 参数 | 描述 | 官方建议/说明 |
|---|---|---|
| -Xss | 设置每个线程的堆栈大小 | JDK5.0后默认1MB;小型应用可能128KB足够,大型应用建议256KB |
4. 非堆内存设置
| 参数 | 描述 | 官方建议/说明 |
|---|---|---|
| -XX:PermSize | 设置持久代的初始大小(JDK8已弃用) | JDK8前用于控制方法区内存大小 |
| -XX:MaxPermSize | 设置持久代的最大大小(JDK8已弃用) | JDK8前用于控制方法区内存大小 |
| -XX:MetaspaceSize | 设置元空间的初始大小(JDK8及以后) | 替代了PermSize,用于存放类的元数据 |
| -XX:MaxMetaspaceSize | 设置元空间的最大大小(JDK8及以后) | 替代了MaxPermSize |
5. 垃圾收集器设置
| 参数 | 描述 | 官方建议/说明 |
|---|---|---|
| -XX:+UseSerialGC | 使用串行垃圾收集器 | 默认GC方式,适用于小型应用和单处理器环境 |
| -XX:+UseParNewGC | 在年轻代中使用并行线程进行垃圾收集 | 可以与CMS GC一起使用 |
| -XX:+UseParallelGC | 在年轻代中使用并行垃圾收集器 | 适用于多处理器系统 |
| -XX:+UseParallelOldGC | 在老年代中使用并行垃圾收集器 | 与-XX:+UseParallelGC一起使用 |
| -XX:+UseConcMarkSweepGC | 使用CMS垃圾收集器 | 在GC运行时对应用程序影响较小 |
6. 辅助信息设置
| 参数 | 描述 | 官方建议/说明 |
|---|---|---|
| -XX:+PrintGCDetails | 打印垃圾收集的详细情况 | 用于调试和性能分析 |
| -Xloggc:filename | 将GC日志信息记录到指定文件 | 便于分析和监控JVM的垃圾回收行为 |
7. 其他重要参数
| 参数 | 描述 | 官方建议/说明 |
|---|---|---|
| -XX:MinHeapFreeRatio | 设置GC事件后允许的最小可用堆空间百分比 | 控制JVM何时扩展堆大小 |
| -XX:MaxHeapFreeRatio | 设置GC事件后允许的最大可用堆空间百分比 | 控制JVM何时收缩堆大小 |
| -XX:MaxDirectMemorySize | 设置Direct ByteBuffer分配的堆外内存的最大大小 | 当达到此大小时,将触发Full GC |
请注意,这些建议是基于Oracle JDK的通用指南,并且可能会随着JVM版本的更新而有所变化。
在实际应用中,可能还需要根据具体的应用场景、硬件环境和性能需求进行进一步的调整和优化。
同时,也需要注意参数的兼容性和稳定性问题。
三、JVM调优的场景
主要就是出现以下情况时,就需要注意对JVM进行调优了
- 当应用程序运行缓慢或出现卡顿,或是偶尔响应慢
- 应用程序频繁出现内存溢出(OutOfMemoryError)或内存泄漏等问题,
四、如何监控JVM
JVM监控工具分为JDK自带工具和第三方工具两大类。
- JDK自带工具(常用的):jconsole、visualvm
- 第三方工具(常用的):JProfiler、YourKit
JDK自带工具常用命令:
- jstack pid: 打印堆栈相关执行信息,可以用于死锁发现。
- jinfo pid: 打印进程的启动详细参数、JVM正在使用的参数。
- jstat -gc pid: 打印各个分代的内存使用情况。可以每个一段时间打印一次。
- visualvm: windows图形化界面,不常用。上线之前内测可以使用。
- jmap: 如果内存特别大,jmap会导致线程的停止,所以线上不能使用。
线上时不能dump下来文件,因为文件可能很大(堆内存占了多少文件就有多大),dump时java程序会暂停,线上不能dump。
jmap -histo pid | head -n 20 :查找有多少对象产生,及对象占用的内存,对象的名称。可用于内存泄露导致的OOM。
五、JVM调优的流程步骤
JVM调优流程步骤可以归纳为以下几点:
1. 明确优化目标
在开始调优之前,首先需要明确优化的目标。这包括响应时间、吞吐量、内存使用率等指标。明确目标后,可以更有针对性地进行调优。
2. 监控和分析
- 使用监控工具:利用Java VisualVM、JConsole、JProfiler等监控工具,分析CPU使用率、内存使用情况和垃圾回收频率等指标。
JDK自带工具常用命令:
- jstack pid: 打印堆栈相关执行信息,可以用于死锁发现。
- jinfo pid: 打印进程的启动详细参数、JVM正在使用的参数。
- jstat -gc pid: 打印各个分代的内存使用情况。可以每个一段时间打印一次。
- jvisualvm: windows图形化界面,不常用。上线之前内测可以使用。
- jmap: 如果内存特别大,jmap会导致线程的停止,所以线上不能使用。
线上时不能dump下来文件,因为文件可能很大(堆内存占了多少文件就有多大),dump时java程序会暂停,线上不能dump。
jmap -histo pid | head -n 20 :查找有多少对象产生,及对象占用的内存,对象的名称。可用于内存泄露导致的OOM。
- 分析GC日志:通过GC日志,了解垃圾回收的频率、停顿时间以及内存使用情况,帮助定位性能瓶颈。
例如:
-Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps这些选项将GC日志记录到指定的文件(/path/to/gc.log),并打印详细的GC信息和时间戳。
然后,我们可以分析GC日志以了解垃圾回收的频率、停顿时间和内存使用情况。例如,我们可以查>找Full GC的发生频率和每次Full GC的停顿时间。
3. 确定调优参数
根据监控和分析的结果,确定需要调整的JVM参数。常见的JVM参数包括:
- 堆内存设置:通过-Xms和-Xmx设置初始和最大堆内存大小。
例如:
-Xms512m -Xmx512m这将初始堆内存设置为512m,最大堆内存设置为512m。两者最好一致
- 垃圾收集器选择:选择合适的垃圾收集器,如G1、CMS等,以优化内存管理。
例如:
选择G1垃圾收集器:以优化内存管理和减少停顿时间。-XX:+UseG1GC调整G1垃圾收集器的参数:以进一步优化性能。
-XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=35这将G1垃圾收集器的目标停顿时间设置为200毫秒,并将触发并发GC的堆占用百分比设置为35%。
- 线程栈大小:通过-Xss设置每个线程的堆栈大小,以减少线程上下文切换的开销。
4. 实施调优策略
- 调整JVM参数:根据确定的调优参数,调整JVM的启动参数。
例如:如果我们在Linux系统上使用java命令启动应用程序,我们可以这样设置:
java -Xms512m -Xmx512m -Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=35 -jar myapp.jar
- 优化代码:减少不必要的对象创建、使用高效的数据结构、避免过度的同步等,都可以显著提升应用的性能。
5. 持续观察和调整
- 持续监控:在调整参数和优化代码后,使用监控工具持续观察应用的性能变化。
- 对比性能指标:通过对比调优前后的性能指标,确认是否达到了预期的优化目标。
- 重新评估和调整:如果没有达到目标,可能需要重新评估调优策略,进行进一步的调整。
6. 定期评估和优化
性能调优是一个持续的过程。随着应用的演变和用户负载的变化,可能需要定期重新评估和调整JVM参数。定期的性能测试和监控可以帮助及时发现潜在问题,确保系统的稳定性和高效性。
参考文章
【1】面试官:如何进行 JVM 调优(附真实案例)
【2】【JVM】JVM 实战调优指南赋案例(保姆篇)
【3】JVM调优实例记录
【4】【Java】JVM调优操作手册(实战篇)
【5】JVM性能优化实战手册:从监控到调优策略
相关文章:
Java学习篇之JVM 调优
Java学习篇之JVM 调优 一、JVM 是什么?二、JVM 官方参数建议三、JVM调优的场景四、如何监控JVM五、JVM调优的流程步骤1. 明确优化目标2. 监控和分析3. 确定调优参数4. 实施调优策略5. 持续观察和调整6. 定期评估和优化 一、JVM 是什么? JVM,…...
LangChain上使用huggingface的embedding模型(如jina-embeddings-v3)
一、背景知识 embedding将文本映射到稠密的向量空间中,方便存储和查询。 huggingface的embedding榜单 这里结合自己的应用场景,选择1b以下的embedding模型,综合考量下选择arkohut/jina-embeddings-v3 模型链接 下载 使用模型卡片提供的命令…...
对象优化及右值引用优化(一)
对象优化及右值引用优化 对象的函数调用时机 class Test { public:Test(int val 0) :val_(val) {cout << "Test::Test" << endl;}~Test(){cout << "Test::~Test" << endl;}Test(const Test& test){cout << "Tes…...
江西省技能培训平台(逆向破解登录国密SM2)
江西省技能培训平台(逆向破解登录) 登录破解(国密sm2加密方式) 请求接口 https://api.cloud.wozhipei.com/auth/user/v1/login 使用身份证和密码登录发现有password加密,好开始逆向js 全局搜索发现使用国密SM2进行加密 模拟算法 js 使用js进行模拟算法 <…...
用万用表测量三极管:【判断是NPN\PNP+3极性】
三极管种类分2种,一种NPN型三极管,另外一种为PNP三极管。三极管由2个PN结组成。因此,我们可以将三极管看作由2个二极管组成。通过下图可以知道,三极管的公共端为B极(基极)。 1:测量方法 用万用…...
StableDiffusion系列教程 | 什么是SD?SD能做什么?有哪些应用场景?
随着人工智能技术的飞速发展,人工智能应用已经渗透到我们生活方方面面。在众多AI技术中,Stable Diffusion(简称SD)作为一种先进的图像生成技术,正逐渐成为创意产业的新宠。在本系列的首篇文章中,我们将一起…...
AutoCAD的Dwg版本代号、R版本参数值以及二次开发时VS、.NET版本关系
Dwg的AC版本代号 出处:https://www.autodesk.com.cn/support/technical/article/caas/sfdcarticles/sfdcarticles/CHS/drawing-version-codes-for-autocad.html 以下是AutoCAD图形的不同版本代号: MC0.0 - DWG Release 1.1 AC1.2 - DWG R1.2 AC1.4 - DW…...
解密可观测行业中的语义规范 — 代码世界中的“语言艺术”
可观测行业中的语义规范 语义规范可以说在我们生活中无处不在,它为某种语言或文化中的单词和短语提供了一致的意义,以促进更清晰的交流。 而在计算机世界中,语义规范也同样甚至更加关键,因为屏幕上的文本缺乏更丰富的对话环境—…...
esp32 ap httpsever 控制led
功能:浏览器/open 开 led /close 关led 如不关,则亮灯10秒自动关闭 已买220v 转5V电源,5V固态继电器,开始组装无线开关。 代替家里华为的hlink灯泡,此灯必须要连入网络才能控制开和关,经常时灵时不…...
告别复杂判断!Python中实现函数重载的终极技巧
引言 说到函数重载,学过 Java 的同学应该不陌生,最常用的地方应该就是打印 log 了,对于不同的参数,调用的是不同的重载函数。那么 Python 如何实现函数重载呢? 重载概念 函数重载是指在同一作用域内,允许…...
Clang-Format:让你的代码整齐划一,格式不再烦恼
在现代软件开发中,代码规范和一致性对团队协作和代码质量至关重要。如何保持代码风格一致,避免手动格式化的繁琐操作?clang-format 是一款强大而灵活的代码格式化工具,它为开发者提供了高效的解决方案。本文将详细介绍 clang-form…...
【jvm】Full GC
目录 1. 说明2. 触发条件3. 优化4. 注意事项 1. 说明 1.Full GC(Full Garbage Collection)是Java垃圾回收过程中最重要且最昂贵的一种操作。2.Full GC涉及对整个堆内存(包括年轻代和老年代)的垃圾回收。3.当Full GC发生时&#x…...
【Python】实战:请使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息
# 定义汽车基类 class Car:def __init__(self, model, license_plate):self.model model # 车型self.license_plate license_plate # 车牌def start(self):print(f"{self.model} ({self.license_plate}) 启动了。")def stop(self):print(f"{self.model} ({s…...
互联网摸鱼日报(2024-11-07)
互联网摸鱼日报(2024-11-07) 36氪新闻 阿华田再现颓势 中国旅游景区上市公司,三季度财报好看吗? 电动化浪潮下,消费者彻底放弃百年品牌BBA? 估值114亿,海尔系独角兽终止IPO 又一知名品牌门店全关,高端…...
requests库
GET请求 基本实例import requestsresponse requests.get(https://www.httpbin.org/get) print(response.text)params参数import requests data {"name":"Bileton","age":"21" } response requests.get(https://www.httpbin.org/ge…...
大数据之多级缓存方案
多级缓存介绍?多级缓存优缺点,应用场景?多级缓存架构? 多级缓存介绍 多级缓存方案是一种优化手段,通过在多个级别上存储数据来提高应用程序的性能和响应速度。以下是对多级缓存方案的详细解析: 一、多级缓…...
QCon演讲实录|徐广治:边缘云原生操作系统的设计与思考
10月18日,在 QCon 全球软件开发大会 2024(上海站),火山引擎边缘云资深架构师徐广治围绕火山引擎边缘计算产品背后的算力底座 - 边缘云原生操作系统,探讨如何实现算力服务的混合部署和跨区域弹性调度,以及在…...
web第二次作业
代码如下 <!DOCTYPE html> <html> <head> <!-- 设置页面的字符编码为utf-8,确保能正确显示各种字符 --> <meta charset"utf-8"> <title></title> <style> /* 全局样式设置 */ *{ …...
大模型技术讲解:大模型参数微调(大模型微调)
转自 秋色稻田公众号 这篇文章讲讲大模型的参数微调,参数微调(Fine-tuning)是一种机器学习技术,用于调整大型预训练模型的参数,以大模型适应特定应用场景。这种方法通常用于自然语言处理(NLP)…...
测试自动化如何和业务流程结合?
测试自动化框架固然重要,但是最终自动化的目的都是为了业务服务的。 那测试自动化如何对业务流程产生积极影响? 业务流程的重要性 测试自动化项目并非孤立存在,其生命周期与被测试的应用程序紧密相关。项目的价值在于被整个开发团队所使用&a…...
巨亏47亿,市值5000亿:拆解智谱AI的定价逻辑
2026年1月8日,智谱以每股116.2港元登陆港交所。截至5月中旬,其股价一度冲上1160港元,市值突破5000亿港元,较发行价累涨近10倍。而同期披露的2025年财报显示,公司全年营收7.24亿元,经调整净亏损31.82亿元。来…...
AudioSwitch:一键管理Windows音频设备,告别繁琐系统设置
AudioSwitch:一键管理Windows音频设备,告别繁琐系统设置 【免费下载链接】AudioSwitch Switch between default audio input or output change volume 项目地址: https://gitcode.com/gh_mirrors/au/AudioSwitch 音频设备切换是Windows用户经常遇…...
如何免费获取百度文库文档:三步实现纯净打印保存的实用技巧
如何免费获取百度文库文档:三步实现纯净打印保存的实用技巧 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 你是否经常在百度文库找到完美的学习资料或工作报告,却因为需要…...
Cursor Free VIP技术架构深度解析:机器标识重置系统的实现原理
Cursor Free VIP技术架构深度解析:机器标识重置系统的实现原理 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached …...
站长日记:实测一款神仙工具,终于搞定了Bing和360的收录难题
最近真的很想吐槽一句:现在做个小站怎么就这么难? 事情是这样的,上个月为了测试一个新出的长尾词,我花周末两天火速搭了个新站,内容全部手写,绝对原创。按照以前的经验,这种质量的站,…...
剪映专业版教程:制作冒泡排序算法原理演示视频
前言 今天教大家用剪映制作冒泡排序算法的原理演示视频。冒泡排序的原理是:从左到右,依次比较相邻两个元素,如果左边的元素大于右边的元素,就交换位置。这样,一轮比较下来,最大的元素会被“冒泡”到最右边…...
Memcached未授权访问漏洞实战防御指南
1. 这个漏洞不是“能连上就完事”的玩具,而是真实压垮服务的导火索Memcached未授权访问漏洞(CVE-2013-7239)——光看编号,很多人第一反应是“老古董漏洞,早该淘汰了”。但我在2023年参与三起生产环境应急响应时&#x…...
第一篇:Claude Code 是什么?——为终端而生的Agentic编程助手
📌 标签:#概念解析 #Agent #终端工具 #入门必读你即将认识的,不是又一个“聊天式代码生成器”,而是一个真正能在终端里自主完成开发任务的 AI 工程师。1. 从“副驾驶”到“领航员”的跨越 如果你用过 GitHub Copilot、Cursor 或 C…...
AI识别+yolo11室内监控系统 AI办公室监控系统
办公室监控系统 一个基于 Flask 的 Web 应用程序,通过计算机视觉和 YOLO 对象检测来监控办公室工作区域。系统跟踪人员在不同工作区域的存在情况,并记录在每个区域停留的时间。 功能 使用 YOLOv8 实现实时人员检测和跟踪监控多个工作区域跟踪每个定义工…...
B2B制造业如何利用GEO优化获得精准询盘:实战指南
B2B制造业如何利用GEO优化获得精准询盘:实战指南 摘要 :随着AI搜索渗透率超过85%,B2B制造业的获客逻辑正在被重塑。本文详细介绍GEO(Generative Engine Optimization)优化技术如何帮助工业品、机械配件企业获得精准询盘…...
