转自:http://wenku.baidu.com/view/bc914287ec3a87c24028c49b.html
垃圾收集的算法分析
java语言规范没有明确地说明jvm使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
大多数垃圾回收算法使用了根集(rootset)这个概念(有了这个概念应该就能解决面试中被问到的互为引用的孤独岛的情况);所谓根集就是正在执行的java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。下面介绍几个常用的算法。
1、引用计数法(referencecountingcollector)
引用计数法是唯一没有使用根集的垃圾回收得法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象被赋给任意变量时,引用计数器每次加1。当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。
基于引用计数器的垃圾收集器运行较快,不会长时间中断程序执行,适宜地必须实时运行的程序。但引用计数器增加了程序执行的开销,因为每次对象赋给新的变量,计数器加1,而每次现有对象出了作用域生,计数器减1。
2、tracing算法(tracingcollector)
tracing算法是为了解决引用计数法的问题而提出,它使用了根集的概念。基于tracing算法的垃圾收集器从根集开始扫描,识别出哪些对象可达,哪些对象不可达,并用某种方式标记可达对象,例如对每个可达对象设置一个或多个位。在扫描识别过程中,基于tracing算法的垃圾收集也称为标记和清除(mark-and-sweep)垃圾收集器.
3、compacting算法(compactingcollector)
为了解决堆碎片问题,基于tracing的垃圾回收吸收了compacting算法的思想,在清除的过程中,算法将所有的对象移到堆的一端,堆的另一端就变成了一个相邻的空闲内存区,收集器会对它移动的所有对象的所有引用进行更新,使得这些引用在新的位置能识别原来的对象。在基于compacting算法的收集器的实现中,一般增加句柄和句柄表。
4、coping算法(copingcollector)
该算法的提出是为了克服句柄的开销和解决堆碎片的垃圾回收。它开始时把堆分成一个对象面和多个空闲面,程序从对象面为对象分配空间,当对象满了,基于coping算法的垃圾收集就从根集中扫描活动对象,并将每个活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。
一种典型的基于coping算法的垃圾回收是stop-and-copy算法,它将堆分成对象面和空闲区域面,在对象面与空闲区域面的切换过程中,程序暂停执行。
5、generation算法(generationalcollector)
stop-and-copy垃圾收集器的一个缺陷是收集器必须复制所有的活动对象,这增加了程序等待时间,这是coping算法低效的原因。在程序设计中有这样的规律:多数对象存在的时间比较短,少数的存在时间比较长。因此,generation算法将堆分成两个或多个,每个子堆作为对象的一代(generation)。由于多数对象存在的时间比较短,随着程序丢弃不使用的对象,垃圾收集器将从最年轻的子堆中收集这些对象。在分代式的垃圾收集器运行后,上次运行存活下来的对象移到下一最高代的子堆中,由于老一代的子堆不会经常被回收,因而节省了时间。
6、adaptive算法(adaptivecollector)
在特定的情况下,一些垃圾收集算法会优于其它算法。基于adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。
相关推荐
### 计算机视觉中的视差图生成:GC算法详解 #### 一、引言 在计算机视觉领域,双目视觉技术是实现三维重建的重要手段之一。通过对比两个摄像头(通常是一对平行放置的摄像头)拍摄到的同一场景的不同视角图像,...
在Java世界中,JVM(Java虚拟机)是运行所有Java应用程序的核心,它负责解析字节码、管理内存以及执行线程。...通过实践和研究GC算法及种类,开发者能更有效地管理内存,使Java应用程序运行更加高效。
### Azul的C4 GC算法概述 #### 一、引言 Azul Systems Inc. 开发了一种名为C4(Continuously Concurrent Compacting Collector)的垃圾收集器算法,该算法是一种更新版本的非停顿垃圾收集算法(Pauseless GC ...
java,GC,算法,可触及性,stop-the-world是一篇描述GC工作的文章
在JVM中,有多种不同的GC算法,每种都有其特定的应用场景和优缺点。 1. **串行GC(Serial GC)**:这是最基础的GC算法,适合于单CPU环境。它在一个线程中执行GC操作,因此在GC过程中会暂停应用执行(Stop-The-World...
本文将详细探讨GC算法、判断对象回收条件、垃圾收集器的工作原理及其调优步骤和常用参数。 首先,GC需要判断哪些对象可以被回收。在JVM中,主要有两种算法用来判断对象的生死:引用计数法和可达性分析算法。引用...
总结而言,深入理解JVM的类加载机制、内存结构、GC算法以及如何进行性能调优对于Java开发者来说是至关重要的。这不仅能够帮助开发者编写出性能更优的代码,还能有效地防止内存泄漏和性能瓶颈,从而提升整个应用的...
GC算法是C++等编程语言中实现内存管理的重要部分,尽管C++标准库并不直接提供垃圾收集机制,但许多现代C++库和框架如智能指针、内存池等都在一定程度上实现了类似的功能。在这个GC算法笔记中,我们将深入探讨GC的...
Java虚拟机详解04----GC算法和种类【重要】,有助于更深入理解记忆,文字配图片,10分钟让你记住gc工作机制。
GC算法是JVM中的一种核心机制,它对Java程序的执行效率和内存使用情况产生了深远的影响。 在JVM中,GC算法可以分为两大类:Minor GC和Major GC。Minor GC是对年轻代(Young Generation)的垃圾回收,而Major GC是对...
随后探讨了多种常用的垃圾收集算法(如标记-清除、复制、标记-压缩)的具体步骤、优劣及应用情景,深入浅出阐述了Java垃圾回收器的不同类型及其实现特点(例如:Serial、ParNew、Parallel Scavenge、CMS和G1),并且...
JVM体系结构与GC调优相关介绍,包含JVM体系结构、常用GC算法、内存管理、垃圾回收器、虚拟机调优、相关监控工具等
本文将深入探讨GC算法在C++中的实现,以及如何生成视差图。 首先,GC算法基于能量最小化理论,其目标是找到一个视差分配方案,使得整个系统的能量达到最小。能量函数通常由两部分组成:数据项和平滑项。数据项衡量...
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...
3. 经典的GC算法 a. 标记清除算法(Mark and Sweep) 标记清除算法分为两步:首先,从根节点(如寄存器、栈上的变量、全局变量)开始,遍历所有可达的节点并标记;然后,清除未被标记的所有节点。这种方法简单...
不同的GC算法有其优缺,选择合适的GC算法可以提高Java程序的性能和稳定性。 Java垃圾回收GC机制是Java虚拟机中的一种自动内存管理机制,它可以提高Java程序的开发效率和稳定性。GC机制的实现基于分代收集算法,可以...
总的来说,理解Java垃圾回收机制和各种GC算法是Java开发者必备的技能。这不仅有助于编写出更高效的代码,也有助于在遇到性能问题时能快速定位并解决。在团队合作中,对这些知识的掌握可以帮助团队成员更好地协作,...
其次,GCViewer支持多种GC算法的分析,包括串行GC、并行GC、CMS(Concurrent Mark Sweep)、G1(Garbage-First)以及ZGC(Z Garbage Collector)等。不同的GC算法有着不同的优化目标和工作模式,通过GCViewer,...