当前位置: 首页 > article >正文

聊聊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 频率显著增加,反而降低整体吞吐量。设置合理的目标值更为重要。

相关文章:

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

JVM 核心配置与调优指南 一、堆内存与年轻代配置(影响最大) 堆内存大小: 在资源允许的前提下,堆内存应尽可能设置得更大。关键点: 必须将堆内存的最大值 (-Xmx) 和最小值 (-Xms) 设置为相同值。动态扩容会触发 Full G…...

新能源汽车电控系统的精准守护者PKDV5355高压差分探头

在新能源汽车的"心脏"——电控系统中,每一次电流的精准切换都关乎车辆的性能与安全。PRBTEK PKDV5355高压差分探头就像一位经验丰富的"汽车医生",帮助工程师们精准捕捉IGBT模块的每一次"心跳",确保电驱系统健康…...

C# 导出word 插入公式问题

最近遇到了一个问题,下载一个文档时需要下载word可编辑的公式。找了很久终于找到了一种解决办法。下面是以C#代码来实现在Word中插入公式的功能。 目录 一、引入dll程序集文件1、通过 NuGet 引入dll(2种方法)的方法:2、手动添加d…...

Mac安装配置InfluxDB,InfluxDB快速入门,Java集成InfluxDB

1. 与MySQL的比较 InfluxDBMySQL解释BucketDatabase数据库MeasurementTable表TagIndexed Column索引列FieldColumn普通列PointRow每行数据 2. 安装FluxDB brew update默认安装 2.x的版本 brew install influxdb查看influxdb版本 influxd version # InfluxDB 2.7.11 (git: …...

手撕Java+硅基流动实现MCP服务器教程

手撕Java硅基流动实现MCP服务器教程 一、MCP协议核心概念 MCP是什么 MCP 是 Anthropic (Claude) 主导发布的一个开放的、通用的、有共识的协议标准。 ● MCP 是一个标准协议,就像给 AI 大模型装了一个 “万能接口”,让 AI 模型能够与不同的数据源和工…...

EasyRTC嵌入式音视频通信SDK助力1v1实时音视频通话全场景应用

一、方案概述​ 在数字化通信需求日益增长的今天,EasyRTC作为一款全平台互通的实时视频通话方案,实现了设备与平台间的跨端连接。它支持微信小程序、APP、PC客户端等多端协同,开发者通过该方案可快速搭建1v1实时音视频通信系统,适…...

Prometheus学习之pushgateway和altermanager组件

