JVM堆的各个区大小分配比例遵循一些基本原则:
1、Java整个堆大小设置,Xmx和 Xms设置为老年代存活对象的3-4倍(即FullGC之后的老年代内存占用的3-4倍)
2、年轻代Xmn的设置为老年代存活对象的1-1.5倍。
3、老年代的内存大小设置为老年代存活对象的2-3倍。
4、永久代 PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。
另:
1、Sun官方建议年轻代的大小为整个堆的3/8左右, 所以按照上述设置的方式,基本符合Sun的建议。
2、堆大小=年轻代大小+年老代大小, 即xmx=xmn+老年代大小。Permsize不影响堆大小。
3、为什么要按照上面的来进行设置呢?没有具体的说明,但应该是根据多种调优之后得出的一个结论。
根据上面的说明,列举一些JVM堆内存在k8s上的实际配置(以下参数配置适用于非计算密集型的大部分应用):
Docker实例内存为2G时:
-Xmx1344M -Xms1344M -Xmn448M -XX:MaxMetaspaceSize=192M -XX:MetaspaceSize=192M
Docker实例内存为3G时:
-Xmx2048M -Xms2048M -Xmn768M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M
Docker实例内存为4G时:
-Xmx2688M -Xms2688M -Xmn960M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M
Docker实例内存为5G时:
-Xmx3392M -Xms3392M -Xmn1216M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M
Docker实例内存为6G时:
-Xmx4096M -Xms4096M -Xmn1536M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M
Docker实例内存为7G时:
-Xmx4736M -Xms4736M -Xmn1728M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M
Docker实例内存为8G时:
-Xmx5440M -Xms5440M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M
其它的基础配置参数:
实例内存>=8G时
-server
-XX:+DisableExplicitGC-XX:+UseG1GC-XX:MaxGCPauseMillis=100
-XX:+ParallelRefProcEnabled
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:ErrorFile=/var/app/gc/hs_err_pid%p.log
-XX:HeapDumpPath=/var/app/gc
-Xloggc:/var/app/gc/gc%t.log
实例内存<8G时的基础配置
-server
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
-XX:+CMSClassUnloadingEnabled
-XX:+ParallelRefProcEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:ErrorFile=/var/app/gc/hs_err_pid%p.log
-XX:HeapDumpPath=/var/app/gc
-Xloggc:/var/app/gc/gc%t.log
http://dockone.io/article/2249