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://tech.ccidnet.com/art/3539/20071106/1266251_1.html
分享到:
相关推荐
漫谈Java垃圾收集器 Java垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,旨在释放程序员从手动内存管理的繁琐工作中解脱出来。垃圾收集器通过跟踪对象的引用关系,确定哪些对象是可以被释放的,然后将其...
Java垃圾收集器使用小诀窍详解 Java垃圾收集器是Java虚拟机(JVM)中一个非常重要的组件,它负责管理Java程序中的内存资源,防止内存泄露和溢出。垃圾收集器的使用小诀窍可以帮助开发者写出高效的Java程序,避免...
`finalize()`方法是Java中的一个虚方法,它的设计初衷是为了在对象被垃圾收集器回收前提供最后一次清理机会。程序员可以覆盖这个方法,以便在对象被销毁时执行特定的清理操作,如关闭文件流或释放系统资源。通常,...
`finalize()` 方法是在对象即将被垃圾收集器回收前调用的一个特殊方法。虽然它的存在提供了一种可能的机制来释放资源,但实际上并不推荐使用,因为其调用时间和效果都不可预测。 1. **3.1.1 Finalize() 用处之一:...
- **Serial Collector**:单线程的垃圾收集器,适用于轻量级或者客户端应用。 - **Parallel Collector**:多线程版本的Serial Collector,提高垃圾回收效率。 - **Throughput Collector**:基于Parallel ...
Java垃圾收集器有多种类型,包括: 1. 标记-清除收集器:遍历对象图标记存活对象,然后清理未标记对象,可能导致内存碎片。 2. 标记-压缩收集器:类似于标记-清除,但清理后会压缩存活对象,减少碎片。 3. 复制收集...
在上述代码示例中,`TestGC`类覆盖了`finalize()`方法,当对象被垃圾收集器回收时,会打印出字符串。`main`方法创建了两个`TestGC`对象,然后将第一个对象的引用置为`null`,这使得第一个对象成为可回收的。通过调用...
### Java垃圾回收详解 #### 垃圾回收基础概念 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地...
例如,选择合适的垃圾收集器、调整JVM参数、理解和避免内存泄漏,都是提升Java应用性能的重要手段。随着Java版本的更新,垃圾回收技术也在不断进步,例如Java 7引入的G1收集器,就是为了解决全停顿问题和提供更可控...
Java 技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去 之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对 象调用的。它是在Object 类中定义的,因此所有的类都...
`finalize()` 是一个特殊的方法,它在对象被垃圾收集器回收之前会被调用一次。通常用于执行一些清理工作,比如释放系统资源。但是,这个方法的使用并不推荐,因为它的行为并不确定,且垃圾回收时机难以预测。从Java...
在老年代中,通常采用标记垃圾收集器。这种收集器从一组根引用开始,遍历所有的对象,将被根引用的对象及其引用链上的对象标记为“存活”,剩余的对象被视为“死亡”。 - **标记-清除**:标记所有存活的对象,然后...
最后,`finalize`方法是Java对象生命周期的一部分,它在垃圾收集器准备回收对象之前被调用。然而,`finalize`方法现在并不推荐使用,因为它可能导致性能问题和不可预测的行为。垃圾收集器何时调用`finalize`是不确定...
`finalize`是Java中Object类的一个方法,它的设计初衷是为了提供对象在被垃圾回收之前进行最后清理的机会。当垃圾回收器确定一个对象不再被引用时,会尝试调用该对象的`finalize`方法,以便执行一些清理工作,如关闭...
3. **低暂停时间收集器(Concurrent Low Pause Collector)**:旨在最小化垃圾回收引起的暂停时间,适合交互式应用,如桌面应用或Web服务器,这类应用对用户体验敏感,不能容忍长时间的停顿。 #### 终结方法的问题...
finalize是一个方法名,Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,...
Java 中的垃圾收集器有以下几种: * Serial 垃圾收集器:单线程的垃圾收集器。 * Parallel 垃圾收集器:多线程的垃圾收集器。 * CMS 垃圾收集器:低停顿的垃圾收集器。 * G1 垃圾收集器:低停顿的垃圾收集器。 GC ...
当对象被垃圾收集器标记为即将回收时,会先调用该方法,提供一个在对象被销毁前进行资源释放的机会。然而,依赖`finalize`进行资源清理不是推荐的做法,因为它不能保证及时执行,可能导致内存泄漏,并且性能开销较大...