聊聊JVM怎么调优?(实战总结)

JVM 核心配置与调优指南
一、堆内存与年轻代配置(影响最大)

  1. 堆内存大小: 在资源允许的前提下,堆内存应尽可能设置得更大。关键点: 必须将堆内存的最大值 (-Xmx) 和最小值 (-Xms) 设置为相同值。动态扩容会触发 Full GC,影响性能。元空间 (-XX:MaxMetaspaceSize / -XX:MetaspaceSize) 同理,也应设置相同的最大最小值。
  2. 年轻代占比: 通常建议设置较大的年轻代比例(例如,通过 -Xmn 或 -XX:NewRatio)。在 ZGC 之前的回收器(如 Parallel Scavenge, CMS, G1)中,Young GC 是 STW 的,更大的年轻代可以减少 Young GC 的频率。

二、垃圾回收器选型策略

  • 低延迟不敏感场景(如 OLAP、批处理): 优先选择 Parallel Scavenge + Parallel Old 组合。这对回收器以最大化吞吐量为设计目标。
  • 低延迟敏感场景(如 Web 服务、API): 推荐使用 G1 (Garbage-First) 回收器。虽然《深入理解Java虚拟机》提到小内存下 CMS 可能更优,但作者实践测试表明,在各种大小内存场景下,G1 的表现通常优于 CMS,更符合现代应用对低延迟的需求。

三、高并发场景下的特殊考量
高并发应用对 GC 停顿极其敏感,应优先选择低停顿回收器(如 G1),而非高吞吐量回收器(如 Parallel Scavenge/Old)。原因在于:

  1. Parallel Scavenge/Old 的 Young GC 和 Full GC 都是完全 STW 的。
  2. G1 的 Mixed GC 部分阶段能与用户线程并发执行,显著减少 STW 时间。
  3. 恶性循环风险: 高并发下发生 STW 时,GC 线程(优先级较低)与处理用户请求的线程竞争 CPU 资源。操作系统可能优先调度用户请求线程,导致 GC 线程获得的时间片减少,进而延长 STW 时间。延长的 STW 又会导致请求堆积,进一步增加 GC 压力(频率升高、效率降低),形成性能恶化循环。减少 STW 是打破此循环的关键。

四、其他重要配置规范

  1. 栈大小 (-Xss): 默认 1MB 通常过大。建议设置为 256k 或更低(如 -Xss256k),可减少 StackOverflowError 发生概率,并节省内存。
  2. 堆/元空间固定大小: 重申第一条关键点,-Xmx=-Xms-XX:MaxMetaspaceSize=-XX:MetaspaceSize,避免扩容触发 Full GC。
  3. OOM 时 Dump 日志 (-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath): 发生 OutOfMemoryError 时自动生成堆转储文件,便于事后分析。
  4. Full GC 前后 Dump (谨慎使用): 通过 JVM 参数或工具(如 jcmd)触发 Full GC 前后的堆转储。警告: Dump 操作消耗大量 CPU 和 I/O 资源强烈反对在生产环境使用,仅限测试环境诊断。
  5. 禁止线上远程调试:严禁在生产环境开启 JVM 的远程调试端口(如 -agentlib:jdwp),存在严重安全风险且影响性能。
  6. 禁止显式调用 System.gc() 代码中禁止调用 System.gc() 或 Runtime.getRuntime().gc()。这会强制触发 Full GC,干扰 JVM 自身的 GC 策略,通常导致不必要的性能损耗。
  7. 避免追求极短停顿时间: 理解 JVM GC 的“不可能三角”(低延迟、高吞吐量、小内存占用)。试图通过参数(如 G1 的 -XX:MaxGCPauseMillis)将目标停顿时间设置得过短,往往会导致 GC 频率显著增加,反而降低整体吞吐量。设置合理的目标值更为重要。

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

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

相关文章

开疆智能Profinet转Profibus网关连接费斯托阀岛总线模块配置案例

