分享

java中处理垃圾回收的问题详解

 亢建华 2010-09-17
垃圾收集器线程是一种低优先级的线程,在一个Java 程序的生命周期中,它只有在内存空
闲的时候才有机会运行。它有效地防止了内存渗漏体的出现,并极大可能地节省了宝贵的
内存资源。但是,通过Java 虚拟机来执行垃圾收集器的方案可以是多种多样的。
垃圾收集器的主要特点有:
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( )方法,所以每个对象也只可能"复
苏"一次。(节选,具体地址参见http://www./show/2460.html)


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多