docker生产环境jvm性能优化

一、xmx与xms设置多大合适

docker得到的mem_usage的大小是从外部获得的java进程的内存大小,不单单是 -Xmx设置的大小,若是 -Xmx和docker分配的内存一致的话,因为java应用其余的地方还要占用很多的内存,致使尚未到达 -Xmx的时候就没有能够用的内存了,因此被docker容器给干掉了,从而出现了oom的状况。java

那么java程序启动的时候须要哪些方面的内存呢?docker

  • java程序的堆内存,最大就是 -Xmx设置的这个值
  • Garbage collection在垃圾回收的时候使用的内存
  • JIT optimization使用的内存
  • java程序的Off-heap所使用的内存
  • java程序的Metaspace所使用的内存
  • JNI Code所占用的内存
  • jvm启动的时候所占用的内存。

如何大致估算java进程使用的内存呢?并发

Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

猜想在设置jvm启动参数的时候 -Xmx的这个值通常要小于docker限制内存数,通过生产环境实验 -Xmx:docker的比例为 2/3 - 3/4,jvm

通常生产环境都是用的sunjdk,因此建议xmx与xms设置同样大spa

  1. 避免JVM在运行过程当中向OS申请内存
  2. 延后启动后首次GC的发生时机
  3. 减小启动初期的GC次数
  4. 避免动态调整jvm堆大小

二、xmn或者maxnewSize设置

xmn设置年轻代大小。若是只是一些业务较简单的基础服务建议xmn设置为xmx的一半。code

三、当xmx设置大于4G时,设置垃圾回收器 -XX:+UseG1GC

当堆内存很大时若是仍是使用并发收集器,会形成gc收集比较长,这时能够将并行收集改为G1回收器进程

四、容器中最好增长-XX:ParallelGCThreads设置,该值能够设置为cpu核数

因为ParallelGCThreads的值默认是等于cpu核数,可是有的生产环境获取的是容器宿主机器的cpu核数,这就致使cpu核数太多,效率变差,gc时间会延长。内存

相关文章
相关标签/搜索