[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# pwd /usr/local/alertmanager-0.28.1.linux-amd64[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# cat alertmanager.yml # 通用配置 global:resolve_timeout: 5msmtp_from: 914XXXXX…...

01 redis 的环境搭建

前言 这一系列文章主要包含的内容主要是 各种常用软件的调试环境的搭建 主要的目的是 搭建一个可打断点的一个调试环境 c 系列 主要是基于 clion 调试, java 系列主要是基于 idea 调试, js 系列主要是基于 webstorm 调试 需要有一定的 c, c, java, js 相关基础 基于的…...

《操作系统真相还原》——加载器

显存 将上一章的中断输出,变为显存输出 加载器 使用mbr引导程序从磁盘中加载loader程序。 MBR %include "boot.inc" SECTION MBR vstart0x7c00 mov ax,cs mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax;cl…...

电网即插即用介绍

一、统一设备信息模型与标准接口 实现即插即用功能的基础在于建立统一的设备信息模型。不同厂家生产的各类电网设备,其内部结构、通信协议、数据格式等往往千差万别。通过制定统一的设备信息模型,能够对设备的各种属性、功能以及接口进行标准化定义&…...

HJ25 数据分类处理【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ25 数据分类处理 一、题目描述 二、测试用例 三、解题思路 基本思路:   首先理解题目,题目要求对规则集先进行排序,然后去重,这一步我…...

spring-boot redis lua脚本实现滑动窗口限流

因为项目中没有集成redisson,但是又需要用到限流,所以简单的将redisson中限流的核心lua代码移植过来,并进行改造,因为公司版本的redis支持lua版本为5.1,针对于长字符串的数字,使用tonumber转换的时候会得到…...

USB MSC

主机(如电脑)识别USB MSC(Mass Storage Class)设备中的文件,本质上是通过多层协议协作实现的,涉及USB枚举、SCSI命令传输和文件系统解析三个核心环节。以下是详细机制: 🔍 ​一、USB…...

css实现文字渐变

在前端开发中&#xff0c;给文字设置渐变色是完全可以实现的&#xff0c;常用的方式是结合 CSS 的 background、-webkit-background-clip 和 -webkit-text-fill-color 属性。下面是一个常见的实现方法&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> …...

FART 自动化脱壳框架一些 bug 修复记录

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ open() 判断不严谨 https://github.com/CYRUS-STUDIO/FART/blob/master/fart10/art/runtime/art_method.cc 比如&#xff1a; int dexfilefp open(dex_pat…...

基于Flask实现豆瓣Top250电影可视化

项目截图 概述 该项目旨在对豆瓣Top 250电影进行全面的数据分析&#xff0c;使用了Python爬虫、Flask框架进行开发&#xff0c;并采用了Echarts进行数据可视化以及WordCloud进行词云分析。应用展示了多个功能&#xff0c;如电影列表、评分分布、词频统计和团队信息。 主要功能…...

More SQL(Focus Subqueries、Join)

目录 Subqueries Subqueries That Return One Tuple Subqueries and Self Connection The IN Operator The Exists Operator The Operator ANY The Operator ALL Union, Intersection, and Difference&#xff08;交并差&#xff09; Bag Semantics Controlling Dupl…...

项目部署react经历

简单的说&#xff1a; 1. 编译打包并压缩为压缩包 2. 将压缩包上传到服务器&#xff08;这里以宝塔面板为例&#xff1a;www/wwwroot/目录下&#xff09; 3. 将文件解压生成比如&#xff1a;www/wwwroot/ttms/build/* 多文件 4. php 项目建站&#xff0c;选择静态&#xff…...

从图像处理到深度学习:直播美颜SDK的人脸美型算法详解

在直播的镜头前&#xff0c;每一位主播都希望自己“光彩照人”。但在高清摄像头无死角的审视下&#xff0c;哪怕是天生丽质&#xff0c;也难免需要一点技术加持。于是&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台提升用户粘性和视觉体验的重要工具。 尤其是在“人脸美…...

智能教育个性化学习路径规划系统实战指南

引言 在数字化教育革命中&#xff0c;如何利用AI技术实现"因材施教"的千年教育理想&#xff1f;本文将通过构建一个完整的智能教育系统&#xff0c;演示如何基于Python生态&#xff08;Django机器学习&#xff09;实现从数据采集到个性化推荐的全流程。系统将通过分…...

spark- ResultStage 和 ShuffleMapStage介绍

目录 1. ShuffleMapStage(中间阶段)1.1 作用1.2 核心特性1.3 示例2. ResultStage(最终结果阶段)2.1 作用2.2 核心特性2.3 示例3. 对比总结4. 执行流程示例5. 常见问题Q1:为什么需要区分两种 Stage?**Q2:如何手动观察 Stage 划分?Q3:ShuffleMapStage 的数据一定会落盘吗…...

zTasker一款Windows自动化软件,提升效率:大小仅有10MB,免费无广告

一、zTasker是什么&#xff1f; zTasker是一款发布于2023年9月的免费无广告工具&#xff0c;专为Windows用户打造。它以仅8MB的轻量体积、极低资源占用&#xff08;内存消耗不足10MB&#xff09;和秒级启动速度脱颖而出&#xff0c;堪称“任务计划程序的终极强化版”。无论是定…...

人工智能100问☞第34问:什么是语音识别与合成?

目录 一、通俗解释 二、专业解析 三、权威参考 在人工智能的世界里,“看、听、说、写”早已不是人类的专属技能。语音识别,让机器有了耳朵;语音合成,让机器长了嘴巴;合在一起,机器就开始“说人话、听人言”了。 一、通俗解释 1、语音识别:让机器听懂人说话 你有没…...

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现 一、网络流问题与相关概念1.1 网络流问题定义1.2 关键概念 二、Ford-Fulkerson算法原理2.1 核心思想2.2 算法步骤 三、Ford-Fulkerson算法的代码实现3.1 Python实现3.2 C实现3.3 Java实现 四、Ford-Fulkerson算法的时间…...

怎么从一台电脑拷贝已安装的所有python第三方库到另一台

要将Python库从一台电脑拷贝到另一台&#xff0c;可以采用以下方法&#xff1a; 方法一&#xff1a;使用pip命令导出和安装依赖 如果目标电脑在线&#xff0c;且python与pip命令可以正常使用 在源电脑上&#xff0c;打开命令行&#xff0c;执行以下命令导出所有依赖库到requ…...

【测试】Bug和用例

软件测试贯穿于软件的整个⽣命周期 软件测试的⽣命周期是指测试流程&#xff0c;这个流程是按照⼀定顺序执⾏的⼀系列特定的步骤&#xff0c;去保证产品质量符合需求。在软件测试⽣命周期流程中&#xff0c;每个活动都按照计划的系统的执⾏。每个阶段有不同的⽬标和交付产物 Bu…...

缓存穿透、缓存击穿、缓存雪崩目前记录(纯日记)

今天学了学这三个知识&#xff0c;这命名真是有点东西。 1.先说在命名方面与其余两个内容能明显区分开的缓存雪崩&#xff0c;简单来讲&#xff1a; 缓存雪崩就是缓存宕机了&#xff0c;也甭管咋宕机了&#xff0c;反正就是某一时刻&#xff0c;缓存用不了了。 那咋办&#…...

鸿蒙OS的5.0.1.120版本体验怎么样?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 越来越是好用了&#xff0c;之前是凑合能用&#xff0c;现在是大多能用。 我朋友的mate30PRO和PuraX一起用&#xff0c;新系统确实满足我90%以上的需求 一个系统适配一款机型&#xff0c;是要…...

使用ssh-audit扫描ssh过期加密算法配置

使用ssh-audit扫描ssh过期加密算法配置 安装检查ssh的加密算法配置修改ssh的加密算法配置 安装 # pip3安装ssh-audit pip3 instal ssh-audit检查ssh的加密算法配置 # 检查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…...

前端工程化 Source Map(源码映射)详解

我们来深入讲解前端 Source Map&#xff08;源码映射&#xff09;&#xff0c;围绕以下结构展开&#xff1a; 一、为什么要用 Source Map&#xff1f;&#xff08;Why&#xff09; 背景问题&#xff1a; 在前端构建中&#xff0c;源代码通常会被压缩&#xff08;minify&#…...