6

我 100% 了解 JVM 的缺陷以及在 JVM 世界中为了解容器的人体工程学/资源而取得的进步/进步。另外,是的,我知道默认情况下 Java 会尝试在其运行的环境中分配 1/4 可用的 RAM ......

所以我有一些想法和问题。我制定了 50/50 规则。如果我的应用程序需要 1GB 的 Xmx,那么我创建 2GB 的容器,它为 JVM 开销和任何容器/交换的东西提供了另外 1GB 的 RAM(尽管不确定交换在容器中是如何真正工作的)。

所以我在想,如果我的应用程序需要 6GB 的 Xmx,我真的需要创建 12GB 的容器还是可以使用 7GB 或 8GB 的​​容器?当涉及到 RAM 时,我们需要在容器内提供多少空间?

4

2 回答 2

2

这是一个非常复杂的问题。只是Java进程的一部分;它也有很多原生资源,没有用-Xmsand跟踪-Xmx是一个关于这些可能是什么的非常好的总结。

然后,您使用垃圾收集器算法:它拥有的自由度(额外空间)越多 - 越好。这与所谓的GC 障碍有关。简单来说,当执行 GC 时 - 所有堆操作都将被“拦截”并分别跟踪。如果分配率很高,则跟踪这些更改所需的空间(在活动 GC 发生时)往往会增长。您拥有的空间越多 - GC 的性能就越好。

然后,您使用的是什么 Java 版本很重要(因为-Xmx并且-Xms可能在不同的 Java 版本下就容器而言意味着不同的东西),例如看看这里

所以这里没有简单的答案。如果你负担得起12GB内存 - 这样做。内存比调试上述任何问题便宜得多(通常)。

于 2020-04-09T02:34:21.690 回答
1

如果您的容器专用于 JVM,那么您不需要使用百分比。

您需要知道您需要多少 Java 堆——在本例中为 6GB——以及其他所有东西需要多少,看起来您已经证明它小于 2GB。

然后把它们加起来。在这种情况下,一个 8GB 的​​容器应该没问题。请注意,堆栈和堆内存是分开的,因此如果您需要同时运行大量线程,请不要忘记为每个线程添加 1MB 的堆栈空间(或使用 -Xss 设置的任何内容)

另外,我真的建议将最小和最大 Java 堆大小设置为相同的值——在这种情况下为 6GB。然后保证当 Java 尝试增加堆时不会有任何意外。

于 2020-02-22T18:16:56.617 回答