在 Java Xmx 和 Docker 容器 RAM 大小之间留出多少余量?
How much headroom to leave between Java Xmx and Docker container RAM size?
我 100% 知道 JVM 的陷阱和 advances/strides 在 JVM 世界中为了理解容器的 ergonomics/resources 而犯下的错误。另外,是的,我知道 Java 默认情况下会尝试分配环境中可用 RAM 的 1/4 它是 运行...
所以我有一些想法和问题。我制定了 50/50 规则。如果我的应用程序需要 1GB 的 Xmx,那么我创建 2GB 的容器,它为 JVM 开销和任何 container/swap 东西提供了另外 1GB 的 RAM(尽管不确定交换在容器中的真正工作方式)。
所以我在想,如果我的应用程序需要 6GB 的 Xmx,我是否真的需要创建 12GB 的容器,或者我是否可以使用 7GB 或 8GB 的容器?当涉及到 RAM 时,我们需要在容器内部留出多少净空?
如果您的容器专用于 JVM,则无需使用百分比。
您需要知道您需要多少 java 堆——在本例中为 6GB——以及其他一切需要多少,看起来您已经证明它少于 2GB。
然后把它们加起来。在这种情况下,一个 8GB 的容器应该没问题。但是请注意,堆栈和堆内存是分开的,因此如果您同时需要大量线程 运行,请不要忘记为每个线程添加 1MB 的堆栈 space(或您设置的任何内容)与 -Xss)
此外,我真的建议将最小和最大 Java 堆大小设置为相同的值——在本例中为 6GB。然后你可以保证 Java 尝试增大堆时不会出现意外。
这是一个非常复杂的问题。 堆只是Java进程的一部分;它也有很多本机资源,未使用 -Xms
和 -Xmx
进行跟踪。 是关于这些可能是什么的非常好的总结。
然后是您使用的垃圾收集器算法:它拥有的自由度(额外space)越大越好。这与所谓的 GC 障碍 有关。简而言之,当执行 GC 时 - 所有堆操作都将 "intercepted" 并单独跟踪。如果分配率很高,跟踪这些更改(当发生活动 GC 时)所需的 space 往往会增加。您拥有的 space 越多 - GC 的性能就越好。
然后,您使用的 java 版本很重要(因为 -Xmx
和 -Xms
在不同的 java 版本下对于容器可能意味着不同的东西),例如 .
所以这里没有简单的答案。如果您 可以 负担得起 12GB
内存 - 就这样做吧。与调试上述任何问题相比,内存(通常)要便宜得多。
我 100% 知道 JVM 的陷阱和 advances/strides 在 JVM 世界中为了理解容器的 ergonomics/resources 而犯下的错误。另外,是的,我知道 Java 默认情况下会尝试分配环境中可用 RAM 的 1/4 它是 运行...
所以我有一些想法和问题。我制定了 50/50 规则。如果我的应用程序需要 1GB 的 Xmx,那么我创建 2GB 的容器,它为 JVM 开销和任何 container/swap 东西提供了另外 1GB 的 RAM(尽管不确定交换在容器中的真正工作方式)。
所以我在想,如果我的应用程序需要 6GB 的 Xmx,我是否真的需要创建 12GB 的容器,或者我是否可以使用 7GB 或 8GB 的容器?当涉及到 RAM 时,我们需要在容器内部留出多少净空?
如果您的容器专用于 JVM,则无需使用百分比。
您需要知道您需要多少 java 堆——在本例中为 6GB——以及其他一切需要多少,看起来您已经证明它少于 2GB。
然后把它们加起来。在这种情况下,一个 8GB 的容器应该没问题。但是请注意,堆栈和堆内存是分开的,因此如果您同时需要大量线程 运行,请不要忘记为每个线程添加 1MB 的堆栈 space(或您设置的任何内容)与 -Xss)
此外,我真的建议将最小和最大 Java 堆大小设置为相同的值——在本例中为 6GB。然后你可以保证 Java 尝试增大堆时不会出现意外。
这是一个非常复杂的问题。 堆只是Java进程的一部分;它也有很多本机资源,未使用 -Xms
和 -Xmx
进行跟踪。
然后是您使用的垃圾收集器算法:它拥有的自由度(额外space)越大越好。这与所谓的 GC 障碍 有关。简而言之,当执行 GC 时 - 所有堆操作都将 "intercepted" 并单独跟踪。如果分配率很高,跟踪这些更改(当发生活动 GC 时)所需的 space 往往会增加。您拥有的 space 越多 - GC 的性能就越好。
然后,您使用的 java 版本很重要(因为 -Xmx
和 -Xms
在不同的 java 版本下对于容器可能意味着不同的东西),例如
所以这里没有简单的答案。如果您 可以 负担得起 12GB
内存 - 就这样做吧。与调试上述任何问题相比,内存(通常)要便宜得多。