当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

Java中处理垃圾回收的问题详解[Java编程]

赞助商链接



  本文“Java中处理垃圾回收的问题详解[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

我们知道,很多程序计划语言都答应在程序运行期动态地分配内存空间.

分配内存的方法多种多样,取决于该种语言的语法构造.但不管是哪一种语言的内存分配方法,最后都要返回所分配的内存块的起始地址,即返回一个指针到内存块的首地址.

当已经分配的内存空间不再需求时,换句话说当指向该内存块的句柄超越了利用范围的时刻,该程序或其运行环境就应当回收该内存空间,以节俭贵重的内存资源.

在C,C++或其他程序计划语言中,无论是对象还是动态配置的资源或内存,都必须由程序员自行声明产生和回收,不然此中的资源将损耗,造成资源的浪费乃至死机.但手工回收内存常常是一项复杂而艰难的工作.因为要预先肯定占用的内存空间能否应当被回收是非常艰难的!假如一段程序不能回收内存空间,并且在程序运行时系统中又没有了可以分配的内存空间时,这段程序就只能崩溃.普通,我们把分配出去后,却无法回收的内存空间称为"内存渗漏体(Memory Leaks)".

以上这种程序计划的潜在危险性在Java这样以严谨、安全著称的语言中是不答应的.但是Java语言既不能限制程序员编写程序的安闲性,又不能把声明对象的部份去除(不然就不是面向对象的程序语言了),那么最好的办理办法就是从Java程序语言本身的特点动手.于是,Java技术供应了一个系统级的线程(Thread),即垃圾汇集器线程(Garbage Collection Thread),来跟踪每一块分配出去的内存空间,当Java 虚拟机(Java Virtual Machine)处于闲暇循环时,垃圾汇集器线程会自动查抄每一快分配出去的内存空间,然后自动回收每一快可以回收的无用的内存块.

垃圾汇集器线程是一种低优先级的线程,在一个Java程序的生命周期中,它只有在内存闲暇的时刻才有机会运行.它有效地避免了内存渗漏体的呈现,并极大大概地节俭了贵重的内存资源.但是,通过Java虚拟机来履行垃圾汇集器的筹划可以是多种多样的.

下面介绍垃圾汇集器的特点和它的履行机制:

垃圾汇集器系统有自己的一套筹划来判断哪个内存块是应当被回收的,哪个是不符合要求暂不回收的.垃圾汇集器在一个Java程序中的履行是自动的,不能强迫履行,即便程序员能明确地判断出有一块内存已经无用了,是应当回收的,程序员也不能强迫垃圾汇集器回收该内存块.程序员唯一能做的就是通过调用System. gc 办法来"倡议"履行垃圾汇集器,但其能否可以履行,什么时刻履行却都是不可知的.这也是垃圾汇集器的最主要的缺陷.当然相关于它给程序员带来的宏大便利性而言,这个缺陷是瑕不掩瑜的.

垃圾汇集器的主要特点有:

1.垃圾汇集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节俭内存资源,避免程序代码的崩溃.

2.垃圾汇集器判断一个对象的内存空间能否无用的尺度是:假如该对象不能再被程序中任何一个"活动的部份"所引用,此时我们就说,该对象的内存空间已经无用.所谓"活动的部份",是指程序中某部份参与程序的调用,正在履行历程中,还没有履行完毕.

3.垃圾汇集器线程固然是作为低优先级的线程运行,但在系统可用内存量太低的时刻,它大概会突发地履行来解救内存资源.当然其履行与否也是不可预知的.

4.垃圾汇集器不可以被强迫履行,但程序员可以通过调用System. gc办法来倡议履行垃圾汇集器.

5.不能保证一个无用的对象一定会被垃圾汇集器汇集,也不能保证垃圾汇集器在一段Java语言代码中一定会履行.因此在程序履行历程中被分配出去的内存空间大概会一向保存到该程序履行完毕,除非该空间被重新分配或被其他办法回收.由此可见,完好完好地根绝内存渗漏体的产生也是不大概的.但是请不要忘掉,Java的垃圾汇集器毕竟使程序员从手工回收内存空间的沉重工作中摆脱了出来.假想一个程序员要用C或C++来编写一段10万行语句的代码,那么他一定会充分领会到Java的垃圾汇集器的长处!

6.一样没有办法预知在一组均符合垃圾汇集器汇集尺度的对象中,哪一个会被首先汇集.

7.循环引用对象不会影响其被垃圾汇集器汇集.

8.可以通过将对象的引用变量(reference variables,即句柄handles)初始化为null值,来表示垃圾汇集器来汇集该对象.但此时,假如该对象衔接有事件监听器(典型的 AWT组件),那它还是不可以被汇集.所以在设一个引用变量为null值之前,应注意该引用变量指向的对象能否被监听,若有,要首先除去监听器,然后才可以赋空值.

9.每一个对象都有一个finalize( )办法,这个办法是从Object类担当来的.

10.finalize( )办法用往复收内存以外的系统资源,就像是文件处理器和网络衔接器.该办法的调用次序和用来调用该办法的对象的成立次序是无关的.换句话说,书写程序时该办法的次序和办法的实际调用次序是不相关的.请注意这只是finalize( )办法的特点.

11.每个对象只能调用finalize( )办法一次.假如在finalize( )办法履行时产生非常(exception),则该对象仍可以被垃圾汇集器汇集.

12.垃圾汇集器跟踪每一个对象,汇集那些不可到达的对象(即该对象没有被程序的任何"活的部份"所调用),回收其占据的内存空间.但在举行垃圾汇集的时刻,垃圾汇集器会调用finalize( )办法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象.既然每个对象只能调用一次finalize( )办法,所以每个对象也只大概"复苏"一次.


  以上是“Java中处理垃圾回收的问题详解[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .