k8s生产环境容器内部JVM参数配置解析及优化
优化目的:避免默认条件或者复杂情况导致频繁STW或者OOM1.堆总内存初始化大小分配和最大值分配-Xms512m -Xmx512m设置为FullGC之后的老年代内存占用的3-4倍-线下调试1.初始分配的堆内存由-Xms指定,默认是物理内存的1/642.最大堆内存由-Xmx指定,默认是物理内存的1/43.默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制4.空余堆内存大于70
试问:我们为什么要做jvm参数配置优化?
避免默认条件或者复杂情况导致频繁STW或者OOM!!!
1.堆总内存初始化大小分配和最大值分配
-Xms512m -Xmx512m 设置为FullGC之后的老年代内存占用的3-4倍-线下调试
1.初始分配的堆内存由-Xms指定,默认是物理内存的1/64
2.最大堆内存由-Xmx指定,默认是物理内存的1/4
3.默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
4.空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制
5.因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小
Tips:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误 ,
2. 非堆总内存初始化大小分配和最大值分配(1.8为metaspace)
-XX:PermSize128m -XX:MaxPermSize128m PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍-线下调试
PermGen space初始化大小默认是物理内存的1/64,最大为物理内存的1/4,PermGen用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space OOM错误
Tips:这个值不用设置的很大、浪费空间、够用就行
3.堆内存之年轻代年老代大小设置
-Xmn128m 年轻代Xmn的设置为老年代存活对象的1-1.5倍-线下调试 Sun官方建议年轻代的大小为整个堆的3/8左右
-XX:NewRatio 默认为2,年轻代(包括Eden和两个Survivor区)与年老代的比值,-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
young generation的heap大小,一般设置为Xmx的1/3或1/4,如果设置的比较小会频繁的进行minorGC、还有可能让不需要的对象进入永久代占用空间,如果设置的太大又会导致导致永久代空间变小发生FullGC
Tips:Xms=Xmx并且设置了Xmn的情况下,该参数不需要设置NewRatio
4.线程栈大小
-Xss512k 默认1024k java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
Tips: 一般说来,Stack Space为128K是够用的 、只要没有深度递归、一般不会爆出 StackOverflowError,可以不用设置此项
5.GC日志输出
参数 | 含义 |
---|---|
-XX:PrintGC | 打印GC日志 |
-XX:+PrintGCDetails | 打印详细的GC日志。还会在退出前打印堆的详细信息。 |
-XX:+PrintHeapAtGC | 每次GC前后打印堆信息。 |
-XX:+PrintGCTimeStamps | 打印GC发生的时间。 |
-XX:+PrintGCApplicationConcurrentTime | 打印应用程序的执行时间 |
-XX:+PrintGCApplicationStoppedTime | 打印应用由于GC而产生的停顿时间 |
-XX:+PrintReferenceGC | 跟踪软引用、弱引用、虚引用和Finallize队列。 |
-XLoggc:gc.log | 将GC日志以文件形式输出。 |
-XX:+PrintPromotionFailure | 多大的新生代对象晋升到老生代失败从而引发Full GC时的 |
Tips: 上测试环境可以搞一搞、生产记得关了
6.每个线程堆栈大小
-Xss512k 默认1024k java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
Tips: 一般说来, 不能无限生成,经验值在3000~5000左右 ,Stack Space为128K是够用的 、只要没有深度递归、一般不会爆出 StackOverflowError,可以不用设置此项
附:常用容器内存大小对应的jvm内存配置
容器启动常用配置
测试环境加GC打印、生产环境根据情况选择
预留50~100m的内存给容器内其他的应用,不然容易OOM被Killed掉
512M
-Xms450m -Xmx450m -Xmn128m -Xss512k -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XLoggc:appgc.log
1024M
-Xms950m -Xmx950m -Xmn256m -Xss512k -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XLoggc:appgc.log
2048M
-Xms1950m -Xmx1950m -Xmn512m -Xss512k -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XLoggc:appgc.log
更多推荐
所有评论(0)