在运行启用了本机内存跟踪的Java应用程序(在YARN中)时(-XX:NativeMemoryTracking=detail请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html和https:// docs. oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html),我可以看到JVM在不同类别中使用了多少内存.
我在jdk 1.8.0_45上的应用程序显示:
Native Memory Tracking:
Total: reserved=4023326KB, committed=2762382KB
- Java Heap (reserved=1331200KB, committed=1331200KB)
(mmap: reserved=1331200KB, committed=1331200KB)
- Class (reserved=1108143KB, committed=64559KB)
(classes #8621)
(malloc=6319KB #17371)
(mmap: reserved=1101824KB, committed=58240KB)
- Thread (reserved=1190668KB, committed=1190668KB)
(thread #1154)
(stack: reserved=1185284KB, committed=1185284KB)
(malloc=3809KB #5771)
(arena=1575KB #2306)
- Code (reserved=255744KB, committed=38384KB)
(malloc=6144KB #8858)
(mmap: reserved=249600KB, committed=32240KB)
- GC (reserved=54995KB, committed=54995KB)
(malloc=5775KB #217)
(mmap: reserved=49220KB, committed=49220KB)
- Compiler (reserved=267KB, committed=267KB)
(malloc=137KB #333)
(arena=131KB #3)
- Internal (reserved=65106KB, committed=65106KB)
(malloc=65074KB … 我有一个带有 SpringBoot 版本 2.1.1.RELEASE 的 Java 应用程序(oracle JDK 8u191),我遇到了奇怪的内存使用情况(不认为这与 spring 相关)。
应用程序提供的 HEAP 和 NONHEAP 值的总和远低于 Docker 报告的实际内存使用情况。
我知道 Java 具有除 HEAP 和 NONHEAP 之外的其他内存区域,但我不知道如何衡量它们以及当前行为是否正常。
目前,我的应用程序报告以下内容(在生产中运行 3 天后):
Init Used Committed Max
HEAP: 250M 79M 250M 800M
NONHEAP: 2M 192M 201M 0M
Run Code Online (Sandbox Code Playgroud)
/metricsspringBoot的执行器端点报告相同的内存使用情况。
但是 docker stats 命令报告了这一点(容器内部smem报告了与 java 进程相同的值):
MEM USAGE / LIMIT
750.2MiB / 1.172GiB
Run Code Online (Sandbox Code Playgroud)
堆+非堆和当前使用的内存的区别是299,2mb。
在我们第一次将这项服务投入生产时,我没想到会有 300mb,这导致了很多 OOM,直到我们找到了正确的配置。
即使在 GC 之后,这种“未注册的内存使用量”似乎只会增加而不会减少。
如果我重新启动应用程序,堆+非堆与实际使用之间的差异约为 100mb。
我的 Dockerfile 以这种方式启动应用程序:
ENTRYPOINT ["java", "-Xms250m", "-Xmx800m", "-XX:+UseG1GC", "-Djava.security.egd=file:/dev/./urandom", "-jar", …
我在我的网络服务器上运行码头。我当前的 jvm 设置:-Xmx4g -Xms2g,但是码头使用了更多的内存,我不知道这些额外的内存去哪里了。
Jetty 总共使用 4.547g 内存:
heap usage 显示 2.5g 时的堆内存使用情况:
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 483196928 (460.8125MB)
used = 277626712 (264.76546478271484MB)
free = 205570216 (196.04703521728516MB)
57.45622455612963% used
Eden Space:
capacity = 429522944 (409.625MB)
used = 251267840 (239.627685546875MB)
free = 178255104 (169.997314453125MB)
58.4992824038755% used
From Space:
capacity = 53673984 (51.1875MB)
used = 26358872 (25.137779235839844MB)
free = 27315112 (26.049720764160156MB)
49.109214624351345% used
To Space:
capacity = 53673984 (51.1875MB)
used = 0 (0.0MB)
free = …Run Code Online (Sandbox Code Playgroud) jvm ×2
memory ×2
docker ×1
hadoop-yarn ×1
heap-memory ×1
java ×1
linux ×1
memory-leaks ×1
spring-boot ×1