GC常用算法及常见分代:Minor GC、Major GC和Full GC

GC常用算法及常见分代:Minor GC、Major GC和Full GC

[TOC]

GC的概念在20世纪60年代的Lisp语言中就已经提出,直到现在新兴的语言大都携带GC能力,但是GC的基本算法和原理基本没有大的改变。

在内存区域的划分上,大体按照堆heap、栈stack来划分;heap用于存放程序创建的对象,stack用来执行程序,比如方法栈,局部变量等。

栈中的栈帧随着方法入栈出栈进行有序的申请释放,heap堆所有线程共享,是GC的主要作用区域。因此heap又被称为GC Heap.

一、GC的几种回收算法(堆对象回收)

1. 引用计数

简单高效,但是无法解决循环引用造成的内存泄露。php就是使用这个回收算法

2. Mark 追踪(Trace)回收

建立对象引用图,遍历并标记,遍历结束后没有标记的就是垃圾。jvm使用了这个。

3. 压缩回收算法

类似于存储介质的碎片整理,将活动的对象移动到堆的一端。

4. Copy 复制回收算法

把堆分为大小相同的两个区域,一个区域用完了,中断程序,把活动对象移动到另一边。缺点浪费内存,需要中断程序。

5. 分代回收 Generational Collection

分代收集基于这样的一个假设: 大多数对象都很快会死掉。
根据这个特点对回收进行优化,将内存中的对象分为多个子堆,每个自堆称为一代,算法运行时优先收集"年幼"的对象;
如果一个对象经过多次收集仍然存活,则把该对象移动到高一级的堆中,减少对其的扫描次数。

二、GC stop the world

垃圾回收进行时需要将应用程序完全暂停。

三、Minor GC、Major GC和Full GC

  1. Minor GC:新生代GC

  2. Major GC/Full GC:老年代GC.

出现Major GC 通常(非绝对的,在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC的策略选择过程)会发生至少一次的Minor GC(速度是是Major的10倍以上)。

  1. Full GC:清理整个堆空间——包括新生代(Eden、Survivor)、老年代(Old Gen)。

MinorGC 效率是Major GC的10倍以上,经过多次的Minor GC后触发Major GC(不绝对,有反例),此时即Full GC。

反例是在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC的策略选择过程.

你可能感兴趣的:(GC常用算法及常见分代:Minor GC、Major GC和Full GC)