GC垃圾收集算法

GC判断对象是否存活算法

1> 引用计数算法

2> 根搜索算法(GC Root)

GC垃圾收集算法

1> 标记清除算法(Mark-Sweep):分为标记和清除两个阶段,首先标记出可以回收的对象,标记完后统一回收。缺点如下:

a) 效率低:标记和清除过程效率都不高;

b) 空间问题:清除之后产生大量不连续的内存碎片。

2> 复制算法(Copying):将内存划分成大小相等的两块,每次只使用其中的一块,当需要清理时,就直接将存活的对象复制到另一块。这种方式实现简单效率高,也不会存在碎片问题,缺点:实际可用内存缩小为原来的一半。

3> 标记整理算法(Mark-Compact):与标记清除相似,不相点在于整理对将存活的对象向一端进行移动,不会产生碎片。

4> 分代收集算法(Generational Collection):根据存活周期的不同将内存划分为几块。

JVM虚拟机GC回收算法

1> 分代收集:分为年青代和老年代

2> 复制收集:年青代使用了2个幸存区来实现复制(默认比例:8:1:1,其中1用于交换,因此实际可用为90%)

3> 标记整理:老年代由于对象的存活率高,所以适合使用标记整理或标记清除来进行回收

JVM垃圾收集器

1> 年青代(Young Generation):Serial、PartNew、Parallel Scavenge -> G1

2> 老年代(Tenured Generation):CMS、Serial Old(MSC)、Parallel Old -> G1

Serial:Jdk1.3.1之前版本,特点是单线程收集,Stop the world

PartNew:Serial的多线程版,Stop the world

Parallel Scavenge:与PartNew相似,也是多线程收集,区别在于可以通过参数来控制吞吐量(即gc的停顿时间及gc时间比例)

Serial Old:单线程收集,使用标记整理算法

Parallel Old:Parallel Scavenge的老年代版本,使用多线程及标记整理算法

Concurrent Mark Sweep(CMS):以最短GC停顿时间为目标的收集器,可以通过参数来控制对碎片的压缩(是否开启压缩开关及压缩的频率设置)

G1(Garbage First):G1对新生代及老年代同时进行管理,划分成多固定大小的独立区域Region,采用标记整理算法,实现不牺牲吞吐量的前提下进行低停顿的回收

MinorGC及FullGC

1> 新生代GC(Minor GC):指发生在新生代的垃圾回收,一般是对生命周期较短的对象的回收(例如:方法内部声明对象),通过幸存区交换来处理所以回收速度快

a) 触发条件:当创建对象时Eden区空间不够时触发,当执行Minor GC时单个对象大于幸存区时,通过分配担保机制转移动老年代。

b) 推荐:由于Minor GC速度快,建议及时将不使用的对象置空,利于对象在新生代回收;

不建议创建生命周期短的大对象造成频繁的GC,可以通过参数设置阀值将大对象直接进老年代

(默认在幸存区交换15次会移至老年代;动态年龄判断:幸存区中同龄所有对象大于幸存区空间的一半,年龄大于等于该年龄的对象可以直接进入老年代)。

2> 老年代GC(Full GC/Major GC):指发生在老年代的垃圾回收,标记整理回收速度慢(比MinorGC慢10倍以上)并且会有暂停响应(stop the world)。

如果FullGC非常频繁(90%以上时)将会严重影响服务性能,此时就需要调整堆内存参数大小或将大对象转至堆外存。

示例:/usr/local/java/bin/jstat -gccause 16463 1000  # 查看gc变化情况(16463为进程ID,1000表示每1000毫秒更新一次结果)

GC回收永久代的条件

1> 该类所有的实例都已经被回收,即堆中不存在该类的任何实例;

2> 该类的ClassLoader已经被回收;

3> 该类的Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 23:42:55

GC垃圾收集算法的相关文章

GC原理---垃圾收集算法

垃圾收集算法 Mark-Sweep(标记-清除算法) 标记清除算法分为两个阶段,标记阶段和清除阶段.标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间. 优缺点:实现简单,容易产生内存碎片.因为会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc. 标记-压缩算法 首先也需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端.之后,清理边界外所有的空间.这种方法

