尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

JVM基础2:OOM内存溢出排查、简单调优参数

JVM基础2:OOM内存溢出排查、简单调优参数 五大类内存故障识别、报错与成因Java heap space 堆内存溢出最常见 OOM1.报错日志java.lang.OutOfMemoryError: Java heap space2.核心产生原因① 内存泄漏全局 static 静态 Map/List 长期持有对象GC 无法回收② 瞬时超大对象一次性查询百万数据库数据、创建超大数组③ 堆最大内存-Xmx设置过小并发创建对象总量超出堆容量④ 大量长期存活对象晋升老年代Full GC 回收后依旧无空闲内存。3.典型业务场景营销优惠券 static 缓存无限存放用户、循环反复 new 大量 DTO 对象。Metaspace 元空间溢出1.报错日志java.lang.OutOfMemoryError: Metaspace2.核心产生原因① 频繁 CGLIB 动态代理、反射、热加载逻辑持续生成 Class 类② SpringAOP、MyBatis 框架自动生成大量业务代理类③ 未配置元空间最大上限-XX:MaxMetaspaceSize无限制占用操作系统本地内存。Direct buffer memory 堆外直接内存溢出1.报错日志java.lang.OutOfMemoryError: Direct buffer memory2.核心产生原因① NIO、Netty 文件上传 / 大流量 IO 使用 DirectByteBuffer使用后未手动释放② 未限制堆外内存上限频繁创建缓冲区不回收③ 高并发网络 IO 没有复用缓冲区对象。unable to create new native thread 无法创建线程 OOM1.报错日志java.lang.OutOfMemoryError: unable to create new native thread2.核心产生原因① 线程池未设置最大线程数并发无限创建业务线程② 单线程栈-Xss配置过大单个线程占用内存高操作系统可创建线程总数被耗尽③ Linux 系统本身进程最大线程阈值配置过小。StackOverflowError 栈溢出非 OOM高频内存故障1.报错日志java.lang.StackOverflowError2.核心产生原因① 递归代码无终止条件无限递归② 多层方法深度嵌套栈帧数量超出-Xss栈内存承载上限。故障类型报错日志核心成因典型业务场景是否属于 OOMJava heap space 堆内存溢出java.lang.OutOfMemoryError: Java heap space1. 静态集合内存泄漏2. 一次性加载超大对象3. -Xmx 堆内存配置过小4. 老年代占满 Full GC 后无空间优惠券 static 缓存无限存用户、循环 new 大量 DTO、全量查询数据库✅ 是最常见Metaspace 元空间溢出java.lang.OutOfMemoryError: Metaspace1. CGLIB 动态代理 / 反射频繁生成 Class2. SpringAOP、MyBatis 自动生成代理类3. 未配置 MaxMetaspaceSize无限占本地内存大量动态代理、热更新框架、反射扫描✅ 是Direct buffer memory 堆外内存溢出java.lang.OutOfMemoryError: Direct buffer memory1. NIO/Netty DirectByteBuffer 未手动释放2. 无堆外内存上限限制3. 高并发 IO 未复用缓冲区文件上传、大流量网络 IO、Netty 服务✅ 是unable to create new native thread 无法创建线程java.lang.OutOfMemoryError: unable to create new native thread1. 线程池无最大线程限制无限新建线程2. -Xss 栈内存过大单线程占内存高3. Linux 系统线程数上限过低无界线程池、海量并发请求✅ 是StackOverflowError 栈溢出java.lang.StackOverflowError1. 递归无终止条件无限递归2. 方法嵌套层数过深栈帧超限递归遍历树、递归计算、深层方法嵌套❌ 不属于 OOM独立异常记忆方式分组记忆5 类故障分成两组减少记忆量第一组4 种真正 OOM都带 OutOfMemoryError堆 OOMnew 出来的对象太多 / 静态集合不清理 → 业务缓存、批量查库元空间 OOM生成类太多代理、反射→ SpringAOP、CGLIB堆外 OOMNIO 缓冲区没释放 → 文件上传、Netty线程 OOM线程无限创建 → 无界线程池第二组栈溢出单独区分不带 OOM只有递归 / 多层方法嵌套栈不够用和堆、类、IO、线程无关。每一类抓 1 个核心关键词记口诀口诀堆对象元类堆外 IO线程池栈递归拆解堆内存 OOM → 关键词对象大量对象、静态集合元空间 OOM → 关键词类 Class动态生成类堆外 Direct buffer → 关键词IO/NIO文件、网络传输无法创建线程 → 关键词线程池无限开线程Stack 栈溢出 → 关键词递归死递归、多层方法OOM 事前配置与标准线上排查流程生产环境必须配置的 JVM 启动参数OOM 自动留存快照 GC 日志全套参数配置# OOM崩溃时自动生成堆快照文件 -XX:HeapDumpOnOutOfMemoryError # 指定dump文件保存路径 -XX:HeapDumpPath/data/jvm/dump.hprof # 打印GC详细信息 -XX:PrintGCDetails # 打印GC发生的时间戳 -XX:PrintGCTimeStamps # GC日志输出路径 -Xloggc:/data/jvm/gc.log各参数作用-XX:HeapDumpOnOutOfMemoryError服务发生 OOM 异常崩溃时自动导出.hprof堆快照是定位内存泄漏的核心文件不配置则宕机无任何内存分析依据。-XX:HeapDumpPath自定义快照存放目录建议挂载磁盘路径避免占满系统盘。GC 日志相关参数记录每一次 Minor GC、Full GC 的内存变化、停顿耗时用于提前预判内存缓慢上涨、频繁 GC 问题。OOM 故障标准排查完整步骤拿到服务器.hprof文件 → 本地 MAT 打开 → 优先查看泄漏报告再配合直方图、支配树定位代码问题。1.服务因 OOM 重启后登录服务器拷贝.hprof快照文件到本地2.使用 MAT 内存分析工具打开快照文件3.使用 MAT 三大核心功能定位问题① Histogram 直方图统计所有对象实例数量、占用内存大小快速找到超大对象② Dominator Tree 支配树查看哪些对象占用绝大部分堆内存直接锁定内存泄漏源头static 集合③ Leak Suspects 泄漏可疑报告工具自动扫描给出内存泄漏可疑点新手优先看这个4.根据 MAT 分析结果对照业务代码确认泄漏代码静态容器、未释放缓冲区、一次性加载全量数据5.临时调大对应内存参数恢复线上业务业务低峰期重构代码彻底修复内存泄漏。MAT 工具讲解MAT 就是专门拆堆快照、找内存泄漏和大对象的免费离线分析工具。全称与定位MAT Eclipse Memory Analyzer ToolEclipse 开源离线堆内存分析工具Java 后端排查 OOM、内存泄漏行业标准工具免费独立软件。作用对象专门解析.hprof堆快照文件OOM 自动生成 /jmap 手动导出快照里保存崩溃瞬间堆内所有对象、引用关系、内存占用。核心用途定位内存泄漏找到 static 集合长期持有、无法回收的对象找出超大对象一次性加载百万数据、大数组自动生成泄漏报告不用人工逐条翻对象。三个必用核心功能Histogram 直方图统计每个类创建多少对象、占用多少内存Dominator Tree 支配树查看哪些对象独占绝大部分内存直接锁定泄漏源头Leak Suspects 泄漏报告工具自动扫描一键标出可疑泄漏点新手优先看。无 dump 快照文件的应急排查方案如果上线未配置自动 dump服务出现内存异常卡顿 / 频繁 Full GC使用 jdk 自带命令手动排查jps查询所有 Java 进程获取目标服务 PIDjmap -dump:formatb,fileheap.hprof PID手动实时导出当前堆快照jstat -gc PID 1000每隔 1 秒打印 GC 运行指标持续观察老年代内存是否持续上涨jstack PID打印全部线程栈排查死循环、无限递归、线程池打满jmap -heap PID查看新生代、老年代当前内存占用比例、分代配置。Linux JVM 实时排查命令使用命令jps作用列出本机所有 Java 进程输出进程 PID所有 JVM 排查命令都需要 PID 作为入参。 常用jps -l打印完整启动类名方便区分多个服务。命令jmap堆快照、堆内存查看导出堆快照jmap -dump:formatb,fileheap.hprof PID线上无自动 dump 时手动生成 hprof 文件用于 MAT 分析内存泄漏。查看堆分代详情jmap -heap PID查看 Xms/Xmx、新生代大小、Eden/Survivor 比例、新生代 / 老年代实时占用。命令jstat -gc命令格式jstat -gc PID 1000每 1 秒输出一组 GC 指标持续监控 新生代 Eden 占用、Survivor 使用量、老年代内存变化、Minor GC 次数耗时、Full GC 次数耗时 核心用途观察老年代内存持续缓慢上涨提前预判内存泄漏。命令jstack命令jstack PID打印服务所有线程完整栈信息 排查场景无限递归、死循环、线程死锁、线程池耗尽、unable to create native thread 线程 OOM。命令使用先后流程jps 获取服务 PID内存持续上涨 / 频繁 GCjstat -gc 持续监控指标需要离线分析泄漏jmap 导出 dump 快照线程卡死、接口超时、栈溢出jstack 打印线程栈想看堆整体分配jmap -heap生产全套 JVM 调优参数详解堆内存核心参数线上标配1.-Xms堆初始内存2.-Xmx堆最大内存生产硬性规范-Xms 和 -Xmx 设置相同数值原因规避运行期堆内存动态扩容、缩容带来的停顿开销减少 GC 耗时保障接口响应平稳。示例-Xms3g -Xmx3g新生代配置参数1.-Xmn新生代总容量Eden 区 两个 Survivor 区经验分配新生代约占堆总大小的 1/3高并发短信、营销业务临时对象多可适度调大新生代降低 Minor GC 频次。2.-XX:SurvivorRatio8默认比例 Eden:S0:S1 8:1:1日常业务无需修改Survivor 空间过小会导致存活对象过早升入老年代诱发频繁 Full GC。元空间 Metaspace 参数必配防止类加载溢出-XX:MetaspaceSize128m元空间初始容量填满后触发扩容 GC-XX:MaxMetaspaceSize256m元空间上限生产必须配置场景项目大量使用 SpringAOP、CGLIB 动态代理、反射较多时可上调上限避免 Metaspace OOM。线程栈参数-Xss256k单个线程栈容量系统默认 512k高并发海量请求服务改为 256k节约内存避免线程过多触发无法创建线程 OOM递归计算、多层方法调用业务适当调大预防 StackOverflowError。堆外内存限制Netty/NIO/ 文件上传场景必备-XX:MaxDirectMemorySize512m约束 DirectByteBuffer 堆外内存最大值杜绝 Direct buffer memory 类型堆外 OOM。GC 日志 OOM 快照参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/jvm/ -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:/data/jvm/gc-%t.log作用留存 GC 运行日志、OOM 崩溃瞬间堆快照方便故障复盘定位根源。参数分类参数名称作用说明生产建议配置堆内存-Xms堆初始内存与-Xmx设为相同值避免动态扩容停顿堆内存-Xmx堆最大内存示例-Xmx3g根据服务器内存分配新生代-Xmn新生代总容量EdenS0S1约占堆总大小 1/3高并发临时对象多可调大新生代-XX:SurvivorRatio8Eden 与 Survivor 比例默认 8:1:1一般不修改元空间-XX:MetaspaceSize128m元空间初始容量128m 起步AOP / 代理多可调高元空间-XX:MaxMetaspaceSize256m元空间最大上限生产必须配置防止无限占用本地内存线程栈-Xss256k单个线程栈容量高并发服务设 256k递归多的业务适当调大堆外内存-XX:MaxDirectMemorySize512m堆外直接内存上限Netty/NIO/ 文件上传服务必须配置OOM 快照-XX:HeapDumpOnOutOfMemoryErrorOOM 时自动生成堆快照生产强制开启宕机后可回溯分析OOM 快照-XX:HeapDumpPath/data/jvm/堆快照保存路径指定磁盘目录避免占满系统盘GC 日志-XX:PrintGCDetails打印 GC 详细信息生产建议开启GC 日志-XX:PrintGCTimeStamps打印 GC 时间戳生产建议开启GC 日志-Xloggc:/data/jvm/gc-%t.logGC 日志输出路径生产建议开启带时间戳命名常见 GC 收集器对比 G1 调优实战常见 GC 收集器对比Serial 串行收集器新生代Serial Copying老年代Serial Old特点单线程运行触发 GC 时暂停所有用户线程STW适用客户端小程序、内存极小的嵌入式设备线上服务基本淘汰Parallel 并行收集器吞吐量优先新生代Parallel Scavenge老年代Parallel Old核心目标最大化系统吞吐量降低 CPU 占用损耗缺点STW 停顿时间不可控停顿偏长适用后台批处理、数据统计离线任务对响应延迟无要求的业务CMS 并发收集器低延迟旧版收集器JDK8 主流、JDK9 废弃定位老年代并发回收追求更短 STW运行阶段初始标记→并发标记→重新标记→并发清除弊端会产生内存碎片需要定期压缩整理并发阶段占用 CPU并发失败会退化为 Serial Old无法处理超大堆内存适用早年中小型互联网应用现已逐步被 G1 替代G1Garbage-FirstJDK8 默认推荐设计核心可预测的停顿时间 大堆内存适配内存布局把整个堆划分为多个大小相等的 Region不再固定 Eden、Survivor、老年代整块划分回收逻辑优先回收垃圾最多的 Region故名 Garbage-First优势用户可自行设置最大预期停顿时间JVM 自动适配自动整理内存碎片无需手动压缩适配数 G~ 几十 G 大堆内存适用绝大多数线上 Java 后端服务、短信营销、接口业务目前企业最常用G1 调优实战G1 核心关键参数参数作用生产配置建议-XX:UseG1GC启用 G1 垃圾收集器JDK8 服务统一开启-XX:MaxGCPauseMillis200设置 GC 最大预期停顿时间单位 ms常规业务 200ms高实时接口 100~150ms-XX:G1NewSizePercent20新生代堆最小占比默认 20%无需改动-XX:G1MaxNewSizePercent60新生代堆最大占比默认 60%临时对象多可小幅上调-XX:G1HeapRegionSizen每个 Region 大小JVM 自动计算最优值不手动修改-XX:PrintGCApplicationStoppedTime打印 STW 停顿时长开启便于排查卡顿G1 调优核心思路优先设定合理停顿时间MaxGCPauseMillis不要一味追求极小停顿过小会导致 GC 频率飙升、CPU 占用过高观察 GC 日志若新生代对象飞速晋升老年代适度上调新生代占比频繁出现 GC 停顿超标检查是否存在内存泄漏、大对象频繁创建堆内存过大16G 以上可考虑 ZGC普通业务 G1 完全够用。各收集器横向对比总结收集器侧重点STW 长短堆内存适配企业使用现状Serial极简、小内存很长几百 M 以内淘汰Parallel吞吐量优先较长中小堆离线批处理CMS低延迟较短4G 以内中小堆逐步淘汰G1可控停顿 大堆均衡短且可预估4G~16G 主流线上主流首选营销业务 OOM 完整实战链路适配场景分布式营销短信系统高峰期大量临时报文、队列消息、批量用户数据极易频发堆内存溢出、线程 OOM、元空间溢出、堆外内存溢出整套流程遵循故障现象定位 → 抓取现场日志快照 → 日志 文件解析 → 根因判定 → 调优整改 → 灰度验证第一步线上故障触发初步现象识别常见 OOM 报错日志分类Java Heap Space 堆内存溢出日志java.lang.OutOfMemoryError: Java heap space表现接口响应越来越慢、服务 CPU 冲高后骤降、节点频繁重启GC 日志 Full GC 频繁且老年代占用只涨不跌诱因批量加载全部手机号、消息对象未及时释放、缓存无限堆积、集合未清空Metaspace 元空间溢出日志java.lang.OutOfMemoryError: Metaspace表现运行一段时间后突然宕机重启短暂恢复诱因频繁动态代理、AOP 切面、反射解析短信模板、重复加载类Direct buffer memory 堆外内存溢出日志java.lang.OutOfMemoryError: Direct buffer memory表现netty 通信、MQ 收发消息、大报文上传下载后内存持续上涨诱因堆外内存未回收未配置堆外内存上限unable to create new native thread 线程 OOM日志java.lang.OutOfMemoryError: unable to create new native thread表现并发量大之后接口全部阻塞无法新建业务线程诱因线程池无上限、单个线程栈过大、线程长时间阻塞不释放第二步紧急应急处置线上优先保业务快速扩容节点分流流量避免单点负载过高彻底崩溃临时重启故障实例重启会清空堆内存短暂恢复可用重启前务必抓取现场文件临时限流调低短信下发并发阈值削减批量推送任务体量第三步抓取故障现场数据核心无快照无法精准定位获取进程 PIDjps -l | grep sms-service导出堆快照手动抓取jmap -dump:formatb,filesms_oom.hprof 进程PID打印线程栈排查死锁、线程阻塞、线程耗尽jstack PID thread.log查看堆内存整体使用情况jmap -heap PID持续打印 GC 运行日志确认已开启启动参数-XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:/data/gc.log第四步离线解析文件逐层定位根因场景 1堆内存溢出 Heap Space1.使用 MAT 工具打开 hprof 文件2.查看Histogram 直方图统计占用内存最多的对象 营销业务高频元凶短信批量收件人 List 集合超大一次性加载上万手机号未分页RabbitMQ 消息消费堆积消息对象积压在内存队列本地缓存未设置过期淘汰策略营销活动数据无限累加3.查看Dominator Tree 支配树找出占用绝大部分内存的大对象4.查看线程栈确认代码位置定位未释放的集合、大对象场景 2线程耗尽 / 接口阻塞打开 thread.log大量线程处于 WAITING/BLOCKED 阻塞状态线程池核心线程被无限占用短信调用第三方运营商接口超时无超时时间线程卡死无法回收线程池无最大容量限制并发飙升疯狂新建线程场景 3元空间溢出GC 日志伴随类加载数量持续上涨大量 CGLIB 动态类反复创建 营销系统频繁切换短信模板、切面日志、权限校验大量使用反射与动态代理场景 4堆外内存溢出Netty 收发 MQ、TCP 报文未回收 DirectBuffer未配置MaxDirectMemorySize第五步针对性整改方案营销业务专属堆内存基础参数统一配置-Xms4g -Xmx4g -Xmn1300m -XX:SurvivorRatio8Xms 与 Xmx 一致杜绝扩容停顿新生代占堆 1/3适配海量短期消息对象元空间防护-XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m线程栈优化防止线程 OOM-Xss256k高并发下发场景缩小单线程栈容纳更多工作线程堆外内存限制MQNetty 必备-XX:MaxDirectMemorySize512mG1 收集器适配营销大流量场景-XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:G1MaxNewSizePercent60可控 GC 停顿流量高峰期自动扩容新生代减少短命对象晋升老年代OOM 自动落盘 GC 日志永久开启-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/jvm/dump/ -XX:PrintGCDetails -Xloggc:/data/jvm/gc-%t.log代码层面根治最关键批量推送手机号分页查询禁止一次性全量加载MQ 消费设置批量大小堆积过多触发限流及时 ack 释放消息本地缓存使用 Caffeine/Redis设置过期时间与最大容量第三方接口强制设置超时时间线程池定义核心数、最大线程、队列上限避免循环内重复创建大量临时字符串、对象第六步灰度上线 持续观测验证1.先部署 1 台节点试运行 24 小时2.观测指标GC 频率、Full GC 次数趋近于 0老年代内存平稳无持续上涨线程总数稳定无持续攀升接口平均延迟平稳3.无异常后全量发布高峰期持续监控内存水位完整故障复盘闭环故障现象 → 应急降载 → 抓取线程 / 堆 / GC 日志 → MAT 分析锁定大对象 / 阻塞线程 → JVM 参数调优 业务代码改造 → 灰度验证 → 全量上线 → 日常监控巡检各类内存故障分级应急解决方案按照故障严重等级划分P0 致命宕机 P1 业务严重受损 P2 性能卡顿 P3 轻微异常覆盖堆溢出、元空间溢出、堆外内存溢出、线程 OOM、内存泄漏五大常见场景包含现象识别→紧急处置→根因排查→长效修复全链路适配营销短信分布式业务场景。故障等级定义级别等级故障表现响应时效P0致命故障服务频繁崩溃重启、集群大面积不可用、大量消息丢失5 分钟内介入处置P1严重故障半数节点卡顿、大量请求超时、消费堆积、Full GC 频发10 分钟内介入P2性能故障接口延迟上涨、CPU 波动、内存缓慢爬升业务可勉强运行30 分钟内介入P3轻微隐患GC 小幅上涨、内存缓慢抬升暂无业务影响日常巡检优化P0 级致命内存故障宕机 / OOM 崩溃Java heap space 堆内存溢出崩溃现象日志持续抛出java.lang.OutOfMemoryError: Java heap space服务自动重启重启后短暂恢复很快再次崩溃老年代内存瞬间打满。紧急应急步骤立刻扩容集群节点分流流量避免单点持续崩溃临时下调批量推送、批量拉取数据的单次条数关闭超大批量营销任务重启故障实例重启前执行快照抓取堆 dump、线程栈、GC 日志留存临时调高堆内存Xms/Xmx争取排查时间。根因常见一次性加载数十万手机号全量数据、MQ 消息无限堆积、全局集合未清理、大缓存无淘汰策略。根治方案数据分页查询MQ 设置堆积阈值限流本地缓存配置最大容量 过期时间统一使用 G1 收集器。unable to create new native thread 线程 OOM现象所有接口阻塞无法新建线程日志抛出线程创建失败并发冲高后瞬间瘫痪。应急紧急限流下压并发重启服务释放全部线程资源临时缩小 - Xss 线程栈大小提升线程容纳上限。根治线程池强制配置核心线程、最大线程、队列长度第三方接口统一添加超时时间杜绝线程永久阻塞。P1 级严重内存故障业务大面积卡顿频繁 Full GCSTW 时间过长现象GC 日志频繁 Full GC接口延迟飙升、间歇性超时老年代只涨不降CPU 忽高忽低。应急降低下发并发暂停定时批量营销任务临时上调新生代占比减少短命对象升入老年代根因大量短期对象过早晋升老年代内存泄漏缓慢侵占老年代CMS 内存碎片过多。根治切换 G1 可控停顿收集器优化代码减少循环创建临时对象排查集合未释放内存泄漏点。Metaspace 元空间溢出现象运行数小时1 天后突然宕机重启短暂恢复日志OutOfMemoryError: Metaspace应急临时调高 MaxMetaspaceSize缩减动态模板加载、频繁切面调用频次根因大量 CGLIB 动态代理、反射、短信模板反复加载生成新类。根治固定上限元空间参数缓存模板类避免重复动态生成类。P2 级性能损耗故障内存缓慢上涨体验变差隐匿内存泄漏现象内存每日平缓上涨无直接 OOM 报错运行几天内存逐步打满最终走向 P1/P0 故障。应急定时每日凌晨低峰重启节点释放累积内存缩小缓存容量。排查定期抓取堆 dumpMAT 分析支配树定位长期存活的无用对象根治移除静态集合存放业务数据缓存设置淘汰策略关闭未关闭的流、连接资源。Direct buffer memory 堆外内存溢出前兆现象Netty、RabbitMQ 通信内存缓慢攀升无报错但内存占用持续走高。应急临时配置堆外内存上限调低 MQ 单次批量收发大小根治配置-XX:MaxDirectMemorySize框架规范释放堆外缓冲区。P3 级内存隐患无业务影响提前预防表现Minor GC 频次偏高、新生代占用过高Survivor 区对象周转异常内存水位缓慢小幅上升。处置微调 G1 预期停顿时间、新生代最大占比优化循环内字符串拼接、临时对象创建逻辑完善监控堆内存、元空间、线程数、GC 耗时告警配置目的提前拦截避免隐患演变为卡顿、宕机事故。通用标准化处置流程所有内存故障统一遵循止损优先限流、降并发、扩容、临时重启优先保障业务可用留存现场重启前抓取 hprof 堆快照、jstack 线程日志、完整 GC 日志离线分析MAT 解析堆内存、线程栈排查阻塞、GC 日志分析回收效率参数调优堆、元空间、线程栈、堆外内存、G1 收集器参数适配业务代码整改解决分页、线程池、资源关闭、缓存、大对象等底层问题监控告警配置内存水位、Full GC 次数、线程数告警提前预警灰度验证小流量试运行后全量发布。营销业务专属内存防护基线参数-Xms4g -Xmx4g -Xss256k -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m -XX:MaxDirectMemorySize512m -XX:UseG1GC -XX:MaxGCPauseMillis200 # OOM自动导出快照 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/dump/ -Xloggc:/data/gc/gc-%t.log线上标准化长期 JVM 优化规范适配分布式营销短信平台后端服务适用于 JDK8 G1 收集器统一基线参数、日常巡检、上线规范、故障处理、版本迭代标准实现全集群 JVM 配置统一、内存稳定、GC 平稳、OOM 风险前置规避。统一基础启动参数基线全集群强制标配完整启动参数模板-Xms4g -Xmx4g -Xss256k -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m -XX:MaxDirectMemorySize512m # G1垃圾收集器配置 -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:G1NewSizePercent20 -XX:G1MaxNewSizePercent60 # GC日志持久化 -XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintGCApplicationStoppedTime -Xloggc:/data/logs/jvm/gc-%t.log # OOM自动堆转储 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/jvm_dump/参数规范说明堆内存初始堆与最大堆相等杜绝运行期扩容停顿8G 服务器分配 4G 堆为标准配比线程栈高并发场景固定 256k提升线程承载上限规避线程创建 OOM元空间设置上下限杜绝动态类无限加载耗尽本地内存堆外内存约束 Netty、RabbitMQ 堆外缓冲区上限G1预期停顿 200ms新生代动态伸缩适配流量起伏日志与 dump永久开启故障自动留存现场无需人工临时抓取。代码开发强制约束从源头杜绝内存隐患集合与大数据加载规范批量推送手机号、用户数据必须分页查询禁止一次性加载全量数据存入 List、Map静态集合严禁存储业务流转数据仅允许存放常量配置循环体内禁止频繁创建大对象、字符串拼接改用 StringBuilder。线程池统一标准所有业务线程池消息消费、短信下发、异步任务必须指定核心线程数、最大线程数、阻塞队列、拒绝策略调用运营商第三方接口、HTTP 请求统一设置超时时间避免线程永久阻塞禁止手动 new Thread 无限制创建线程。缓存使用规范本地缓存统一使用 Caffeine配置最大容量 过期淘汰策略海量活动数据、用户标签存入 Redis不落地 JVM 堆内存缓存热点数据定期清理过期无效缓存。资源释放规范IO 流、网络连接、MQ 消费者、数据库连接使用完毕必须关闭使用 try-with-resources 自动回收资源。上线发布验收规范新服务 / 版本上线前必须完成 3 项校验才可灰度放量参数对齐校验核对 JVM 启动参数与集群基线保持一致不得私自修改堆大小、收集器类型压测验证模拟高峰期推送流量压测 30 分钟观测指标Full GC 次数 0单次 GC 停顿稳定低于 200ms老年代内存无持续上涨线程总数平稳无飙升监控告警绑定堆内存、元空间、线程数、GC 指标全部接入监控平台并配置告警阈值。日常周期性巡检规范运维 后端联合执行每日巡检查看 GC 日志确认无频繁 Full GC、无超长 STW内存水位堆内存上涨速率平缓无逐日持续抬升线程状态无大量 BLOCKED、WAITING 阻塞线程。每周巡检抽取节点堆快照MAT 简单扫描排查潜在内存泄漏对象核对元空间占用排查类加载数量异常增长汇总 GC 耗时、接口延迟数据微调 G1 停顿参数。每月复盘汇总本月内存卡顿、GC 抖动、OOM 隐患案例优化代码与参数基线。分级故障处置规范长期落地执行沿用四级故障体系固化处置流程P0 致命宕机OOM 崩溃5 分钟内扩容分流 抓取 dump 现场 临时调高堆内存事后 MAT 分析根治P1 严重卡顿频繁 Full GC10 分钟内限流降并发、下调批量任务体量排查对象异常晋升P2 性能衰减内存缓慢爬升凌晨低峰定时重启节点缓释内存定位内存泄漏代码P3 隐患预警微调新生代占比、优化循环对象创建提前消除风险。场景差异化微调规则基线为通用标准特定场景可小幅调整禁止大幅改动离线批量统计任务切换 Parallel 收集器放大堆内存不限制停顿时间极致低延迟短信通道MaxGCPauseMillis 调整为 150ms超大堆16G 以上节点逐步过渡至 ZGC 低延迟收集器。长期优化目标线上全年无突发 OOM 宕机事故Full GC 常态化为 0GC 停顿稳定可控接口延迟波动极小内存泄漏隐患提前通过巡检拦截无需事后紧急抢修。
返回列表