参数配置不当引起OOM

2023-10-21|2024-8-21
麦兜
麦兜
type
Post
status
Published
date
Oct 21, 2023
slug
summary
tags
JVM
category
问题排查
password
icon

问题

JVM参数-XX:CICompilerCount=3 -XX:InitialHeapSize=123731968 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=40894464 -XX:OldSize=82837504 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
 
线上有两个服务A和B,B服务使用 HTTP 传输数据给A服务,频率很频繁,服务A 在服务的参数配置不当的情况下出现了OOM。在服务日志表现为:o.a.c.h.Http11NioProtocol [DirectJDKLog.java:175] Failed to complete processing of a request
在出现OOM后把内存快照dump下来分析 btye[]Http11OutputBuffer 占用内存比较多(即使使用Jprofile 执行 GC 一遍后)
notion image
根据google出来的相关资料文档得知 Http11OutputBuffer 是提供给 HTTP header 缓冲区。github
本来想查询相关参数能不能调小一点,发现配置文件写着 server.max-http-header-size=10000000 也就是一个请求10M 和 Jprofile 给出的 btye[]的实例具体引用 大小一致。

总结

A服务的接口处理数据比较慢,请求数量上来了每个10M的 buffer 的内存没有这么快就能释放导致了OOM,实际在业务上 header buffer 不需要这么大内存。(可能是某个小伙伴当时配置时多按一个0了,导致出现这个问题。)
 
Redis 使用 epoll 封装 Reactor 模型记一次生产环境接口返回时长异常排查