简述:
垃圾回收算法有很多种,每种有各自的适用场合,各有千秋,如何在不同的场合搭配使用是我们要考虑的问题
引用计数
这是最简单最原始的算法。原理很简单,对象生成后,有一个相关联的计数器,当有一个地方引用时,计数器加1;当引用失效时,计数器减1。jvm定期扫描对象时,发现计数器为0的对象就可以清除。这个算法的特点是实现简单,速度快。不足之处在于:每次分配和指针操作都需要额外的操作来更新相关计数器。最大的问题是,循环引用的对象是永远没有办法被清除(avm就是这个算法,曾经是as3的码农深有体会)
根搜索算法
这里的根是一些特定的对象:虚拟机栈中引用的对象;方法区的类静态属性引用的对象;方法区中的常量引用的对象;本地方法栈中本地方法引用的对象。每次jvm扫描的时候,从这个根对象开始,有被引用的对象会被加入一条类似“引用链”。这里有点类似深度搜索算法。最后我们可以得出一张类似树形的引用链图。不在这个图的对象就可以清除了。这个算法的不足之处在于扫描时间可能比较长,尤其是引用关系比较复杂时
标记-清除(Mark-Sweep)
顾名思义,包括两个过程。在标记过程,就是采用上面描述的根搜索算法,如果被搜索到,可以在对象本身标记,或者额外记录那些数据被标记。清除的过程比较简单,jvm扫描所有对象,没有被标记的对象就被清除。可以用餐巾纸收集(来源见参考资料,下同)来描述。餐厅里,清洁工要清洁餐巾纸时,先暂停所有人,问每个人,用过那种餐巾纸,在该餐巾纸上做标记。然后清洁工就可以把那些没有被标记的餐巾纸回收了。这个算法有一些不足:效率不高;内存碎片问题。但是这个算法是最经典的垃圾回收算法,后来的很多算法都是在它的基础上改进的
复制算法
复制算法解决了标记-清除算法的效率问题。它的原理是,将内存区一分为二,每次只用其中一块,用完了,就将存活的对象直接拷贝到另外一块区域。这个过程只是移动堆顶指针,不产生内存碎片。很明显,最大的缺点是可以内存少了一半啊。再套用餐巾纸的例子:餐厅里面有两个大厅,大伙现在一个大厅吃饭,到了收垃圾时间了。清洁工让大伙带着正在用的餐巾到另外一个厅。接下来清洁工就可以安心清理无人使用的餐巾纸了。为了解决内存浪费的问题,HotSpot等采用了一个大区间Eden 和两个小区间Survivor From、To。每次回收时,将Eden和其中一个Survivor还存活的对象copy到另外一个Survivor,之后再清理剩下的不再引用的对象。Eden和Survivor的比率通常是8:1,所以只浪费了10%的空间
标记-整理(Mark-Compact)
这个算法是将标记-整理和复制算法的完美结合。同样分两个阶段,标记阶段跟标记-整理算法的标记过程一样。接下来是对复制算法的改进了。不用分成两个区了,而是将被标记的对象向一边移动,未被标记的对象向另外一端移动。最后再收集那些未被标记的对象。再用餐巾纸的例子来说明:第一步同样是对餐巾纸进行标记,接下来清洁工大妈命令所以的就餐者带上被标记的餐巾纸滚到一个角落,顺便把那些没有标记的餐巾纸扔到另外一个角落。大妈就轻松跑到那个角落,轻松搞定那些未被标记的餐巾纸。
增量收集
上面描述的算法都需要暂停程序的执行。增量收集是将传统的垃圾收集算法多进程(或线程)化。这里的难点是:标记过程结束后,执行程序可以又使对象“复活”。
分代收集
这个算法其实是基于数理统计的。不同的对象使用情况可能不同,有些瞬间消逝,有些恒久保留。为此,我们可以建立不同的区间,当对象经过n次考验,依然存活,就将它移到另外一个区域。现代的jvm就是采用了这个思想,分为新生代,持久代。每个区域可以根据情况,采用不用的垃圾收集算法。
参考资料
1.深入java虚拟机
2.深入理解java虚拟机
3.通俗解释垃圾回收算法 http://www.game798.com/html/2007-04/3425.htm
更多关于jvm的内容可以访问 www.iamcoding.com
分享到:
相关推荐
在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这...
2. **垃圾回收算法**: - **标记-清除(Mark-Sweep)**:首先标记出所有活动对象,然后清除未标记的对象。缺点是容易产生内存碎片。 - **复制(Copying)**:将内存分为两块,每次只使用一块,当一块用完后,将...
### JVM学习笔记 #### JVM内存模型 (JMM) JVM内存模型主要分为以下几个部分: - **Java堆**:这是所有线程共享的一块区域,在虚拟机启动时创建。主要用于存放对象实例,几乎所有的对象实例都在这里分配内存。 - *...
Java垃圾回收(Garbage Collection, 简称GC)是Java编程语言中一项重要的自动内存管理机制,...通过阅读"Java学习笔记_垃圾回收.pdf",你将进一步深入理解这个主题,掌握如何在实际项目中有效利用和优化垃圾回收机制。
JVM的学习可以从其基本结构、代码编译和执行过程,以及内存管理和垃圾回收机制三个方面进行深入探讨。 首先,JVM的基本结构分为逻辑结构和物理结构。逻辑结构主要包括Java源码编译器、JVM执行引擎、类加载器等组件...
《深入理解JVM:垃圾回收与优化》 在Java编程领域,JVM(Java Virtual Machine)扮演着至关重要的角色,它是Java程序运行的基础。本文将深入探讨JVM的内存管理,特别是垃圾回收机制,以及相关的优化策略。 首先,...
**JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...
JVM使用不同算法对堆内存进行垃圾回收,如新生代的复制算法、老年代的标记-整理算法或标记-清除算法。垃圾回收的目标是回收不再使用的对象,以释放内存空间。此外,JVM还提供了垃圾收集器,如Serial、Parallel、CMS...
《JVM学习笔记》 Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行所有的Java应用程序。这篇笔记将深入探讨JVM的工作原理、内存管理、类加载机制以及优化策略,帮助读者全面理解JVM并提升Java程序的性能。 ...
通过对Java堆和方法区的理解,结合不同的垃圾回收算法和垃圾回收器的选择,开发者可以更加灵活地调整和优化程序的运行性能。随着技术的发展,未来垃圾回收机制还将不断改进和完善,以适应更加复杂多变的应用需求。
4. **垃圾收集**:JVM的垃圾收集器自动回收不再使用的对象,释放内存。常见的垃圾收集算法有标记-清除、复制、标记-整理和分代收集。新生代和老年代的概念用于区分对象的生命周期,不同的垃圾收集器如Serial、...
### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...
《JVM内存管理学习笔记》 在Java世界中,JVM(Java Virtual Machine)是运行所有Java应用程序的核心。深入理解JVM内存管理对于优化程序性能、预防和解决内存泄漏问题至关重要。本文将从JVM内存模型、内存区域划分、...
- 堆内存:存放对象实例,进行垃圾回收的主要区域。 - 方法区(非堆):存储已加载的类信息、常量、静态变量等。 - 运行时常量池:方法区的一部分,存储编译期生成的各种字面量和符号引用。 4. **垃圾收集(GC)...
JVM的垃圾收集机制负责自动回收不再使用的对象所占用的内存,主要有标记-清除、复制、标记-整理和分代收集等算法。理解垃圾收集的工作原理,可以帮助我们设置合理的内存参数,避免Full GC的发生,提高应用的响应速度...
在深入理解JVM之前,我们先要明白它的核心概念:类加载、内存管理、执行引擎、垃圾回收以及性能优化。 一、类加载机制 JVM的类加载过程包括加载、验证、准备、解析和初始化五个阶段。加载是找到.class文件并读入...
这些学习笔记涵盖了IT领域的多个关键知识点,让我们一一深入探讨。 首先,JVM(Java Virtual Machine)是Java程序运行的基础,它是Java平台的核心组成部分。理解JVM的工作原理对于优化Java应用程序性能至关重要。...
【描述】"ImagesForJVM——JVM笔记图片" 暗示这些图片可能是教学或学习笔记的一部分,旨在通过视觉化的方式解释JVM的关键概念,如内存模型、类加载机制、垃圾收集以及性能优化等方面。 【标签】"java" 明确了这些...
4. 垃圾回收:深入理解垃圾回收机制,如分代收集,可达性分析,以及不同GC算法,如Serial、Parallel、CMS和G1。 5. 调优工具:使用JConsole、VisualVM或JProfiler等工具进行JVM性能监控和调优。 6. 深入JVM:探讨...