java - Java G1 垃圾回收 | 驻留内存高于 NMT 保留内存
问题描述
java进程使用的常驻内存,使用G1GC,远高于XMX和NMT上报的内存。
java -version
openjdk version "11.0.6" 2020-01-14 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.6+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.6+10-LTS, mixed mode, sharing)
top output
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
787 root 20 0 99.9g 85.4g 22120 S 1053 66.8 11904:11 java
JVM Arguments
/usr/bin/java -Xms75g -Xmx75g -XX:NativeMemoryTracking=summary -XX:MaxGCPauseMillis=50
-XX:G1RSetSparseRegionEntries=4096 -XX:G1HeapRegionSize=32M
-Xlog:gc*=info,gc+phases=debug:file=/var/log/gc.log:time,uptimemillis,level,tags:filecount=5,filesize=50M -XX:+UseG1GC
Native Memory Tracking:
Total: reserved=81376MB, committed=80879MB
- Java Heap (reserved=76800MB, committed=76800MB)
(mmap: reserved=76800MB, committed=76800MB)
- Class (reserved=65MB, committed=65MB)
(classes #9993)
( instance classes #9216, array classes #777)
(malloc=1MB #29050)
(mmap: reserved=64MB, committed=63MB)
( Metadata: )
( reserved=64MB, committed=63MB)
( used=62MB)
( free=1MB)
( waste=0MB =0.00%)
- Thread (reserved=348MB, committed=35MB)
(thread #345)
(stack: reserved=346MB, committed=33MB)
(malloc=1MB #2072)
(arena=1MB #688)
- Code (reserved=244MB, committed=62MB)
(malloc=2MB #6831)
(mmap: reserved=242MB, committed=59MB)
- GC (reserved=3239MB, committed=3239MB)
(malloc=356MB #58172)
(mmap: reserved=2883MB, committed=2883MB)
- Compiler (reserved=2MB, committed=2MB)
(malloc=3MB #2963)
- Internal (reserved=16MB, committed=16MB)
(malloc=16MB #8415)
- Other (reserved=643MB, committed=643MB)
(malloc=643MB #296)
- Symbol (reserved=12MB, committed=12MB)
(malloc=10MB #122802)
(arena=3MB #1)
- Native Memory Tracking (reserved=4MB, committed=4MB)
(tracking overhead=4MB)
NMT 报告大约 80GB 的内存使用量,但是,java 进程的常驻内存超过 85GB。随着时间的推移,两者之间的差距不断扩大。对于另一个运行相同应用程序的 VM,常驻内存超过 95GB,而 NMT 内存再次只有 82GB。由于这种不断增长的内存占用,最终,该应用程序被操作系统 oom-killer 杀死。
什么可能导致两者之间的差异?如何减少它以使应用程序的内存占用更可预测?
解决方案
推荐阅读
- node.js - NodeJS HTTP 请求承诺并将结果存储在变量中
- android - setVisibilty 从消失可见未实时更新
- javascript - 带有 if 的球动画
- pandas - 在熊猫中划分选定的列
- javascript - 匹配多级深层 URL
- docker - prometheus+springboot 的 Docker 端口问题
- python - 从 HDF5 文件中序列化和检索大量 numpy 数组的快速有效的方法
- c# - 如果 Windows 版本低于 7 则退出
- mysql - 检索每个名称 mySQL 的前 n-4 个点的总和
- android - Flutter 调试带有不同消息的垃圾邮件控制台