当前位置: 首页 > 知识库问答 >
问题:

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

甄文彬
2023-03-14

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

  1. Java应用程序是Jetty server 9.4.9上的web应用程序
  2. Java版本:1.8
  3. 主机:Mac
  4. Docker Images:Jetty:9.4-jre8
  5. docker守护进程是18.03.1-CE版本。

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

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标志限制容器上的内存,我得到了OOM。

提前致谢

共有1个答案

云瑞
2023-03-14

您可能希望使用OpenJDK8U212或更高版本再次尝试测量(2019年4月,16日)。(没有Oracle JDK,因为他们的许可证已经更改)

参见“Java8中的Docker支持--最后!”来自Grzegorz Kocur。
现在:

不需要在docker入口点中使用任何笨拙的变通方法,也不需要再将Xmx设置为固定值。

docker run -ti --cpus 1 -m 1G openjdk:8u212-jdk
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
 类似资料:
  • 问题内容: Docker容器中有多个进程正在运行,它们的PID在容器名称空间中是隔离的,是否有办法找出Docker主机上的PID是什么? 例如,有一个Apache Web服务器在Docker容器中运行(我使用Docker Hub中的 Apache + PHP映像),而Apache在启动时会在容器内创建更多工作进程。这些工作进程实际上正在处理传入的请求。要查看这些进程,我在docker容器中运行:

  • 我有一个很小的java控制台应用程序,我想在内存使用方面进行优化。它是在Xmx设置为仅64MB的情况下运行的。根据不同的监视工具(htop、ps、pmap、Dynatrace)显示进程的总体内存使用量超过250MB。我主要在Ubuntu18上运行它(也在其他操作系统上测试)。 我使用了-xx:nativeMemoryTracking,java param和jcmd的本地内存跟踪,以找出为什么在堆之

  • 问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下:

  • 我需要监控应用程序生成的线程所消耗的内存量。如果贪婪的线程占用了太多内存,那么我们可以采取纠正措施。我提到了我的java线程需要多少内存?。关于该链接的建议之一是在ThreadMXBean中使用getThreadAllocatedBytes 我用以下作业试验了getThreadAllocatedBytes。 我在四个线程上运行了相当长的时间。虽然作业不会连续累积内存,但getThreadAlloc

  • 与这两个问题相关的是: null Java Buildpack自动为和设置sane值。通过调优参数和配置预期线程的(最大)数量,我非常确定Java进程消耗的内存应该小于我分配给云铸造应用程序的上限。 但是,我仍然会遇到Cloud Foundry“内存不足”错误(不是Java OOM错误!): 我尝试了设置。将该值设置为1或2会导致启动缓慢。在的情况下,我仍然看到了上面描述的错误,所以这不是我的问题