Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Docker确定Java微服务的堆/非堆大小?_Java_Docker_Microservices_Amazon Ecs - Fatal编程技术网

如何使用Docker确定Java微服务的堆/非堆大小?

如何使用Docker确定Java微服务的堆/非堆大小?,java,docker,microservices,amazon-ecs,Java,Docker,Microservices,Amazon Ecs,我们正在AWS ECS中运行Java微服务。因此,对于Docker,我们使用-Xmx指定一些硬Java堆限制。确定我们可以为堆保留多少内存以及非堆内存(元空间、堆栈、JIT缓存等)需要多少内存是一个非常棘手的部分。目前,我们正在进行压力测试,以确定何时有Docker OOMKiller。 例如,对于2GB AWS任务(docker),我们可以为堆设置的最大值为-Xmx1400m(使用-Xmx1450m,我们没有足够的内存用于非堆内容(退出代码137)) 实际上,Java10+有“-XX:MaxR

我们正在AWS ECS中运行Java微服务。因此,对于Docker,我们使用-Xmx指定一些硬Java堆限制。确定我们可以为堆保留多少内存以及非堆内存(元空间、堆栈、JIT缓存等)需要多少内存是一个非常棘手的部分。目前,我们正在进行压力测试,以确定何时有Docker OOMKiller。 例如,对于2GB AWS任务(docker),我们可以为堆设置的最大值为-Xmx1400m(使用-Xmx1450m,我们没有足够的内存用于非堆内容(退出代码137)) 实际上,Java10+有“-XX:MaxRAMPercentage”,但我们仍然需要知道这个百分比


如何确定Java微服务的堆/非堆大小?或者压力测试是唯一的解决方案?

运行基准测试可能是正确的方法,但是在实践中,为您拥有的每一个微服务运行基准测试可能会非常昂贵。一方面,在没有基准测试的情况下,无法猜测微服务在负载下的行为,例如,由于GC,内存的减少会增加请求处理时间。然而,另一方面,与开发人员的时间相比,RAM相对便宜,为分布式系统编写基准测试显然很难

我不相信纸上没有计算这个的公式。答案取决于每个微服务的实现和使用。它必须是一个恒定的测试和监控周期,如果发现问题,则应调整内存设置以解决问题

一般来说,投资于监控应该比编写一套基准测试产生更好的回报。

从Java8U131开始。因此,如果您运行以下操作:

docker运行\
-m 2g \#设置容器内存限制
openjdk:8\
爪哇\
-XX:+解除锁定Experimentalvmoptions\
-XX:+UseCGroupMemoryLimitForHeap\
com.example.Classname
JVM将设置堆限制,使其符合2GB容器内存限制,并为您运行
-Xmx
。原则上,这应该安排一些事情,这样您就不会达到容器内存限制,而是首先得到一个Java
OutOfMemoryError

在这个主题上还有几个例子,并且还建议
-XX:MaxRamFraction=1
允许使用“所有内存”,您已经通过
docker run-m
选项限制了这一点

实际上,您可能会在类似Dockerfile的文件中设置
$JAVA\u OPTS

来自openjdk的
:8
复制app.jar/
ENV JAVA_OPTS=-XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap-XX:MaxRamFraction=1
CMD[“java”、“-jar”、“/app.jar”]
然后像这样运行它

docker run-d-p-m 2g myimage
在Kubernetes环境中,pod资源约束中声明的内存限制起着相同的作用


正如@KarolDowbecki在他们的回答中所建议的那样,您确实需要进行一些分析和监视,以便为这个问题选择一个正确的数字。在本地运行应用程序并在
ps
top
中监视
RSS
(常驻集大小)统计信息应该会给您提供一个合理的基线。

您好,大卫,您是对的,对于Java 8.131+,我们可以防止Docker Killer,但我们仍然有Java OOM。我们必须知道非堆内存需要多少内存