-
-
我们初次给服务器的内存参数设置如下
-
‐Xms3072M ‐Xmx3072M ‐Xss1M -XX:MetaspaceSize=512M ‐XX:MaxMetaspaceSize=512M
# ‐Xms3072M 表示堆初始化内存为3G
# -Xmx3072M 表示堆最大内存为3G
# -Xss1M 表示每个线程内存为1M
# -XX:MetaspaceSize=512M 表示元空间初始化内存为512M
# -XX:MaxMetaspaceSize=512M 表示元空间最大内存为512M
#因为堆的新生代:老年代比例大约是1:2, 即新生代为1G、老年代为2G。 在新生代中Eden区、S0区、S1区比例大约是8:1:1,即Eden区为800M,S0区为100M,S1区为100M。
-
-
由上图可知,生成对象首先会在Eden区,如果每秒产生60M对象,那么14秒后Eden区就会被占满,此时会触发Minor GC,第14秒产生的对象因为可能还会被引用所以没有被回收,根据垃圾回收机制存活的对象会被放到S0区,但是根据动态对象年龄判断原则,这60M对象同龄而且总和大于S0区的50%,那么这些对象都会被挪到老年代。14秒就会产生一个60M对象到老年代且1秒后就会变成垃圾,大概8分钟老年代的内存就会被沾满,就会触发Full GC。因为Full GC是重量级回收,如果每8分钟就要执行一次Full GC会导致系统性能很低。所以合理设置内存参数可以达到几乎不产生Full GC的效果。
-
我们再次给服务器的内存参数设置如下
-
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
# ‐Xms3072M 表示堆初始化内存为3G
# -Xmx3072M 表示堆最大内存为3G
# -Xmn2048M 表示新生代大小为2G
# -Xss1M 表示每个线程内存为1M
# -XX:MetaspaceSize=512M 表示元空间初始化内存为512M
# -XX:MaxMetaspaceSize=512M 表示元空间最大内存为512M
#此时设置新生代为2G,所以老年代为1G。 在新生代中Eden区、S0区、S1区比例大约是8:1:1,即Eden区大约为1638M,S0区为205M,S1区为205M。
-
在重新设置了服务器内存参数后,我们再次分析:如果每秒产生60M对象,则需要大约27秒Eden区会被占满,此时触发Minor GC,第14秒产生的对象因为可能还会被引用所以没有被回收,根据垃圾回收机制存活的对象会被放到S0区,此时由于这60M对象同龄总和没有达到S0区的50%,不会直接进入老年代,因此在下一次Minor GC就会被回收。