Java Docker统计100%内存

Java Docker统计100%内存,java,memory,docker,jvm,Java,Memory,Docker,Jvm,我有一个容器,它运行的java应用程序具有以下jvm参数: -XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m 我正在使用docker内存限制选项: docker run -it -m 2304m foo bash 在容器初始化之后立即运行docker stats myApp,将为我提供: CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O myApp 0.17%

我有一个容器,它运行的java应用程序具有以下jvm参数:

-XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m
我正在使用docker内存限制选项:

docker run -it -m 2304m foo bash
在容器初始化之后立即运行
docker stats myApp
,将为我提供:

CONTAINER   CPU %    MEM USAGE/LIMIT     MEM %   NET I/O
myApp       0.17%  660.5 MB/2.416 GB    27.34%   240.8 kB/133.4 kB
但几个小时后,我得到了以下数据:

CONTAINER   CPU %    MEM USAGE/LIMIT     MEM %   NET I/O
myApp     202.18%  2.416 GB/2.416 GB   100.00%   27.67 GB/19.49 GB
尽管如此,如果我查看容器中正在运行的应用程序的流程执行详细信息,我使用了
~735MB
,myApp继续计算请求,没有任何问题:

me@docker-container ~]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
me+          1  0.0  0.0  11636  1324 ?        Ss   13:44   0:00 /bin/bash /home/bar/service/start-myApp.sh
me+          6  113  4.5 5014152 735736 ?      Sl   13:44 438:46 java -XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m -jar myApp-service-1.0-final.jar
me+        481  0.0  0.0  11768  1820 ?        Ss   20:09   0:00 bash
me+        497  0.0  0.0  35888  1464 ?        R+   20:10   0:00 ps aux
值得一提的是,我使用jconsole来监视进程
6
,一切看起来都很好

如果docker容器的内容不需要内存,为什么docker容器会使用所有可用内存? 我希望docker会比myApp使用更多的内存。。。不是100%的可用内存

让我们从以下内容开始:

 -XX:+UseG1GC -Xms512m -Xmx2048m -XX:MaxPermSize=256m
也就是说,使用一个从0.5Gb开始并可以增长到2GB的堆,以及一个0.25GB的permgen堆。这不包括JVM的其他非堆使用;e、 g.内存映射文件、线程堆栈、缓存的JAR文件等

然后你说docker报告容器使用了2.416GB。这并不奇怪。2.42-2.25是0.17GB,这对于非堆内存使用来说并不过分

最后,735736 RSS值告诉您常驻集的大小;i、 e.该进程正在使用的物理RAM的当前数量。JVM参数和docker
stats
命令是虚拟内存大小的度量


如果docker容器的内容不需要内存,为什么docker容器会使用所有可用内存?我希望docker会比myApp使用更多的内存。。。不是100%的可用内存

我认为您误读了
ps aux
输出。RSS只是正在使用的物理内存。事实上,进程的总内存使用量是由VSZ。。。也就是5GB。既然>看起来很大,那么它为什么那么大还不清楚。但从表面上看,这意味着Docker低估了容器的真实内存/虚拟内存使用情况

另一件事是Docker容器不会将容器中的应用程序与容器外其他事物的资源需求隔离开来。JVM将与容器内外的其他应用程序争夺物理RAM

有关更多信息:

  • 解释Docker资源管理如何工作,以及它可以做什么和不能做什么


使用Java 1.8时,您必须将
-XX:MaxPermSize
替换为
-XX:MaxMetaspaceSize=128m
.True。。。但是与这个问题和我的回答相切的是,自从我试图用它来解决问题时,我就发现了它,但是JVM抱怨说它被弃用了。。。