【转载】GC基本算法及C++GC机制

原文: GC基本算法及C++GC机制 阅读目录 前言 基本概念 有向可达图与根集 三种基本的垃圾收集算法及其改进算法 1.引用计数算法 2. Mark & Sweep 算法 3. 节点复制算法 分代回收 C++垃圾回收机制 参考书籍 正文 回到顶部 前言 垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为垃圾.在程序员看来,垃圾就是不再被引用的对象.自动回收垃圾的过程则称为垃圾收集(garbage collection).在一个支持垃圾收集的语言中,程序显式地申请内

JVM垃圾回收2(垃圾收集算法)

根据<深入理解java虚拟机>这本书总结 一.关于几个概念:(标记垃圾算法.垃圾收集算法.垃圾收集器) 前面说了如何寻找jvm垃圾,有两种方法:引用计数法/可达性算法.这篇准备讲,标记完垃圾之后,回收的算法,这里的算法只是垃圾回收的思想.后面会讲到多种垃圾收集器,这里的垃圾收集器就是运用了垃圾手机算法的思想,可以说是具体实现. 这里还是想多余的说一下这三个概念: 垃圾标记算法:标记垃圾的方法 垃圾收集算法:一种回收思想,供垃圾收集器使用.可能用在年轻代,也可能用在老年代(当然现在来说老年代和年

对象是否有被引用判断及垃圾收集算法

1.引用计数算法 给对象中添加一个计数器,每当一个地方引用它时,计数器值就加1:当引用失效时就减1.如果两个对象存在相互的引用,尽管这两个引用已经不再被使用,但还是不能被清除.通过一些实验可得SUN公司的JVM没有采用这种算法. 2.根搜索算法 该算法的基本思路是通过一系列的名为"GCRoots" 的对象作为起点,从这些起点开始向下搜索.搜索所通过的路径(引用链:Reference chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的.在JAVA里可用

垃圾收集算法

[根搜索算法] 这个算法的基本思路是:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用. 可以作为根的对象 - 虚拟机栈(栈桢中的本地变量表)中的引用的对象. - 方法区中的类静态属性引用的对象. - 方法区中的常量引用的对象. - 本地方法栈中JNI的引用的对象. 方法区是jvm的一块内存区域,用来存放类相关的信息.很明显,java中单例模式创建的对象被自己类中的静态属性所引用,符合第二条,因此,单例对象不会被jvm垃圾收集. classSingleton {      

【Java 之 JVM】垃圾收集算法

一.判断对象是否存活--可达性分析算法 基本思想:通过一系列成为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots 没有任何引用相连则证明该对象是不可用的.在判断完无链之后,还需经历两次标记过程,才会真正回收,暂略. 二.垃圾收集算法 1.标记--清除算法 标记出所有需要回收的对象,标记完统一回收.缺点:标记,清除2个过程效率都不高,大量不连续的内存碎片. 2.复制算法 将内存划分为大

JVM(五)-垃圾收集算法和垃圾收集器

一.垃圾收集算法 (1)标记-清除算法 "标记-清除"(Mark-Sweep)算法,如它的名字一样,算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象.之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的. 它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高:另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,

垃圾收集算法思路

垃圾收集算法思路:把对象按照寿命长短分组,分为年轻代和年老代,新创建对象被分在年轻代,如果对象经过几次回收后仍然存活,那么再把这个对象分到年老代. 年老代的收集频度不像年轻代的频繁,这样就减少了每次垃圾收集时所扫描的对象数量,从而提高垃圾回收效率 Young : 分为eden区和两个Survivor区,新建对象都在eden区,当eden区满后触发minor GC ,将Eden区仍然存活的对象复制到其中一个survivor区,再把另一 个survivor区中的存活对象复制到这个survivor区,

深入理解_JVM内存管理垃圾收集算法04

1.垃圾收集算法(方法论): 定义:JVM通过GC来回收堆和方法区中的内存. GC的基本原理:首先会找程序中不再被使用的对象:然后回收这些对象所占用的内存. 算法分类: (1) 按照基本回收策略分: <1>引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最致命的是无法处理循环引用的问题. <2> 标记-清除(Mark-Sweep): Before G