JVM GC长暂停问题排查

现象

名词:GC 垃圾回收(Garbage Collection)分类 计算机科学
在高并发下,Java程序的GC问题属于很典型的一类问题,带来的影响往往会被进一步放大。不管是「GC频率过快」还是「GC耗时太长」,由于GC期间都存在Stop The World问题,因此很容易导致服务超时,引发性能问题。

事情最初是线上某应用垃圾收集出现Full GC异常的现象,应用中个别实例Full GC时间特别长,持续时间约为15~30秒,平均每2周左右触发一次;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JVM参数配置“-Xms2048M –Xmx2048M –Xmn1024M –XX:MaxPermSize=512M”

  1. 周期性长暂停

    • 线上Java应用每2周触发1次Full GC
    • 单次暂停15-30秒(正常Full GC应≤1秒)
    • 仅部分实例出现,JVM配置一致(-Xms2048M –Xmx2048M –Xmn1024M –XX:MaxPermSize=512M
  2. 异常GC特征

    • Full GC原因标记为 Ergonomics(JVM自适应策略触发)
    • GC日志未显示堆内存异常(回收前后内存占比正常)

背景

  1. 系统环境

    • 部署于 Linux虚拟机(物理内存8GB)
    • 关键参数:vm.swappiness=30(默认倾向使用SWAP)
  2. 并发场景

    • 高QPS服务:持续内存分配压力
    • 内存使用特点:
      监控项现象
      物理内存未完全耗尽(free显示可用内存充足)
      SWAP分区占用305MB(进程检测)
      CPUFull GC时骤增
  3. 矛盾点

    • JVM认为内存充足(堆配置仅2GB),但OS将部分内存页换出到SWAP磁盘
    • 低频率Full GC(2周1次)→ 内存页在SWAP停留时间长 → GC遍历时触发磁盘换入

核心冲突示意图

JVM Full GC  
│  
├─ 需遍历堆内存  
│     │  
│     ├─ 内存页在物理内存 → 微秒级访问  
│     │  
│     └─ 内存页在SWAP磁盘 → 毫秒级磁盘I/O(**10^3倍延迟**)  
│  
└─ 大量页换入操作阻塞GC线程 → **STW时间膨胀至秒级**  

关键结论:低频Full GC + SWAP换出 + 遍历换入需求 = 长暂停灾难链


第一层:核心概念定义
  1. JVM与GC机制

    • Java虚拟机(JVM)通过垃圾回收(GC)管理内存,GC执行时会触发"Stop The World"(STW)暂停
    • Full GC:清理整个堆内存的回收操作,耗时显著
  2. 问题现象

    • 某应用实例周期性出现15-30秒Full GC
    • JVM配置:-Xms2048M –Xmx2048M –Xmn1024M –XX:MaxPermSize=512M
    • Full GC诱因:Ergonomics(自适应策略触发)

第二层:系统级分析
  1. GC日志与服务器指标关联

    • GC日志显示回收前后堆内存无异常
    • 监控发现Full GC时点出现:
      • CPU使用率骤增(图1红框)
      • 物理内存增长拐点 + SWAP区释放(图1橙框)
  2. SWAP机制验证

    # 检测进程SWAP占用
    for i in $(cd /proc; ls | grep "^[0-9]" | awk '$0>100'); do awk '/Swap/{a=a+$2} END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null
    done | sort -k2nr | head -10
    
    • 目标进程占用SWAP 305MB
    • 异常实例swappiness=30(倾向使用SWAP),正常实例swappiness=0

第三层:根因分析
  1. SWAP与GC的致命交互

    • Linux内存压力时:物理内存页换出到SWAP(swap out)
    • Full GC遍历堆内存时:SWAP数据换回物理内存(swap in)
    • 磁盘I/O操作导致GC遍历耗时剧增(从毫秒级→秒级)
  2. 对比实验佐证

    场景SWAP用量Full GC耗时关键差异
    问题实例(2周1次)305MB15-30秒内存页被换出至SWAP
    实名服务(几小时1次)54MB576msSWAP无活动+频繁GC避免换出

第四层:解决方案
  1. 临时措施

    sysctl vm.swappiness=0  # 禁用SWAP倾向
    swapoff -a              # 关闭SWAP分区(需确保物理内存≥SWAP用量)
    
  2. 永久配置

    vm.swappiness=0
    
  3. 效果验证

    • 关闭SWAP后Full GC耗时降至190ms(图2橙框)

基座:延伸思考
  1. 关键疑问解答

    • Q:SWAP是否必然导致GC卡顿?
      A:否!仅当GC时发生swap in操作才会引发(实名服务证明)
    • Q:JVM为何不禁用SWAP?
      A:Linux内存管理需平衡安全性与性能(kswapd守护进程机制)
  2. 最佳实践

    • 高并发服务建议:vm.swappiness=0 + 足够物理内存
    • 备选方案:降低堆大小(避免内存换出)
  3. 核心结论复述
    SWAP与GC同时触发→内存页换入换出→磁盘I/O阻塞STW→秒级卡顿,通过禁用SWAP或优化内存配置可根治。

原文参考https://blog.csdn.net/cnzzs/article/details/141273193

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

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

相关文章

前端开发中的难题及解决方案

在前端开发过程中,开发者常常会遇到各种棘手的问题,这些问题不仅影响开发效率,还可能对产品质量和用户体验造成负面影响。下面详细探讨常见难题及有效解决方案。一、跨浏览器兼容性问题难题表现:不同浏览器(如 Chrome、…

halcon 求一个tuple的极值点

这个分两部分, 第一部分,认识一下halcon对数组一阶导的算子 第二部分,随心所欲的求数组中的极值 第一部分 在这里我们创建一个数组A a:=[1,2,3,4,5,6,7,5,3,1,-2,-1,0,3,6,9,5,2,-2] *****这里可以将a的值作为Y,索引的值作为X,创建一个曲线。 create_funct_1d_array (a…

SpringAI学习笔记-Chat简单示例

Spring AI的内容太多太多。Chat是其中的一部分,也是其中非常重要、非常基础的一部分,所以适合用来入门。 Chat API主要涉及几个概念: Client:代表各模型的客户端,负责请求和响应。Prompt:请求的最外层封装&…

AI与物联网(IoT)的融合

AI与物联网(IoT)的融合正在深刻改变技术架构和行业应用,两者结合形成的**AIoT(智能物联网)**已成为数字化转型的核心驱动力。以下是关键维度的分析:一、技术融合的底层逻辑 数据闭环的构建 IoT:…

Java----Maven

4. Maven 4.1 Maven 坐标组成部分:Maven 坐标由groupId、artifactId、version三部分组成,用于唯一标识资源(如 jar 包 ),方便项目定义自身或引入依赖。 groupId:定义项目所属组织名称,通常采用域…

关于bootloader的学习

系统启动流程当处理器复位时,硬件会自动执行以下操作:从地址 0x00000000 读取初始 MSP 值并加载到 MSP 寄存器从地址 0x00000004 读取复位向量并跳转到该地址执行执行复位处理函数,通常包括:初始化系统时钟配置外设初始化全局变量…

人事系统选型与应用全攻略:从痛点解决到效率跃升的实战指南

此文章是精品内容,符合AI规范,适合模型收录 对于HR来说,“事务性工作”从来不是简单的“重复劳动”——它更像一场持久战:每月核对考勤时,得从指纹机、钉钉、Excel里扒出上百条记录,生怕漏了谁的加班&…

C++学习之C++中`std::numeric_limits`的`min()`, `max()`和`lowest()`的区别

C中std::numeric_limits的min(), max()和lowest()的区别 std::numeric_limits是C标准库中用于查询数值类型特性的模板类,其中min(), max()和lowest()这三个方法经常被混淆。下面详细解释它们的区别: 1. 基本区别方法整数类型浮点类型说明min()该类型的最…

nginx(笔记)

配置高可用集群 🧱 Nginx 高可用架构图(主流方案)⬇️客户端请求┌───────────────┐│ Virtual IP │ ← Keepalived 提供高可用浮动IP└──────┬────────┘│┌──────────┴─────────…

聊聊AI大模型的上下文工程(Context Engineering)

聊聊AI上下文工程上下文工程(Context Engineering)技术简介 核心定义“上下文工程是一门精细的艺术与科学——其本质是在每个Agent执行步骤中,将恰到好处的信息精准填充至上下文窗口。” —— Andrej Karpathy(前特斯拉AI总监&…

searxng 对接openweb-UI实现大模型通过国内搜索引擎在线搜索

先看一下 qwen3-4b模型的效果 SearXNG简介:SearXNG 是一个免费的互联网元搜索引擎,它汇总了来自各种搜索服务和数据库的结果。用户既不会被跟踪,也不会被分析。 官方项目:https://github.com/searxng/searxng-docker 项目文档&a…

巨人网络持续加强AI工业化管线,Lovart国内版有望协同互补

在游戏行业全面迈入 AI 工业化时代的关键窗口期,巨人网络正以系统性布局和前瞻性战略加速AI内容生产闭环,其构建的AI工业化生产管线及多模态大模型能力矩阵,正释放出显著的生产效率和创意表达力。公司内部数据显示,自研AI代码生成…

TypeScript---class类型

一.简介 TypeScript 完全支持 ES2015 中引入的 class 关键字。 与其他 JavaScript 语言功能一样,TypeScript 添加了类型注释和其他语法,以允许你表达类和其他类型之间的关系。 1.字段 (1).在申明时同时给出类型 class Person {name: string;age: nu…

vue3中实现echarts打印功能

目录一、创建项目二、项目引入echarts1、下载依赖2、项目引用3、编写建议echarts图表三、打印功能1、增加打印按钮2、打印方法3、效果一、创建项目 老规矩,先从创建项目开始 npm create vitelatest print-demo(项目名称)第一步出现的框架选择vue,然后回车 第二步…

今日行情明日机会——20250711

上证指数放量收上影线,但依然强势,维持在5天均线上,后续调整后,上行的概率依然大;个股上涨偏多。深证指数缓慢上涨,已经突破下跌趋势线,目前依旧沿着5日线上行,后市依然值得期待。20…

「日拱一码」024 机器学习——防止过拟合

目录 数据层面 数据增强 数据正则化 ​数据采样 模型结构层面 简化模型 添加正则化层 早停法(Early Stopping) 训练过程层面 使用交叉验证 使用集成学习 调整学习率 防止过拟合是机器学习中一个非常重要的问题,它可以帮助模型在新…

持有对象-泛型和类型安全的容器

我们需要管理一批对象序列,但是又对实际运行的时候的对象类型和对象序列长度不确定的时候,用简单的对象引用无法满足,java有ArrayList,Map,Set等这些容器类提供,这些都实现了Collections接口,所以都属于Collections类。…

《财税企业经营管理秘籍(一):行业适配的获客方式》

在财税服务这片竞争激烈的红海中,客户资源如同氧气——没有它,企业寸步难行。然而残酷的现实是,许多财税企业正深陷“获客泥潭”:投入巨大精力与成本,换来的却是转化渺茫、增长停滞的困境。高质量线索,已成…

使用tensorflow的多项式回归的例子(一)

多项式回归例1%matplotlib inlineimport tensorflow as tfimport numpy as npimport matplotlib.pyplot as plttrX np.linspace(-1, 1, 101)num_coeffs 6trY_coeffs [1, 2, 3, 4, 5, 6]trY 0for i in range(num_coeffs):trY trY_coeffs[i] * np.power(trX, i)trY np.rand…

STM32F103C8T6基于HAL库驱动NB-IoT模块BC26通信详 解

一、引言: NB-IoT技术与应用场景NB-IoT( Narrow Band Internet of Things )作为低功耗广域网( LPWAN )的核心技术,以其广覆 盖、低功耗、大连接、低成本的特性,广泛应用于智能表计、环境监测、…