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
-
Minor GC:新生代GC
-
Major GC/Full GC:老年代GC.
出现Major GC 通常(非绝对的,在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC的策略选择过程)会发生至少一次的Minor GC(速度是是Major的10倍以上)。
- Full GC:清理整个堆空间——包括新生代(Eden、Survivor)、老年代(Old Gen)。
MinorGC 效率是Major GC的10倍以上,经过多次的Minor GC后触发Major GC(不绝对,有反例),此时即Full GC。
反例是在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC的策略选择过程.
网友评论