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的策略选择过程.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,056评论 2 31
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,800评论 3 83
  • http://www.cnblogs.com/angeldevil/p/3801189.html值得一看 Clas...
    snail_knight阅读 1,488评论 1 0
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,733评论 0 7
  • 一 、java虚拟机底层结构详解 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、...
    葡萄喃喃呓语阅读 1,542评论 0 4