相关疑难解决方法(0)

Java使用比堆大小更多的内存(或正确的Docker内存限制大小)

对于我的应用程序,Java进程使用的内存远远超过堆大小.

容器正在运行的系统开始出现内存问题,因为容器占用的内存比堆大小多得多.

堆大小设置为128 MB(-Xmx128m -Xms128m),而容器最多占用1 GB内存.在正常情况下,它需要500MB.如果docker容器具有以下限制(例如mem_limit=mem_limit=400MB),则该进程被OS的内存不足杀死所杀死.

你能解释为什么Java进程使用比堆更多的内存吗?如何正确调整Docker内存限制?有没有办法减少Java进程的堆外内存占用?


我使用JVM中的本机内存跟踪命令收集有关该问题的一些详细信息.

从主机系统,我获得容器使用的内存.

$ docker stats --no-stream 9afcb62a26c8
CONTAINER ID        NAME                                                                                        CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9afcb62a26c8        xx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.0acbb46bb6fe3ae1b1c99aff3a6073bb7b7ecf85   0.93%               461MiB / 9.744GiB   4.62%               286MB / 7.92MB      157MB / 2.66GB      57
Run Code Online (Sandbox Code Playgroud)

从容器内部,我获得进程使用的内存.

$ ps -p 71 -o pcpu,rss,size,vsize
%CPU   RSS  SIZE    VSZ
11.2 486040 580860 3814600
Run Code Online (Sandbox Code Playgroud)
$ jcmd 71 VM.native_memory
71:

Native Memory Tracking:

Total: reserved=1631932KB, committed=367400KB
-                 Java Heap (reserved=131072KB, …
Run Code Online (Sandbox Code Playgroud)

java linux memory jvm docker

95
推荐指数
3
解决办法
1万
查看次数

解释jemaloc数据可能在堆外泄漏

我在2周前开始搜索不断增长的java内存.我使用以下命令来防止堆增长过多,并进行一些调试.

我正在使用oracle java 8在Ubuntu 16.04上运行,因为openjdk 8没有调试符号我需要让jemaloc提供正确的数据

-XX:NativeMemoryTracking=detail -XX:+UseG1GC -XX:+UseStringDeduplication -Xms64m -Xmx256m -XX:MaxMetaspaceSize=128m -Xss256k
Run Code Online (Sandbox Code Playgroud)

如你所见,我的Xmx设置为256米.但是top目前我的流程显示为1.1G

在使用JProfiler和JVisualVm I以及我在google上可以找到的许多其他东西后,我得出的结论是,这必然是一个堆外问题.

经过多次搜索,我遇到了jemaloc,我读到的关于它的文章似乎很有希望.但是现在解释这些数据我遇到了一些问题.并找出如何指出我的问题的根源.

最高内存使用率

jemaloc图

本机内存跟踪数据

Native Memory Tracking:

Total: reserved=1678MB, committed=498MB
-                 Java Heap (reserved=256MB, committed=256MB)
                            (mmap: reserved=256MB, committed=256MB)

-                     Class (reserved=1103MB, committed=89MB)
                            (classes #14604)
                            (malloc=3MB #32346)
                            (mmap: reserved=1100MB, committed=85MB)

-                    Thread (reserved=26MB, committed=26MB)
                            (thread #53)
                            (stack: reserved=26MB, committed=26MB)

-                      Code (reserved=261MB, committed=96MB)
                            (malloc=17MB #17740)
                            (mmap: reserved=244MB, committed=79MB)

-                        GC (reserved=1MB, committed=1MB)
                            (mmap: reserved=1MB, committed=1MB)

-                  Internal (reserved=6MB, committed=6MB)
                            (malloc=6MB #48332) …
Run Code Online (Sandbox Code Playgroud)

java jvm

2
推荐指数
1
解决办法
581
查看次数

标签 统计

java ×2

jvm ×2

docker ×1

linux ×1

memory ×1