专栏名称: 阿里云开发者
阿里巴巴官方技术号,关于阿里的技术创新均将呈现于此
今天看啥  ›  专栏  ›  阿里云开发者

8G的容器Java堆才4G怎么就OOM了?

阿里云开发者  · 公众号  · 科技公司  · 2025-01-22 08:30
    

主要观点总结

本文主要描述了一个Java应用OOM问题的排查过程,涉及到Java堆外内存的监控、分析和定位。应用中存在多个ClassLoader加载了netty的PooledByteBufAllocator,导致实际使用的堆外内存超出限制。排查过程中使用了多种工具和技术手段,包括NativeMemoryTracking、jemalloc参数调整、perf监控等。最终通过静态变量分析确定了netty占用的内存大小,并指出了问题的根本原因。

关键观点总结

关键观点1: 问题描述

Java应用出现OOM问题,初步分析发现堆外内存使用异常,实际使用量超过预期。

关键观点2: 排查过程

使用NativeMemoryTracking监控内存分类占用信息,发现Other部分内存可疑增长;通过静态变量分析确定netty占用的内存大小。

关键观点3: 问题分析

中间件中多个不同的ClassLoader加载了多个netty的PooledByteBufAllocator,每个Allocator都有自己的内存配额,导致实际使用的堆外内存超出限制。

关键观点4: 解决方案

短期内通过调整Java堆大小以适应现状;长期内考虑优化rocketmq-client的内存占用,并与中间件同学沟通解决问题。


文章预览

阿里妹导读 本文记录最近一例Java应用OOM问题的排查过程,希望可以给遇到类似问题的同学提供参考。 前言:此文记录最近一例Java应用OOM问题的排查过程,希望可以给遇到类似问题的同学提供参考。在本地集团,大多数情况下Java堆的大小会设置为容器规格的50%~70%,但如果你设置为50%时还是遇到了OS OOM的问题,会不会无法忍受进而想要知道这是为什么?没错,我也有一样的好奇。 背景 某核心应用的负责同学反馈应用存在少量机器OOM被OS kill的问题。看sunfire监控信息,的确如此。     初步收集到的信息: 容器内存=8G,Java 11,G1 GC=4G,MaxDirectMemorySize=1G。详见下图:   业务同学已经做过Java dump,可以看到堆外对象几乎没有,堆内的使用量也不大, < 3G。上机器查看Java进程的内存使用量的确很大:   通过目前掌握到的信息来看,4G(Java ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览