分代模型
背景
大部分对象的存活周期都是极短的
少数对象是长期存活的
年轻代
创建之后很快就会回收
大部分正常的对象都优先在新生代分配内存
长期存活的对象会躲过多次垃圾回收
如果一个实例对象在新生代中,成功的在15次垃圾回收之后,还是没有被回收掉,就说明他已经15岁了,就会被认为是会长期存活在内存里的对象
年轻代又分成了Eden和2个Survivor,默认比例是8:1:1
老年代
核心参数
-Xmx
Java堆内存的最大大小
一般-Xms与-Xmx通常设置完全一样的大小
-Xmn
Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了
-XX:PermSize
永久代大小
JDK1.8之后:-XX:MetaspaceSize
-XX:MaxPermSize
永久代最大大小
JDK1.8之后:-XX:MaxMetaspaceSize
-XX:+CMSParallelInitialMarkEnabled表示在初始标记的多线程执行,减少STW;
-XX:+CMSScavengeBeforeRemark:在重新标记之前执行minorGC减少重新标记时间;
-XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,降低STW;
-XX:CMSInitiatingOccupancyFraction=92和-XX:+UseCMSInitiatingOccupancyOnly配套使用,如果不设置后者,jvm第一次会采用92%但是后续jvm会根据运行时采集的数据来进行GC周期,如果设置后者则jvm每次都会在92%的时候进行gc;
-XX:+PrintHeapAtGC:在每次GC前都要GC堆的概况输出