我在分析运行在docker容器和主机上的Java应用程序的内存消耗时遇到了一个有趣的问题。
在主机上,我使用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。
提前致谢
您可能希望使用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会导致启动缓慢。在的情况下,我仍然看到了上面描述的错误,所以这不是我的问题