【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术

【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术

ID:30786898

大小:115.56 KB

页数:8页

时间:2019-01-03

【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术_第1页
【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术_第2页
【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术_第3页
【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术_第4页
【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术_第5页
资源描述:

《【深入java虚拟机(8)】:java垃圾收集机制-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、【深入Java虚拟机(8)】:Java垃圾收集机制-编程开发技术【深入Java虚拟机(8)】:Java垃圾收集机制原文出处:兰亭风雨对象引用Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了Java中所有的对象实例。谈到Java堆中的垃圾冋收,自然要谈到引用。在JDK1.2之前,Java小的引用定义很很纯粹:如果reference类型的数据屮存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。但在JDK1.2之后,Java对引用的概念进行了扩充,将其分为强引用(Strong?Reference)、软引

2、用(Soft?Reference)、弱引用(Weak?Reference)、虚引用(Phantom?Reference)四种,引用强度依次减弱。•强引用:如“Objcct?obj?二?new?Object()”,这类引用是Java程序中最普遍的。只要强引用还存在,垃圾收集器就永远不会回收掉被引用的对彖。•软引用:它用来描述一些可能还有用,但并非必须的对象。在系统内存不够用时,这类引川关联的对象将被垃圾收集器回收oJDKl.2之后捉供了SoftReference类來实现软引用。•弱引用:它也是用來描述非需对象的,但它的强度比软引用更弱

3、些,被弱引用关联的对象只能生存岛下一次垃圾收集发生Z前。当垃圾收集器工作吋,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK1.2之后,提供了WeakReference类来实现弱引用。•虚引用:最弱的一种引用关系,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一II的是希望能在这个对象被收集器回收时收到一个系统通知。JDK1.2Z后提供了PhantomReference类來实现虚引用。垃圾对象的判定Java堆小存放着几乎所有的对象实例,垃圾收集器对堆小的对彖进行回收前,要

4、先确定这些对象是否还有用,判定对象是否为垃圾对象有如下算法:??引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减I,任何时刻计数器都为0的对彖就是不可能再被使用的。引用计数算法的实现简单,判定效率也很高,在人部分情况下它都是一个不错的选择,当Ja腹语言并没有选择这种算法來进行垃圾冋收,主要原因是它很难解决对彖之间的相互循环引用问题。???根搜索算法Java和C#小都是采用根搜索算法来判定对象是否存活的。这种算法的基木思路是通过一系列名为“GC?Roots”的对象作为起始点,从这

5、些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC?Roots没有任何引用链相连时,就证明此对象是不可用的。在Java语言里,可作为GC?Roots的兑现包括下而几种:•虚拟机栈(栈帧中的本地变量表)中引用的对彖。•方法区中的类静态属性引用的对象。•方法区小的常量引用的对象。•本地方法栈中JNI(Native方法)的引用对象。实际上,在根搜索算法中,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行根搜索后发现没有与GC?Roots相连接的引用链,那它会被第一次标记并11进行一次筛选,筛选的条件是此对象是否

6、有必要执行()方法。当对象没有覆盖finalize()方法,或finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为没冇必耍执行。如果该对彖被判定为冇必要执行finalize()方法,那么这个对彖将会被放置在一个名为F-Queue队列中,并在稍后由一条由虚拟机自动建立的、低优先级的Finalizer线程去执行finalize()方法。finalize()方法是对象逃脱死亡命运的最后一次机会(因为一个对象的finalizc()方法最多只会被系统口动调用一次),稍后GC将对F-Queue屮的对彖进行第二次小规模的标记,如杲

7、要在finalize()方法屮成功拯救口己,只要在finalize()方法中让该对象重引用链上的任何一个对象建立关联即可。而如果对象这吋还没有关联到任何链上的引用,那它就会被冋收掉。垃圾收集算法判定除了垃圾对象之后,便可以进行垃圾回收了。下面介绍一些垃圾收集算法,由于垃圾收集算法的实现涉及大量的程序细节,因此这里主要是阐明各算法的实现思想,而不去细论算法的具体实现。???标记一清除算法标记一清除算法是最基础的收集算法,它分为“标记”和“清除”两个阶段:首先标记出所需回收的对象,在标记完成后统一回收掉所冇被标记的对彖,它的标记过程其实

8、就是前面的根搜索算法中判定垃圾对彖的标记过程。标记一清除算法的执行情况如下图所示:冋收前状态:存活对象可回收未使用??回收后状态:该算法有如下缺点:•标记和清除过程的效率都不高。•标记清除后会产生人量不连续的内存碎片,空间碎片太多可能

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。