Mol*_*pad 4 java memory jvm docker
我有一个基于 Java8 OpenJDK 的 Java 应用程序。它运行在一个 docker 容器中,该容器的容量限制为 20GB。
tomcat的-Xms和-Xmx设置设置如下:
-Xms = 容器内存的 60%(由 cgroup 指定) - 因此 12GB -Xmx = 容器内存的 80%(由 cgroup 指定) - 因此 16GB
这会在容器上留下 4GB 的可用空间,这通常很好,但有时在负载下,我会看到 docker 容器因 OOM 而退出(并且 java 进程被终止),因为容器内存使用量已超过 20GB。
我知道 -Xmx 设置是针对堆的,而不是针对整个 Java 进程和 JVM,因此预计容器上的 4GB“净空”就足够了,但看起来还不够。
我知道所有用例都大不相同,但我的问题是,一般来说,对于内存限制为 20GB 的容器来说,设置 -Xmx 设置是否太高。
我正在考虑使用 MaxRAM 设置,同样,我知道它只决定堆内存,但我不确定这是否会产生积极的影响?
通常情况下,您使用 MaxRAM 或 -Xmx 之一,还是同时设置两者有什么好处?
如果我使用 MaxRAM 而不是 -Xmx,java 将如何向堆分配内存?是否有一个简单的算法,例如 MaxRAM 设置的 50%?java 这样做会更有效地管理内存吗?
一般来说,对于内存限制为 20GB 的容器来说,设置 -Xmx 设置是否太高
这取决于。应用程序可以使用比指定更少的 RAM -Xmx,也可以使用比指定多 2 倍或 3 倍的 RAM -Xmx。我见过很多这两种类型的应用程序。
与其尝试根据给定的容器限制(这些限制可能完全不相关)猜测适当的堆大小,为什么不设置-Xmx一个对于您的特定应用程序来说足够舒适的值?我的意思是,如果您的应用程序仅使用 8 GB 堆就可以正常工作,那么即使容器允许,也无需提供更多堆。
通常情况下,您使用 MaxRAM 或 -Xmx 之一,还是同时设置两者有什么好处?
设置两者都是没有意义的,因为Xmxoverrides MaxRAM。
我要使用MaxRAM而不是-Xmx,java将如何向堆分配内存?是否有一个简单的算法,例如 MaxRAM 设置的 50%?
java 这样做会更有效地管理内存吗?
编号MaxRAM仅影响堆大小和默认垃圾收集器的计算(未明确指定时)。
| 归档时间: |
|
| 查看次数: |
5630 次 |
| 最近记录: |