其实了解JAVA的人,都知道JAVA的GC机制是其的一大优点,它令程序员不需要主动去考虑内存溢出和垃圾回收的问题,不像c++具有显式的析构函数对整个对象进行内存清理以及需要调用delete才可以进行显示的销毁对象。
当然也有存在特殊的情况:假定你的对象(并非使用new方法)获得了一块“特殊”的内存区域,由于垃圾回收器只知道那些显示地经由new分配的内存空间,所以它不知道该如何释放这块“特殊”的内存区域,那么这个时候java允许在类中定义一个由finalize()方法。
对于上面这个问题,首先了解一下什么是“特殊”的内存区域?
由于在分配内存的时候可能采用了类似 C语言的做法,而非JAVA的通常new做法。这种情况主要发生在native method中,比如native method调用了C/C++方法malloc()函数系列来分配存储空间,但是除非调用free()函数,否则这些内存空间将不会得到释放,那么这个时候就可能造成内存泄漏。但是由于free()方法是在C/C++中的函数,所以finalize()中可以用本地方法来调用它。以释放这些“特殊”的内存空间。
另外finalize()方法还可以用作这样的用途:因为在JAVA中并没有提够像“析构”函数或者类似概念的函数,要做一些类似清理工作的时候,必须自己动手创建一个执行清理工作的普通方法,也就是override Object这个类中的finalize()方法。例如,假设某一个对象在创建过程中会将自己绘制到屏幕上,如果不是明确地从屏幕上将其擦出,它可能永远都不会被清理。如果在finalize()加入某一种擦除功能,当GC工作时,finalize()得到了调用,图像就会被擦除。要是GC没有发生,那么这个图像就会
被一直保存下来。
其次,了解一下finalize()方法的工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工作。只有到下一次再进行垃圾回收动作的时候,才会真正
释放这个对象所占用的内存空间。
最后,必须一定要正视一个问题:finalize()并不是代替了delete()方法,来作为清理内存的方法。为什么呢?在C++中所有的对象运用delete()一定会被销毁,而JAVA里的对象并非总会被垃圾回收器回收。In another word, 1 对象可能不被垃圾回收,2 垃圾回收并不等于“析构”,3 垃圾回收只与内存有关。也就是说,并不是如果一个对象不再被使用,是不是要在finalize()中释放这个对象中含有的其它对象呢?不是的。因为无论对象是如何创建的,垃圾回收器都会负责释放那些对象占有的内存。
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javajs/20090920/175970.html#)
分享到:
相关推荐
在本课程"【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc"中,我们将深入探讨JVM的结构、`finalize`方法以及垃圾收集(Garbage Collection,简称GC)机制。以下是这些主题的详细阐述: 1. JVM结构: - ...
Java 中 finalize() 的用法 Java 中的 finalize() 方法是垃圾回收器在回收对象时调用的第一个方法。...finalize() 方法是 Java 中的一种机制,用于释放对象占用的系统资源,但需要正确地使用和注意其调用机制和限制。
- 在Java中,可以通过重写`finalize()`方法来进行对象销毁前的清理工作。不过需要注意的是,`finalize()`方法的调用是非确定性的,也就是说无法保证它一定会被调用。 - 一般来说,不建议依赖`finalize()`方法来...
- **finalize**:对象被垃圾回收之前可以被调用的一个特殊方法,但已被弃用。 ### 11. Anonymous Inner Class 的特点 匿名内部类没有名称,可以在需要的地方直接定义并使用,通常用于实现接口中的方法。 ### 12. ...
本文将深入探讨Java堆的管理,特别是垃圾回收(Garbage Collection, GC)的原理与机制。 #### Java堆的分配与回收 Java虚拟机(JVM)在执行Java程序时,会为每个线程创建一个私有的栈,用于存储局部变量、操作数栈...
- Java对象有一个`finalize()`方法,该方法可以在对象被垃圾回收之前执行。 - `System.gc()`和`Runtime.getRuntime().gc()`可以手动触发垃圾回收,但这并不是最佳实践。 #### 7. jar和war - `jar`(Java Archive)...
Java垃圾回收机制的finalize方法实例分析 Java垃圾回收机制的finalize方法是垃圾回收机制中一个非常重要的概念,它可以帮助开发者更好地理解和掌握垃圾回收机制的工作机理。本文将通过实例形式分析finalize方法的...
- **finalize**:对象被垃圾回收前可选的清理资源的方法,现已过时。 - **Exception、Error、运行时异常与一般异常的异同**: - **Exception**:所有异常的基类。 - **Error**:系统级别的错误,无法预料且通常...
### Java基础总结基础部分 #### 运行时异常与一般异常的区别 异常是程序运行过程中可能出现的非正常状态。在Java中,异常大致分为两大类:运行时异常和非运行时异常(也称检查型异常)。 - **运行时异常**: - ...
总的来说,Java的GC机制是一个复杂而重要的主题,理解其工作原理,掌握如何与之协作和优化,对于提升Java程序的性能和稳定性至关重要。开发者需要不断学习和实践,以便在实际项目中做出最佳的内存管理决策。
Java垃圾收集(GC)机制是Java编程中...理解Java的GC机制有助于优化程序性能,避免因内存管理不当引起的系统不稳定。开发者应根据应用需求选择合适的垃圾收集策略,并注意合理使用各种引用类型,避免不必要的内存占用。
### Java企业级开发综合技能知识总结 #### Java面向对象 1. **super()与this()的区别?** - `super()`用于调用父类构造器,必须作为子类构造器的第一条语句出现。 - `this()`用于调用本类的其他构造器,也必须...
- **finalize**: 这是Object类的一个方法,由垃圾回收器调用,在对象被销毁之前提供一次机会来清理资源。然而,依赖finalize()进行资源管理是不推荐的,因为其调用时间不确定,且可能永远不会被调用。 #### 二、...
- **构造函数与析构函数**:了解构造函数的作用,何时调用,以及析构函数的概念(Java中没有标准的析构函数,但可以使用 finalize 方法)。 - **访问修饰符**:public、private、protected以及默认修饰符的权限...
理解GC的工作机制对于优化Java应用的性能至关重要。例如,通过调整新生代和老年代的比例,可以控制年轻代和老年代的对象分配策略,从而减少垃圾收集的频率。另外,设置合适的堆大小和使用适当的GC算法也能显著提升...
Java垃圾回收机制(GC)是Java编程语言的关键特性,它自动管理内存,释放不再使用的对象,以防止内存泄漏。GC的运作方式主要有两种策略:引用计数和对象引用遍历。 引用计数是一种简单但不完美的方法。每个对象都有...
总结来说,Java的垃圾回收机制和`finalize()`方法是为了解决内存管理问题而设计的,但使用时需谨慎,避免滥用。通常,遵循良好的编程习惯,如使用`try-finally`或`try-with-resources`来管理资源,可以更好地保证...