`
百合不是茶
  • 浏览: 345629 次
社区版块
存档分类
最新评论

垃圾收集器标记原理

阅读更多

 

 

   java虚拟机完成收集需要三个步骤;

                        1,哪些内存需要回收,2,什么时候回收,3,如何回收

 

 

 

标记回收的对象:

     java虚拟机在回收Java堆中的对象之前需要将其标记是否存活

 

 

 

回收对象的标记方法;

    

 1, 引用计数法;给对象添加一个计算器,有引用时i++,没有就i--;当任何时刻都为0 表明其已经死亡

 

 

2,根搜索算法;通过"GC roots"的对象作为起点,从这些节点往下搜索,当没有引用链相连时,则表示此对象是不可用的;(类是链表)

 

     JAVA中可以作为GC roots的对象的包含下面四种;  

         虚拟机栈(栈帧中的本地变量表)中的引用对象

        方法区中的类静态属性引用的对象

        方法区中的常量引用的对象

        本地方法栈中的JNI的引用的对象

 

 

 

3,对象的标记

      标记对象的死亡至少需要标记两次,第一次进行筛选,第二次标记死亡

 

 

4,方法区的回收

 

     在java中一般在java堆中回收的效率要高于方法区的效率,特别是java堆中的新生代中的标记

 

     

 

 

      

 

垃圾收集算法;

    

      标记---清除算法

      

     最基础的收集算法是“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实在前一节讲述对象标记判定时已经基本介绍过了。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 标记-清除算法的执行过程如图3-2所示。

 
图3-2 “标记-清除”算法示意图

 

 

 

 

     2,复制算法

   

     

为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半,未免太高了一点。复制算法的执行过程如图3-3所示。

 

 

 

3 标记-整理算法

复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以

外的内存,“标记-整理”算法的示意图如图3-4所示。

 

 

 

4 分代收集算法

当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据对象的存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0
2
分享到:
评论

相关推荐

    flex垃圾回收机制是什么原理

    垃圾收集器采用计数法或标记法来查找需要清除的对象。计数法由于无法检测循环引用的对象,现在已经很少采用了。重点谈一下标记法。Flex 应用的对象在内存中被映射成树形结构。这很好理解,每个 Flex 应用总有一个 ...

    JVM 知识点整理:GC垃圾收集器及相关算法

    JVM 知识点整理:GC垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑” finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法...

    浅谈JavaScript的自动垃圾收集机制

    为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性地执行这一操作。 垃圾收集的方式: 1.标记清除(mark-and-sweep)  最常用的垃圾收集方式。当变量进入环境时,就将变量标记为“进入...

    谈谈JavaScript中的垃圾回收机制

    为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间), 周期性地执行这一操作。  具体到浏览器中的实现,则通常有两个策略,分别为标记清除和引用计数。 一、标记清除  JavaScript 中最常用的垃圾...

    JVM讲解视频.zip

    JVM全套教程视频 o类加载机制 java跨平台机制 ...Parallel垃圾收集器详解 CMS垃圾收集器详解 G1垃圾收集器详解 ZGC垃圾收集器详解 三色标记算法 跨代垃圾收集之卡表详解 oJVM调优实战 JDK自带调优

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第40讲 垃圾收集器-parallel收集器详解 00:11:02  第41讲 垃圾收集器-cms收集器详解 00:14:58  第42讲 最牛的垃圾收集器-g1收集器详解 00:18:04  第43讲 内存分配-概述 00:04:23  第44讲 内存分配-Eden...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第40节垃圾收集器-parallel收集器详解00:11:02分钟 | 第41节垃圾收集器-cms收集器详解00:14:58分钟 | 第42节最牛的垃圾收集器-g1收集器详解00:18:04分钟 | 第43节内存分配-概述00:04:23分钟 | 第44节内存分配-...

    tunemygc:TuneMyGC-最佳MRI Ruby 2.1+垃圾收集

    最佳MRI Ruby 2.1+垃圾收集 长期以来,Ruby垃圾收集器已被标记为Ruby性能和内存使用的症结所在。 在过去的几年中,它有了很大的改进,但是仍然有很多需要调整和控制的地方。 默认配置不适用于大型Ruby应用程序,也不...

    Java虚拟机

    常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了...

    美国..现代编译原理C语言描述.高清版

    第二部分是高级主题,包括面向对象语言和函数语言、垃圾收集、循环优化、SSA(静态单赋值)形式、循环调度、存储结构优化等,适合于后续课程或研究生教学。书中专门为学生提供了一个用C语言编写的实习项目,包括前端和...

    java面试题

    Bea JRockit JVM支持4种垃圾收集器: 46 63.5. 如何从JVM中获取信息来进行调整 46 63.6. Pdm系统JVM调整 47 63.6.1. 服务器:前提内存1G 单CPU 47 63.6.2. 客户机:通过在JNLP文件中设置参数来调整客户端JVM 47 64....

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本...这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() ...

    net学习笔记及其他代码应用

    程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 37.String s = new String(\"xyz\");创建了几个String Object? 答:...

    超级有影响力霸气的Java面试题大全文档

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...

    java 面试题 总结

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的...

    java核心知识点整理.pdf

    1. 目录 1. 2.... 28 分代收集算法 .............................................................................................................................. 29 新生代与复制算法 .......

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. ... 28 分代收集算法 .............................................................................................................................. 29 新生代与复制算法 .......

    Java开发技术大全 电子版

    3.2.7对象的释放和垃圾收集机制108 3.3成员变量的定义与使用109 3.3.1成员变量的定义109 3.3.2成员变量的访问权限110 3.3.3实例成员变量和静态成员变量114 3.4方法的定义和实现116 3.4.1方法的声明117 3.4.2...

Global site tag (gtag.js) - Google Analytics