docker容器中的java内存设置

ulydmbyx  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(598)

我有一个基于java8openjdk的java应用程序。它在一个限制为20gb的docker容器中运行。
tomcat的-xms和-xmx设置如下:
-xms=60%的容器内存(由cgroup指定)-so 12gb-xmx=80%的容器内存(由cgroup指定)-so 16gb
这使得容器上有4gb的空闲空间,这通常是可以的,但有时在负载不足的情况下,我会看到docker容器退出(java进程被杀死),并带有oom,因为容器内存使用量已经超过20gb。
我知道-xmx设置是针对堆的,而不是针对整个java进程和jvm的,因此我认为容器上的4gb“净空”已经足够了,但似乎还不够。
我知道所有的用例都有很大的不同,但我的问题是,一般来说,对于内存限制为20gb的容器来说,-xmx设置是否过高。
我在玩弄使用maxram设置的想法,我知道它只决定堆内存,但我不确定这是否会有任何积极的影响?
通常是使用maxram还是-xmx,或者两者都设置有什么好处?
如果我使用maxram而不是-xmx,java将如何为堆分配内存?是否有一个简单的算法,例如,50%的最大内存设置?java用这种方式管理内存会更有效吗?

k4emjkb1

k4emjkb11#

一般来说,对于内存限制为20gb的容器来说,-xmx设置是否过高
视情况而定。应用程序可以使用比指定内存更少的ram -Xmx ,以及比指定内存多2倍或3倍的内存 -Xmx . 我见过很多这两种类型的应用程序。
查看java进程中占用内存的内容。
与其根据给定的容器限制(这些限制可能完全不相关)来猜测适当的堆大小,不如设置 -Xmx 对于您的特定应用程序,哪一个足够舒适?我的意思是,如果您的应用程序只使用8gb堆就可以正常工作,那么即使容器允许,也不需要再提供更多的堆。
通常是使用maxram还是-xmx,或者两者都设置有什么好处?
设置两者都是没有意义的,因为 Xmx 覆盖 MaxRAM .
如果我使用maxram而不是-xmx,那么java如何将内存分配给堆呢?是否有一个简单的算法,例如,50%的最大内存设置?
看看xmx和maxramjvm参数之间有什么区别?
java用这种方式管理内存会更有效吗?
不。 MaxRAM 仅影响堆大小和默认垃圾收集器的计算(未显式指定时)。

相关问题