jdk1.8.191 JVM内存参数 InitialRAMPercentage和MinRAMPercentage

MaxRAMPercentageInitialRAMPercentageMinRAMPercentage

这三个参数是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
  1. S0/S1区容量为170496K(对应S0C/S1C两列);

  2. Eden区容量为171008K(对应EC列);

  3. Old区容量为1024000K(对应OC列);

  4. 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

原文地址:https://www.cnblogs.com/fengjian2016/p/13639411.html