`
easonfans
  • 浏览: 254160 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java--finalize()详细解释

阅读更多

非常精辟的概括:

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( )方法,所以每个对象也只可能"复苏"一次。
13.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。
14.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。
15.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。
16.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。
17.当一个方法执行完毕,其中的局部变量就会超出使用范围,此时可以被当作垃圾收集,但以后每当该方法再次被调用时,其中的局部变量便会被重新创建。
18.Java语言使用了一种"标记交换区的垃圾收集算法"。该算法会遍历程序中每一个对象的句柄,为被引用的对象做标记,然后回收尚未做标记的对象。所谓遍历可以简单地理解为"检查每一个"。
19.Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。 通过以上对垃圾收集器特点的了解,你应该可以明确垃圾收集器的作用,和垃圾收集器判断一块内存空间是否无用的标准。简单地说,当你为一个对象赋值为null并且重新定向了该对象的引用者,此时该对象就符合垃圾收集器的收集标准。

来源:http://hi.baidu.com/paradise0104/blog/item/4414f90f9072acee36d122b1.html

分享到:
评论

相关推荐

    Java中finalize()的用法

    Java 中 finalize() 的用法 Java 中的 finalize() 方法是垃圾回收器在回收对象时调用的第一个方法。finalize() 方法相当于析构函数,它是垃圾回收器回收一个对象时第一个要调用的方法。finalize() 方法的主要作用是...

    java----java面试

    以上是对给定文件中提到的一些Java面试知识点的详细解析。这些知识点不仅涵盖了基本语法和概念,还涉及到了面向对象编程、异常处理、集合框架等多个方面,对于准备Java面试的求职者来说非常有价值。

    【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc.zip

    在本课程"【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc"中,我们将深入探讨JVM的结构、`finalize`方法以及垃圾收集(Garbage Collection,简称GC)机制。以下是这些主题的详细阐述: 1. JVM结构: - ...

    java---面试key

    以下是对这些知识点的详细解释: 1. **String对象创建**: 当我们创建`String s = new String("xyz");`时,实际上是创建了两个对象:一个是在常量池中的"xyz"字符串对象,另一个是堆内存中新创建的String对象,它...

    java--九阴真经

    以下是一些关键知识点的详细解析: 1. **final、finally、finalize的区别** - `final`:这是一个修饰符,用于声明不可变的类、变量和方法。当一个类被声明为final,意味着它不能被继承;一个final变量一旦初始化后...

    java-基础/jvm/多线程

    - JVM(Java Virtual Machine)是Java程序运行的平台,负责解释执行字节码。 - JRE(Java Runtime Environment)包含了JVM和Java库,是运行Java程序所需的基本环境。 - JDK(Java Development Kit)是开发和调试...

    cms-java-源码

    5. **CMSFinalizerEnqueuer**:处理在垃圾收集过程中发现的需要 finalize 的对象。 通过分析这些源码,开发者可以学习到以下知识点: 1. **垃圾收集算法的理解**:CMS是如何实现并发标记和清除的,以及其与其他...

    Object类的finalize的用法1---马克-to-win java视频

    Object类 finalize 马克-to-win java视频的详细描述

    Object类的finalize的用法2---马克-to-win java视频

    Object类 finalize 马克-to-win java视频 的详细描述介绍

    java-jdk11.0.1

    5. **强引用和弱引用的改进**:Java 11对`Reference`类进行了增强,新增了`PhantomReference`的子类`Cleaner`,提供了一种更简洁的资源清理机制,可以替代 finalize 方法。 6. **JEP 320:移除Java EE和Corba模块**...

    java-lecture.rar_The Information

    以下是基于这个主题的详细知识点解析: 1. **Java简介**:Java的设计目标是“一次编写,到处运行”(Write Once, Run Anywhere, WORA),通过Java虚拟机(JVM)实现跨平台能力。Java有三个主要版本:Java Standard ...

    Java-JDK、数据库系统开发、Web开发学习笔记

    * protected void finalize():当垃圾回收器认为此对象不会再被引用时,垃圾回收器就会调用此方法 * public final Class getClass():用于获得此对象的所有属性类的类名 * public int hashCode():用于获取一个此...

    Java禁止使用finalize方法共2页.pdf.zip

    在Java编程语言中,`finalize()`方法是一个特殊的方法,它属于`Object`类,主要用于对象销毁前执行一些必要的清理工作。然而,随着Java版本的更新和垃圾收集机制的改进,`finalize()`方法逐渐失去了其原本的重要性,...

    Java中finalize方法.pdf

    Java中的`finalize()`方法是Java语言提供的一种机制,用于在对象被垃圾回收之前进行资源清理。这个方法在Java的`Object`类中被定义为`protected`类型,因此所有Java类都能够覆盖它来实现特定的清理操作。在垃圾回收...

    Java入门--简述Java语言回收机制

    - 在Java中,可以通过重写`finalize()`方法来进行对象销毁前的清理工作。不过需要注意的是,`finalize()`方法的调用是非确定性的,也就是说无法保证它一定会被调用。 - 一般来说,不建议依赖`finalize()`方法来...

    java面试题-很详细

    - **析构函数**:Java中没有传统意义上的析构函数,但可以通过`finalize()`方法实现类似的功能,用于在对象被垃圾回收前进行资源清理。 - **虚函数**:Java中通过`abstract`关键字定义抽象类和方法,实现多态性。虚...

    java IBM websphere 内存溢出 javacore deapdump CPU内存分析工具

    当WebSphere遇到问题时,可以通过触发deapdump获取当前JVM的线程详细信息以及堆内存快照。堆内存快照可以揭示哪些对象占用了大量内存,有助于识别内存泄漏的原因。使用IBM的`jmap`命令或者第三方工具如MAT (Memory ...

    Java中finalize方法使用.doc

    Java 中 finalize 方法使用 finalize 方法是 Java 编程语言中一个非常重要的方法,它与 Java 编程中的垃圾回收器有着紧密的关系。当一个对象变成一个垃圾对象的时候,如果此对象的内存被回收,那么就可以调用系统中...

    java面试题 谈谈final, finally, finalize的区别

    在Java编程语言中,`final`, `finally`, 和 `finalize` 是三个非常重要的关键字,它们各自扮演着不同的角色,尤其在处理程序的可预测性、数据的不可变性和垃圾回收等方面。下面将详细阐述这三个关键字的区别及其应用...

    深入探讨 java-lang-ref 包.docx

    总结,java.lang.ref 包中的四种引用类型——StrongReference、SoftReference、WeakReference 和 PhantomReference,提供了不同的内存管理策略,适应不同的场景需求。强引用是最常用的引用类型,但在处理大对象或...

Global site tag (gtag.js) - Google Analytics