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時間會延長。內存