Java基础系列-垃圾回收

Java,相较于C++等语言,具备自动垃圾回收机制。如何确定哪些对象是“垃圾”,以及如何回收“垃圾”?

第一,首先确认哪些是“垃圾对象”:检索原理有“引用计数法”和“根对象追踪法”。引用计数法即统计内存对象被其他对象引用的情况,如果不存在引用说明是垃圾对象,但是这种方法会遗漏“引用孤岛”对象,例如两个相互引用的A和B对象(均不再被其他对象引用);根对象追踪法即从根对象为起点,跟踪标记相应链路上对象,完成标记后,没做标记的均可视为垃圾对象。

第二,垃圾回收基本策略:从属性来看,主要包括标记复制、标记清除、标记压缩三种。标记复制即通过两个区域A和B,将A中可用对象复制到B区域(可用),清空A区域,A和B区域循环使用,特点是浪费内存,而且当复制对象过多时造成的STW过长,性能抖动;标记清除即直接清除区域内的垃圾对象,特点是快速、但空间碎片较多,造成内存浪费严重,性能较差;标记压缩即清除区域内垃圾对象,并将可用对象迁移到一起,形成较大的连续可用区域,但当可用对象较大时STW过程,性能抖动严重。

第三,结合JVM内存区域,确定运用回收策略:从时空来看,在垃圾回收时,应针对JVM内存区域特点分区和分代考虑。Java垃圾回收涉及到的区域包括新生代(eden,from/to),年老代(tenured),方法区(在JDK1.8以后,改为元数据区),以及直接内存区(特殊情况下也会进行垃圾回收)。新生代90%的对象是瞬间存在的,新生代生存下来的对象最终会进入老年代,老年代的对象一般能长久存活;方法区一般存储类元数据信息,直接内存一般在NIO运用等场景时会调用(直接内存适用于一次创建,多次使用的场景)。

第四,结合JVM,采用何种回收收集器:主要包括四种收集器,1、串行收集器,新生代使用标记复制算法,年老代使用标记压缩算法;2、并行收集器,新生代使用标记复制算法,年老代使用标记压缩算法,包括注重系统停顿时间和吞吐量两种指标的垃圾回收器;3、CMS垃圾回收器,主要注重系统停顿时间STW抖动问题的回收器;4、G1垃圾回收器,分区和分代垃圾回收。

后面将会通过两篇博文着重介绍目前在生产上运用比较多的CMS和G1两种垃圾回收器。

你可能感兴趣的:(Java基础系列-垃圾回收)