jdk1.8.191 JVM内存参数 InitialRAMPercentage和MinRAMPercentage
MaxRAMPercentage、InitialRAMPercentage、MinRAMPercentage。
这三个参数是JDK8U191为适配Docker容器新增的几个参数,类比Xmx、Xms,至于-XX:InitialRAMFraction、-XX:MaxRAMFraction、-XX:MinRAMFraction已经被标记为deprecated 。这几个参数的好处是什么呢?
Docker容器模式下,我们可以给每个JVM实例所属的POD分配任意大小的内存上限。比如,给每个账户服务分配4G,给每个支付服务分配8G。如此一来,启动脚本就不好写成通用的了,指定3G也不是,指定6G也不是。
但是,有了这三个新增参数,我们就可以在通用的启动脚本中指定75%(-XX:MaxRAMPercentage=75 -XX:InitialRAMPercentage=75 -XX:MinRAMPercentage=75)。
那么,账户服务就相当于设置了-Xmx3g -Xms3g。而支付服务相当于设置了-Xmx6g -Xms6g,是不是很赞。
jstat -gc 1 2s S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 170496.0 170496.0 0.0 0.0 171008.0 130368.9 1024000.0 590052.8 70016.0 68510.8 8064.0 7669.0 983 13.961 1400 275.606 289.567 170496.0 170496.0 0.0 0.0 171008.0 41717.2 1024000.0 758914.9 70016.0 68510.8 8064.0 7669.0 987 14.011 1401 275.722 289.733 170496.0 170496.0 0.0 0.0 171008.0 126547.2 1024000.0 770587.2 70016.0 68510.8 8064.0 7669.0 990 14.091 1403 275.986 290.077 170496.0 170496.0 0.0 0.0 171008.0 45488.7 1024000.0 650767.0 70016.0 68531.9 8064.0 7669.0 994 14.148 1405 276.222 290.371 170496.0 170496.0 0.0 0.0 171008.0 146029.1 1024000.0 714857.2 70016.0 68531.9 8064.0 7669.0 995 14.166 1406 276.366 290.531 170496.0 170496.0 0.0 0.0 171008.0 118073.5 1024000.0 669163.2 70016.0 68531.9 8064.0 7669.0 998 14.226 1408 276.736 290.962 170496.0 170496.0 0.0 0.0 171008.0 3636.1 1024000.0 687630.0 70016.0 68535.6 8064.0 7669.6 1001 14.342 1409 276.871 291.213 170496.0 170496.0 0.0 0.0 171008.0 87247.2 1024000.0 704977.5 70016.0 68535.6 8064.0 7669.6 1005 14.463 1411 277.099 291.562
jstat -gc 1 2s
YGC YGCT FGC FGCT GCT 983 13.961 1400 275.606 289.567 987 14.011 1401 275.722 289.733 990 14.091 1403 275.986 290.077 994 14.148 1405 276.222 290.371 995 14.166 1406 276.366 290.531 998 14.226 1408 276.736 290.962 1001 14.342 1409 276.871 291.213 1005 14.463 1411 277.099 291.562
-
S0/S1区容量为170496K(对应S0C/S1C两列);
-
Eden区容量为171008K(对应EC列);
-
Old区容量为1024000K(对应OC列);
-
Metaspace容量为70M;
根据各个区的容量大小,发现和JVM参数配置的4.5G内存出入非常大。整个堆的大小缩容了很多,从4.5G缩小到现在的大概1.5G(170496K*2+171008K+1024000K+70M ≈ 1.5G
参数-XX:+UseAdaptiveSizePolicy的锅。这个参数在PS前提下默认是开启的,其作用是自动调整堆的大小,以及对象从S区晋升到Old区的年龄阈值(threshold),调节threshold逻辑为:判断Young GC和Full GC消耗的时间差:
jar包:
JAVA_OPTS="-XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MinRAMPercentage=20.0 -XX:MaxRAMPercentage=80.0 -XX:-UseAdaptiveSizePolicy"
war包:
修改 catalina.sh JAVA_OPTS="$JAVA_OPTS -XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MinRAMPercentage=20.0 -XX:MaxRAMPercentage=80.0 -XX:-UseAdaptiveSizePolicy -Djava.security.egd=file:/dev/./u random"
如果在k8s使用,limit限制内存资源做成变量,那么pod java启动 只有limit的20%。
摘自:https://mp.weixin.qq.com/s?__biz=MzU5ODUwNzY1Nw==&mid=2247484533&idx=1&sn=6f6adbccadb3742934dc49901dac76af&chksm=fe426d93c935e4851021c49e5a9eb5a2a9d3c564623e7667e1ef3a8f35cb98717041d0bbccff&scene=0&xtrack=1#rd
http://www.data-master.net/2054292282