分代垃圾网络器将Heap分别为新生代(Young Generation)与年老代 (Old Generation),在JDK1.8 之前另有永世代(Permanent Generation)的概念。新生代又被进一步分别为Eden、From Space 、To Space,此中 From Space 与 To Space 巨细相称又称作Survivor Spaces。
Heap被分别为新生代与年老代是基于弱分代假设的,在java应用步伐与其他应用步伐中都可以观测到弱分代假设的征象。
下一次Young GC 中仍被引用的对象(存活对象)会被复制到之前是空的Survivor空间(To survivor space ,现实是之前的S1 survivor space),Eden 空间未被引用的对象将被直接删除。 之前的S0 suvivor space如今称为Form survivor space,此中依靠被引用的对象,被复现到了之前是空的Survivor空间(To survivor space ),Form survivor space 未被引用的对象将被直接删除。仍被引用的对象从Form survivor space复制到To survivor space后,其对象年龄将加1,表明该对象又履历了一次Young GC。
再下一次Young GC 中,会重复上面相同的过程。 但这时Survivor space 脚色将举行互换,即From survivor space 酿成 To survivor space,To survivor space 酿成 From survivor space。这个互换的目标现实就是为了将已利用的Survivor space中仍存活的对象复制到被清空的Survivor space中。
对象分配与提升时何时会触发GC的详细流程图可以参考下图(参考了《码出高效:Java开发手册》第四章走进JVM中的图):
上图中没有描画出 Thread Local Allocation Buffer (TLAB)与 Promotion Local Allocation Buffer (PLAB)的细节。别的上图中的Full GC大概让各人引起歧义,由于和Major GC太轻易肴杂了。现实JVM规范与垃圾收回相关的文献并没有给Full GC 与 Major GC作界说。一样寻常Full GC认为是对新生代与老年代都举行垃圾接纳,而Major GC则是专门针对年老代垃圾举行接纳。那标题来了由Young GC 引发了老年代的垃圾接纳,是叫Full GC好呢,还是Major GC好呢?个人认为大概Full GC更符合,这个各人可以不消过多纠结这个。实现纠结可以看看这两篇文章Minor GC vs Major GC vs Full GC 与 Major GC和Full GC的区别是什么?触发条件呢?。
上面只简单的描述了分代垃圾网络器垃圾网络的过程,现实垃圾网络器不但负责了内存的接纳工作,同样负责了对象的分配工作。更多的入门内容可以参考Memory Management in the Java HotSpot™ Virtual Machine 、Plumbr Handbook Java Garbage Collection。假如想再进一步相识垃圾接纳相关的东西,还可以看看 《垃圾接纳算法手册 自动内存管理的艺术》。 2.2 串行垃圾网络器
串行垃圾网络器(Serial GC)在举行垃圾接纳时只有单个GC线程在举行垃圾接纳。通常实现串行垃圾接纳器更加简单,串行垃圾接纳器内部不消维护复杂的数据结构,内存开销也更加小。但由于在STW(Stop The World)时只有单个GC线程在举行垃圾接纳工作,垃圾接纳的时间通常都会比力长,并且与应用步伐占用的内存呈线性增长。该垃圾接纳器比力得当Client端与嵌入设备等占用内存较小的场景。
上图灰色箭头为应用线程,而玄色箭头为GC线程,应用线程在工作时通常都是多线程,而到过安全点后应用线程克制工作也叫SWT(Stop The World),串行垃圾接纳器将开始一个GC线程完成垃圾接纳工作。根据接纳分代的差异串行垃圾接纳器通常又分为Serial New 与 Serial Old,他们分别负责接纳新生代(Young Generation)与年老代(Old Generation)。Serial New接纳复制算法完成垃圾整理工作,Serial Old接纳压缩算法完成垃圾整理工作。 2.3 并行垃圾网络器