docker得到的mem_usage的大小是从外部获得的java进程的内存大小,不单单是 -Xmx设置的大小,若是 -Xmx和docker分配的内存一致的话,因为java应用其余的地方还要占用很多的内存,致使尚未到达 -Xmx的时候就没有能够用的内存了,因此被docker容器给干掉了,从而出现了oom的状况。java
那么java程序启动的时候须要哪些方面的内存呢?docker
如何大致估算java进程使用的内存呢?并发
Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]
猜想在设置jvm启动参数的时候 -Xmx的这个值通常要小于docker限制内存数,通过生产环境实验 -Xmx:docker的比例为 2/3 - 3/4,jvm
通常生产环境都是用的sunjdk,因此建议xmx与xms设置同样大spa
xmn设置年轻代大小。若是只是一些业务较简单的基础服务建议xmn设置为xmx的一半。code
当堆内存很大时若是仍是使用并发收集器,会形成gc收集比较长,这时能够将并行收集改为G1回收器进程
因为ParallelGCThreads的值默认是等于cpu核数,可是有的生产环境获取的是容器宿主机器的cpu核数,这就致使cpu核数太多,效率变差,gc时间会延长。内存