试问:我们为什么要做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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