具体JAVA_OPTS参数详解:
-Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15
Xms表示jvm启动时的初始堆大小,Xmx为最大堆大小,Xmn为新生代的大小
PermSize为永久带的初始大小,MaxPermSize为永久代的最大空间
MaxTenuringThreshold为达到这个值,对象就会被移进老年代
jdk1.8生产参数配置参考:
JAVA_OPTS="-server -Xmx9g -Xms9g -Xmn3g -Xss500k -XX:+DisableExplicitGC -XX:MetaspaceSize=2048m -XX:MaxMetaspaceSize=2048m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Dfile.encoding=UTF8 -Duser.timezone=GMT+08
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/app/logs/crm-heapdump.hprof"
GC种类:
1、老年代中采用标记-清除算法的Full GC(或称为Major GC)
2、新生代中采用复制算法的Minor GC
新生代是GC收集垃圾的频繁区域,默认对象在survivor中每熬过15次(可配置)Minor GC时,就会被晋升到老年代中。
Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比进行一次Minor GC耗时更长。
在程序中,每次调用System.gc(),是先进行Minor GC,然后再进行Full GC
新生代--新创建的对象
老年代--经过多次Minor GC和Full GC回收,而没有被回收的对象或者大对象
永久代--jvm加载的类文件信息,常量,静态变量等。
触发Full gc条件:
1.调用System.gc
2.老年代空间不足
3.永久代空间不足
4. gc 担保失败
参考资料:触发Full gc条件_scugxl的专栏-CSDN博客_full gc
java进程崩溃时,记录dump日志:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/app/logs/crm-heapdump.hprof
总结一下jvm采用分代垃圾回收方式的原因:
1.Java程序在运行的时候,大多数对象在创建后很快就没有对象使用它了。
2.大多数一直在被使用的对象很少再去引用新创建的对象。