Java垃圾收集器的算法

引用计数算法:

Python使用的

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

缺点:很难解决对象之间的相互循环引用的问题。

互相引用着对方,导致它们的计数都不为0,于是引用计数算法无法通知GC收集器回收它们。

根搜索算法:

Java,C#,Lisp用的是这个。

通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话说就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。

垃圾收集算法:

1、标记-清除算法

首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

2、复制算法

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉

将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性拷贝到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间

3、标记-清理算法

让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存

4、分代收集算法

根据对象的存活周期的不同将内存划分为几块。根据各个年代的特点采用最适当的搜集算法。

新生代用复制算法,老年代用“标记-清理”或“标记-整理”算法。

参考书:周志明《深入理解Java 虚拟机》

时间: 2024-10-24 16:01:15

Java垃圾收集器的算法的相关文章

【转】Java垃圾收集器

原文链接 http://www.cnblogs.com/gw811/archive/2012/10/19/2730258.html#top Java垃圾收集器 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当Lisp还在胚胎时期时,人们就在思考: GC需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如

Java垃圾收集器(GC)简介与最佳组合探究

Java经过近20年的演变,已经发展出一套复杂.健壮和高性能的垃圾收集器.在不同的应用场合下使用不同的GC组合能让程序性能得到可观提高.我想这也是Java这么多年来一直处于不败之地的原因之一. 以下讨论只限于Server模式下的HotSpot JVM. GC的类型 Sun/Oracle的HotSpot JVM为我们提供了多种不同的GC,一种GC只专门负责新生代或老年代的内存回收工作,所以实际使用的时候需要我们为新生代和老年代指定不同的GC.但G1例外,因为G1可以通吃整个堆内存. Serial

二、Java如何分配和回收内存?Java垃圾收集器如何工作?

线程私有的内存区域随用户线程的结束而回收,内存分配编译期已确定,内存分配和回收具有确定性.共享线程随虚拟机的启动.结束而建立和销毁,在运行期进行动态分配.垃圾收集器主要对共享内存区域(堆和方法区)进行垃圾收集回收. Java如何实现内存动态分配和内存垃圾的回收? 1.哪些内存需要回收(垃圾收集器内存回收的对象)?已经"死亡"的对象,那如何判定对象已经"死亡"了? Java堆回收的内存:已经"死亡"的对象 方法区回收的内存:废弃的常量和无用的类 2

JAVA 垃圾收集器与内存分配策略

引言 垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.垃圾收集技术需要考虑的三个问题是: 哪些内存需要回收 什么时候回收 如何回收 http://my.oschina.net/jiangmitiao/blog/470426 中讲到java内存运行时区域的分布,其中程序计数器,虚拟机栈,本地方法区都是随着线程而生,随线程而灭,所以这几个区域就不需要过多考虑回收问题.但是堆和方法区就不一样了,只有在程序运行期间我们才知道会创建哪

Java垃圾收集器标准详解及用途

概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当Lisp还在胚胎时期时,人们就在思考: GC需要完成的三件事情:  哪些内存需要回收? 什么时候回收? 如何回收? 经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了"自动化"时代,那为什么我们还要去了解GC和内存分配呢?答

Java垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 虽然我们在对各种收集器进行比较,但是并非为了跳出一个最好的收集器.因为知道现在为止还没有最好的收集器出现,更加没有万能的收集器,所以我们选择的只是对具体应用最合适的收集器. 1.Serial收集器(串行收集器) 这个收集器是一个单线程的收集器,但是它的单线程的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的线程(Stop-The-World:将用户正常工

Java垃圾收集器与内存分配策略

程序的计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈中的栈侦随着方法的进入和退出而有条不紊地执行出栈和如栈操作. 判断对象是不是已经死亡的方法: 一.引用计数算法: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象是不可能再被使用的. 二.可达性分析算法: 基本思路就是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一

java垃圾回收算法和垃圾收集器

垃圾收集算法.垃圾回收算法.java垃圾收集器 目录1. 垃圾收集算法1)引用计数法2)根搜索法2. 垃圾回收算法1)复制算法2)标记-清除算法3)标记-整理算法4)分代收集算法3. java垃圾收集器新生代GC器:1)Serial垃圾收集器2)ParNew垃圾收集器3)Parallel Scavenge垃圾收集器老年代GC器1)Serial和Parallel Scavenge都有对应的老年代版本2)CMS垃圾收集器4.java对象的内存分配位置5.java TLAB 1. 垃圾收集算法 1)引

深入理解 Java G1 垃圾收集器--转

原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放