本案例是通过开疆智能Profibus转Profinet网关将费托斯阀岛接入到西门子1200PLC的配置案例。 首先我们先了解一下Profibus报文以及他的通讯原理。 除了起始符 SD 和结束符 ED 这些固定数值之外,还有功能码(Function Code, FC)和服务访问点&…

ARM内核一览

经常看介绍某某牛批芯片用的又是ARM什么核,看的云里雾里,所以简单整理整理。(内容来自官网和GPT) 1 ARM 内核总体分类 系列特点应用场景Cortex-M超低功耗、低成本、实时性嵌入式系统、微控制器、IoTCortex-R高可靠性、硬实时汽车…

RT Thread Nano V4.1.1 rtconfig.h 注释 Configuration Wizard 格式

rtcomfig.h 以下是对 [rtconfig.h](file://c:\Users\admin\Downloads\rtthread-nano-master\rt-thread\bsp\stm32f407-msh\RT-Thread\rtconfig.h) 文件中每一个配置项的详细注释说明: 基本配置(Basic Configuration) [RT_THREAD_PRIORITY_MAX](file://c:\Users\admin\Downl…

UniApp网页版集成海康视频播放器

注意:本人全部集成好后使用最新的海康平台下载插件进行替换后就不能预览视频 使用Uni插件进行集成:海康视频H5播放器组件 - DCloud 插件市场 CSDN资源下载:https://download.csdn.net/download/wangdaoyin2010/90910975 注意:初…

WPF【10_2】数据库与WPF实战-示例

客户预约关联示例图 MainWindow.xaml 代码 <Window x:Class"WPF_CMS.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d"ht…

理解 Kubernetes 的架构与控制平面组件运行机制

文章目录 K8s架构K8s核心组件控制平面组件&#xff08;部署在 Master 节点&#xff09;1. 查看组件运行情况2. 查看组件 help 命令 Node端组件&#xff08;部署在每个工作节点&#xff09; K8s内部工作原理 Kubernetes&#xff08;也称为 K8s&#xff09;是一个开源的容器编排和…

Express+MySQL后台开发实战:从模块化到错误处理的全链路解析

ExpressMySQL后台开发实战&#xff1a;从模块化到错误处理的全链路解析 摘要&#xff1a;本文将以Node.jsExpress框架为基础&#xff0c;结合MySQL数据库实战&#xff0c;深度剖析后台系统中数据库模块化设计、安全查询、错误处理等核心开发要点。 一、项目环境与技术栈 ├─…

Spring AI 智能体代理模式(Agent Agentic Patterns)

AgentAgenticPatterns 简介 在最近的一篇研究报告《构建高效代理》 中&#xff0c;Anthropic分享了关于构建高效大语言模型&#xff08;LLM&#xff09;代理的宝贵见解。这项研究特别有趣的地方在于&#xff0c;它强调简单性和可组合性&#xff0c;而非复杂的框架。让我们来探…

基于 Vue3 与 exceljs 实现自定义导出 Excel 模板

在开发中&#xff0c;我们需要常常为用户提供更多的数据录入方式&#xff0c;Excel 模板导出与导入是一个常见的功能点。本文将介绍如何使用 Vue3、exceljs 和 file-saver 实现一个自定义导出 Excel 模板&#xff0c;并在特定列添加下拉框选择的数据验证功能。 技术选型 excelj…

git 命令之-git cherry-pick

今天得到一个通知&#xff0c;这个业务版本里面部分已经开发但还没测试的内容要新开一个分支提交&#xff0c;但是我已经有几个提交上去了&#xff0c;难道只能一个一个文件复制到新的分支吗&#xff1f;我不&#xff0c;我找到了这个git命令&#xff0c;可以解决我的困惑&…

浙大版《Python 程序设计》题目集6-3,6-4,6-5,6-6列表或元组的数字元素求和及其变式(递归解法)

目录 6-3 输入格式: 输出格式: 输入样例: 输出样例: 6-4 输入格式: 输出格式: 输入样例: 输出样例: 6-5 输入格式: 输出格式: 输入样例: 输出样例: 6-6 输入格式: 输出格式: 输入样例: 输出样例: 6-3 第6章-3 列表或元组的数字元素求和 分数 20 全屏浏览 切换布局 作者 陈春晖 …

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter2 小程序核心

1 尺寸单位和样式 1.1 创建小程序项目-纯净环境 // 该删的删掉。 1.2 尺寸单位 # 小程序内 手机屏幕大小可能不一样&#xff0c;使用px像素就会出现样式问题 --> 小程序统一了整个宽度&#xff0c;即750rpx&#xff0c;屏幕一半则是375rpx -->因此不管什么手机都可以…

攻防世界逆向刷题笔记(新手模式9-1?)

bad_python 看样子是pyc文件损坏了。利用工具打开&#xff0c;发现是MAGIC坏了。搜下也没有头绪。 攻防世界-难度1- bad_python - _rainyday - 博客园 python Magic Number对照表以及pyc修复方法 - iPlayForSG - 博客园 看WP才知道36已经提示了pyc版本了。参考第二个文章&am…

mysql ACID 原理

序言&#xff1a;ACID 是一组数据库设计原则&#xff0c;他是业务数据和关键业务程序的可靠性保障。 1、atomicity&#xff08;原子性&#xff09; 依赖如下能力 autocommit commit rollback2、一致性 2.1 double write buffer 1、定义&#xff1a;double write buffer 是…

WebStorm 高效快捷方式全解析

作为前端开发的黄金搭档&#xff0c;WebStorm 凭借强大的功能和高度可定制的快捷键体系&#xff0c;成为众多开发者提升编码效率的利器。本文基于 IntelliJ IDEA 的快捷键体系&#xff08;WebStorm 作为 JetBrains 家族成员&#xff0c;快捷键逻辑高度一致&#xff09;&#xf…

基于 STM32 的农村污水处理控制系统设计与实现

摘要 针对农村污水处理自动化程度低、运维成本高的问题,本文设计了一种基于 STM32 单片机的污水处理控制系统。系统通过多传感器实时监测水质参数,结合 PID 控制算法实现污水处理全流程自动化,并集成远程监控功能,满足农村地区低成本、易维护的需求。 一、硬件系统设计 …

自动生成md文件以及config.mjs文件-vitepress

效果&#xff1a; config.mjs文件 import {defineConfig} from vitepress import hljs from highlight.js/lib/core import javascript from highlight.js/lib/languages/javascript import xml from highlight.js/lib/languages/xml import {ref} from "./cache/deps/vue…

Tailwind css实战,基于Kooboo构建AI对话框页面(二)

基于上篇内容&#xff0c;添加交互逻辑&#xff0c;实现一个伪聊天功能的对话框效果&#xff1a; Tailwind css实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;一&#xff09;-CSDN博客 在前期文章中&#xff0c;我们完成了 AI 对话框的静态页面搭建。本文将聚焦交互…

Conda:环境移植及更新1--使用conda-pack

更多内容&#xff1a;XiaoJ的知识星球 目录 一、使用conda-pack1.安装 conda-pack2.移植整个 Anaconda 环境3.移植单个虚拟环境4.验证是否生效 在相同Linux设备上移植Miniconda3&#xff08;Anaconda3同理&#xff09;常用方法有。 使用conda-pack&#xff1a;使用conda-pack工…

树莓派超全系列教程文档--(50)如何查找树莓派的IP地址

如何查找树莓派的IP地址 找到您的Raspberry Pi的IP地址桌面命令行引导输出网络管理器使用mDNS解析 raspberrypi.local检查路由器的设备列表使用 nmap 查找设备使用智能手机应用程序查找设备 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 找到您…