代码之家  ›  专栏  ›  技术社区  ›  Denis Voloshin

为什么我的Java进程在docker容器和主机中消耗两倍的内存

  •  4
  • Denis Voloshin  · 技术社区  · 6 年前

    我在分析运行在docker容器和主机上的Java应用程序的内存消耗时遇到了一个有趣的问题。

    1. Java应用程序是Jetty服务器9.4.9上的web应用程序
    2. 主持人:MAC
    3. docker守护程序是18.03.1-ce版本。

    在主机上,我使用Yourkit工具来分析内存消耗。

    docker stats <docker id/name>

    我得到的是,在MAC上yourkit显示了50M的非堆大小+总共40M的堆大小~

    enter image description here

    然而,当我在一个容器上部署和运行同一个war时,统计数据显示

    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
    879fb113ca8d        jetty-app           0.19%               214.6MiB / 1.952GiB   10.74%              1.49MB / 88.9kB     31.7MB / 6.42MB     29
    

    有人能解释一下这种现象吗?

    stats 提供错误的结果,我尝试使用 --memory 旗子帮不了什么忙,我要吐了。

    提前谢谢

    1 回复  |  直到 6 年前
        1
  •  3
  •   VonC    5 年前

    你可能想用一个 openJDK 8u212 或更多(2019年4月16日)。(没有Oracle JDK,因为 their license has changed

    请参见“ Docker support in Java 8 — finally! Grzegorz Kocur .

    不需要在docker入口点中使用任何黑客解决方法,也不需要再将Xmx设置为固定值。

    Docker支持也被后传到Java8。

    docker run -ti --cpus 1 -m 1G openjdk:8u212-jdk
    

    您可以使用新的标志(已经存在于Java10+中,但是现在又移植到Java8)来微调堆大小,并且 explained here .

    -XX:InitialRAMPercentage
    -XX:MaxRAMPercentage
    -XX:MinRAMPercentage
    

    如果出于某种原因,不需要新的JVM行为,可以使用- XX:-UseContainerSupport