目录
3.主流的jvm:HotSpot【了解一个就行了】和JRockit
4.HotSpot也叫Sun JVM,了解两种gc方式:CMS和G1
5.young gc【Minor GC】 和full gc【Major GC】
7.传统的堆结构:新/老生代、幸存者区From/To【简称A/B】
11.Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC【只在G1出现】区别。
1.堆
2.栈
3.主流的jvm:HotSpot【了解一个就行了】和JRockit
4.HotSpot也叫Sun JVM,了解两种gc方式:CMS和G1
5.young gc【Minor GC】 和full gc【Major GC】
新生代内存不够了,触发young gc
老年代的满了或内存不够【比如1.cms gc转移大对象或者幸存者到老年代因内存不够导致转移失败 。2.gc自身线程也会占一定内存,内存不够】,就会触发full gc
6.jvm逃逸分析
看对象是否可能被外部所用,是则可能逃逸,否则不会逃逸,交给栈省堆内存
【基于逃逸分析的优化】栈分配、同步消除、分离对象或标量替换
7.传统的堆结构:新/老生代、幸存者区From/To【简称A/B】
8.cms gc
优点低stw,缺点 老年代内存碎片化,gc标记时内存不够引起full gc
工作原理
第一个月,若干个对象【0级】在新手村出生了,山村老妖cms gc每隔一段时间会来要祭品【jvm逃逸分析后干掉无效对象】,新手村的幸存者跑到幸存区A【躲过一次gc的屠杀=等级+1】,老妖屠了新手村。
第二个月【每隔一段时间】,老妖gc又来了新手村要祭品,新的幸存者【等级+1】跑到了幸存区B。老妖屠了新手村,来到了A区要祭品,A区的幸存者跑到B区躲避【等级+1】,老妖屠了A区。此时新手村和A区都是空的。
第三个月【每隔一段时间】,老妖gc又来了新手村要祭品,新的幸存者【等级+1】跑到了幸存区A。老妖屠了新手村,来到了B区要祭品,B区的幸存者跑到A区躲避【等级+1】,老妖屠了B区。此时新手村和B区都是空的。
........................
第x个月【每隔一段时间】,老妖gc干着一样的事情。但不同的是,出现了4种对象进入老年代的情况。
都可以通过jvm参数设置生效,第四点jdk1.8默认配置开启
①新手村出生了一个又高又壮的对象【大对象就是需要大量连续内存空间的对象(比如:字符串、数组)】,直接跑到了老年代。
②在幸存区里,gc看到有些对象的等级已经达到了某个阙值【默认为15级,CMS收集器默认6级,不同的垃圾收集器会略微有点不同】,让它们去老年代了
③在幸存区里,jvm制定了规则【从1级到n级的所有对象的大小超过了该幸村区的50%,n级及以上的对象去老年代】
④老年代区的自保机制:老年区的剩余内存,
如果比所有的年轻代【新手村+幸存区+垃圾对象】大,触发年轻gc【young gc/minor gc】,反之,再判断历次minor gc后,进入老年代的对象的平均大小 如果比该内存小,触发年轻gc【young gc/minor gc】,反之,触发fullgc。
以上第二判断触发年轻gc【young gc/minor gc】后,如果老年代的内存不够存放即将进入老年代的对象,就会触发 full gc,触发full gc 后也没足够空间放 年轻gc后活下来的对象,就会发生OOM异常
9.G1
对于所有区域,分成多个小模块,所有模块都可以是新/老生代、幸存者区,优点不会产生内存碎片化 jdk9以后自动配置
10.强引用 软引用 弱引用 虚引用
如何回收强引用 -------比如new了之后就是强引用,主动gc失败,设置对象为null,再主动gc成功
如何回收软引用 ——内存不足时会回收
最好不要主动gc,让jvm自动管理内存
11.Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC【只在G1出现】区别。
个人学习总结,便于将来复习。