首页 > 其他 > 详细

垃圾回收GC——JVM之七

时间:2014-02-09 20:20:29      阅读:466      评论:0      收藏:0      [点我收藏+]

JVM中自动的对象内存回收机制称为:GCGarbage Collection

一、基本原理:

      为将内存中不再被使用的对象进行回收,GC中用于回收内存中不被使用的对象的方法称为收集器,由于GC需要消耗一些资源和时间的,Java在对对象的生命周期特征进行分析后,在V 1.2以上的版本采用了分代的方式来进行对象的收集,即按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

      1)对新生代的对象的收集称为minor GC

      2)对旧生代的对象的收集称为Full GC

      3)程序中主动调用System.gc()强制执行的GCFull GC

二、JVM中自动内存回收机制

1)引用计数收集器

 原理:

      引用计数是标识Heap中对象状态最明显的一种方法,引用计数的方法简单来说就是对每一个对象都提供一个关联的引用计数,以此来标识该对象是否被使用,当这个计数为零时,说明这个对象已经不再被使用了。 

 优点:

      引用计数的好处是可以不用暂停应用,当计数变为零时,即可将此对象的内存空间回收,但它需要给每个对象附加一个关联引用计数 

 缺点:

      并且引用计数无法解决循环引用的问题,因此JVM并没有采用引用计数。    

2)跟踪收集器

 原理:

      跟踪收集器的方法为停止应用的工作,然后开始跟踪对象,跟踪时从对象根开始沿着引用跟踪,直到检查完所有的对象。 

根对象的来源主要有三种:

        1.被加载的类的常量池中的对象引用

        2.传到本地方法中,没有被本地方法“释放”的对象引用

        3.虚拟机运行时数据区中从垃圾收集器的堆中分配的部分 

存在问题:

     跟踪收集器采用的均为扫描的方法,但JVMHeap分为了新生代和旧生代,在进行minor GC时需要扫描是否有旧生代引用了新生代中的对象,但又不可能每次minor GC都扫描整个旧生代中的对象,因此JVM采用了一种称为卡片标记(Card Marking)的算法来避免这种现象。

3)卡片标记算法

     卡片标记的算法为将旧生代以某个大小(例如512字节)进行划分,划分出来的每个区域称为卡片,JVM采用卡表维护卡的状态,每张卡片在卡表中占用一个字节的标识(有些JVM实现可能会不同),当Java代码执行过程中发现旧生代的对象引用或释放了对于新生代对象的引用时,就相应的修改卡表中卡的状态,每次Minor GC只需扫描卡表中标识为脏状态的卡中的对象即可

bubuko.com,布布扣

垃圾回收GC——JVM之七

原文:http://www.cnblogs.com/muffe/p/3541700.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!