垃圾回收的算法
垃圾收集算法
-
1)引用计数法
给对象添加引用计数器,当引用对象时计数器+1,引用失效时,计数器-1,当计数器等于0时,对象失效,内存可以被回收。
优点:实现简单高效。
缺点:对象之间的互相循环引用问题不好解决。 -
2)可达性算法(根搜索法)
通过GC roots可达的对象路径称为引用链(reference chain),当一个对象没有引用链时(即从GCroots不可达)则视为不可用对象,内存可以被回收。java使用该算法进行垃圾收集。可解决循环引用的问题
哪些对象可以视为GC roots ?
a. 虚拟机栈中(即栈帧中的本地变量)的引用对象;
b. 本地方法栈中的引用对象;
c. 方法区(永久代)中的静态变量引用的对象和常量池中引用的对象
清除算法
1.标记清除算法
2.复制算法
3.标记压缩算法
4.分类收集算法
5.增量收集算法
6.分区算法
-
1)标记-清除算法(mark-sweep)
分两步进行,第一步标记出可以回收的对象,第二步统一清理可以回收的对象内存。 缺点:首先标记和清除步骤效率都不高,其次会产生内存碎片。
-
2)复制算法
将内存分为(大小相等)两部分,每次只使用其中一块进行内存分配,当内存使用完后,就出发GC,将存活的对象直接复制到另一块空闲的内存中,然后对当前使用的内存块一次性清除所有,然后转到另一块内存进行使用。
优点:简单,高效。 缺点:浪费内存,因为每次都有另一块内存空闲着。 -
3)标记-整理算法
类似于标记-清除算法,但是第二步进行内存回收时,将存活的对象向内存一端移动,达到消除内存碎片问题。
-
4)分代收集算法
java sun
hotspot虚拟机将内存分为新生代(堆)、老年代(堆)、永久代(方法区、常量池、即时编译代码)几个区域,新生代主要使用基于复制算法的垃圾回收,老年代和永久代主要使用标记-整理算法进行垃圾回收。具体每个区域使用哪种垃圾回收算法还要视收集器的实现制约。