Java 最大堆内存 500M Kubernetes Pod 最大内存 700M 出现了 OOM
Kubernetes JVM Java About 4,740 words现象
Java
服务部署在Kubernetes
中,Pod
的内存大小设置为700M
,Java
堆内存设置的-Xmx
为500
M,线上频频发生OOMKiller
被Kubernetes
直接Kill
掉了。
服务参数
主要的参数如下:
Java 11
-XX:+UseG1GC
-Xms500M
-Xmx500M
-Xss256K
-XX:MaxMetaspaceSize=96M
-XX:MaxDirectMemorySize=64M
-XX:+UseStringDeduplication
Kubernetes Pod Memory Limit
:700Mi
初步分析
查看堆内存占用,未发现异常。
使用Prometheus
监控,未发现异常。
NMT 监测
开启了Native Memory Tracing
后再次检测。
bash-4.4$ jcmd 1 VM.native_memory
1:
Native Memory Tracking:
(Omitting categories weighting less than 1KB)
Total: reserved=1046250KB, committed=721206KB
malloc: 45058KB #421581
mmap: reserved=1001192KB, committed=676148KB
- Java Heap (reserved=512000KB, committed=512000KB)
(mmap: reserved=512000KB, committed=512000KB)
- Class (reserved=83253KB, committed=9141KB)
(classes #13817)
( instance classes #12903, array classes #914)
(malloc=1333KB #28086)
(mmap: reserved=81920KB, committed=7808KB)
( Metadata: )
( reserved=65536KB, committed=55936KB)
( used=55654KB)
( waste=282KB =0.50%)
( Class space:)
( reserved=81920KB, committed=7808KB)
( used=7503KB)
( waste=305KB =3.91%)
- Thread (reserved=29948KB, committed=3724KB)
(thread #51)
(stack: reserved=29816KB, committed=3592KB)
(malloc=75KB #304)
(arena=57KB #98)
- Code (reserved=249993KB, committed=35205KB)
(malloc=2305KB #11509)
(mmap: reserved=247688KB, committed=32900KB)
- GC (reserved=69547KB, committed=69547KB)
(malloc=17647KB #13618)
(mmap: reserved=51900KB, committed=51900KB)
- GCCardSet (reserved=124KB, committed=124KB)
(malloc=124KB #1531)
- Compiler (reserved=423KB, committed=423KB)
(malloc=259KB #1161)
(arena=165KB #5)
- Internal (reserved=551KB, committed=551KB)
(malloc=547KB #15609)
(mmap: reserved=4KB, committed=4KB)
- Other (reserved=112KB, committed=112KB)
(malloc=112KB #21)
- Symbol (reserved=13106KB, committed=13106KB)
(malloc=11819KB #327453)
(arena=1287KB #1)
- Native Memory Tracking (reserved=7022KB, committed=7022KB)
(malloc=435KB #6199)
(tracking overhead=6587KB)
- Shared class space (reserved=12288KB, committed=11968KB)
(mmap: reserved=12288KB, committed=11968KB)
- Arena Chunk (reserved=197KB, committed=197KB)
(malloc=197KB)
- Tracing (reserved=32KB, committed=32KB)
(arena=32KB #1)
- Module (reserved=86KB, committed=86KB)
(malloc=86KB #1381)
- Safepoint (reserved=8KB, committed=8KB)
(mmap: reserved=8KB, committed=8KB)
- Synchronization (reserved=131KB, committed=131KB)
(malloc=131KB #1416)
- Serviceability (reserved=18KB, committed=18KB)
(malloc=18KB #17)
- Metaspace (reserved=65798KB, committed=56198KB)
(malloc=262KB #120)
(mmap: reserved=65536KB, committed=55936KB)
- String Deduplication (reserved=1580KB, committed=1580KB)
(malloc=1580KB #12988)
- Unknown (reserved=32KB, committed=32KB)
(mmap: reserved=32KB, committed=32KB)
再次分析
以上数据为探测数据,NMT
能监测的内存总和为721206KB
。
使用MXBean
或ManagementAgent
可获取NIO
操作的Buffer Pool
堆外内存(这部分不在NMT
采集范围)。
分析NMT
发现,committed
的大部分内存由以下几个方面组成:
Heap
:512000KB
(500M
)Code
:35205KB
(34.3M
)GC
:69547KB
(67.9M
)Symbol
:13106KB
(12.7M
)Shared class space
:11968KB
(11.7M
)Metaspace
:56198KB
(54.9M
)
结论
- 对于
Web
应用,会有更多的线程开辟出来。 Metaspace
会占用较大内存。G1GC
会占用较大内存。Code
占用会随着C1
、C2
编译器的热点代码编译,会占用更多空间。NMT
无法监测堆外内存Directed
和Mapped
。
解决方法
Kubernetes
的内存限制:扩大内存。JVM
堆内存降低。- 使用
SerialGC
,降低GC
的内存占用。
Views: 821 · Posted: 2023-12-25
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...