Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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
JavaXMX和Docker容器RAM大小之间还有多少净空?_Java_Docker_Containers_Java Heap - Fatal编程技术网

JavaXMX和Docker容器RAM大小之间还有多少净空?

JavaXMX和Docker容器RAM大小之间还有多少净空?,java,docker,containers,java-heap,Java,Docker,Containers,Java Heap,我100%了解JVM的缺陷,以及JVM世界中为了解容器的人体工程学/资源而取得的进步/进步。另外,是的,我知道Java在默认情况下会尝试分配其运行环境中可用RAM的1/4 所以我有一些想法和问题。我制定了一个50/50的规则。如果我的应用程序需要1GB的Xmx,那么我会创建2GB的容器,为JVM开销和任何容器/交换内容提供1GB的RAM(尽管不确定交换在容器中是如何工作的) 所以我在想,如果我的应用程序需要6GB的Xmx,我真的需要创建12GB的容器,还是可以使用7GB或8GB的容器?当涉及到R

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

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


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

如果容器专用于JVM,则不需要使用百分比

您需要知道您需要多少java堆(在本例中为6GB),以及其他所有东西需要多少,您已经证明这些东西小于2GB

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

另外,我建议将Java堆大小的最小值和最大值设置为相同的值——在本例中为6GB。这样,您就可以保证,当Java试图增加堆时,不会出现任何意外情况。

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

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

然后,您使用的java版本很重要(例如,
-Xmx
-Xms
在不同的java版本下对于容器可能意味着不同的东西)


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

您正在使用哪些框架/库?他们正在使用直接缓冲区。有什么东西像J2V8一样使用JNI吗?您使用的是什么JVM版本?我用它来计算所需的内存,然后添加诸如netty之类的内容。谢谢,我会检查它的。最新的jdk8。不做任何超级花哨的事。卡夫卡消费者,地图中有点缓存。2GB是一个过度简化的假设!但我认为它应该足够堆外的任何东西,比如JVM堆栈等等。。。不做任何花哨的事。当然,但这是你有经验的假设,对吗?所以现在它至少在一些用例中得到了验证。关键是堆外的内存需求不会因为堆需要增长而增长。如果您需要更多的线程,或者需要更多的直接缓冲区,等等,它们就会增长。这与堆大小的正确性不成正比。我认为只有当你开始进入内存映射文件等。。。您需要至少两倍的缓存等。。。我只是对容器方面更感好奇,因为它可以更小,因为里面没有其他进程在运行。至少从Docker的角度来看。
其他东西需要多少
是最复杂的部分,这取决于应用程序,它可能意味着您的GC性能,尽管听起来很不寻常<将code>-Xms和
-Xmx
设置为相同的值是一个很好的建议,但如果您不这样做,总体来说这并不是什么大问题,这将触发页面错误并扩展内存,不以
DOWS
结尾的操作系统在这方面做得相当好。另一个你可能会给出的建议是总是预先触摸内存。但我想知道是否有一些容器应用程序的具体指南可以遵循。我有具体的例子,但我主要采用JVM与容器的1:2比率。因此,如果-Xmx1024,那么我将2048分配给容器。@user432024我个人不知道这样的指南。我们使用heap+30%,到目前为止,我们表现良好(3年来平均每个集群有128个pod)。