深入java-----垃圾回收机制
2014-11-27 16:13
337 查看
关于J***A垃圾回收机制的一些总结:
1 关于finalize()方法
这是一个类内部的方法,在基类中就有定义,如果需要使用可以重写该方法,protected void finalize(),一旦垃圾回收期准备好对象占用的存储空间,将首先调用finalize()方法,并且在垃回收动作发生之前调用该方法,之后才会释放占用的内存,所以可以使用finalize()方法做一些重要的清理工作,或者是一些标记工作(对象终结条件的验证)。绝对不能直接调用finalize(),该方法是在后台系统级线程自动调用的。如果父类也有finalize()方法,可以super.finalize()。
2 关于System.gc()方法
这是向JVM提出垃圾申请的一个方法,只是告诉JVM这里有一个垃圾需要处理,但不一定会被处理。我们可以显示调用,但是不建议这么使用,会增加系统开销。在创建对象时。如果对象没有引用,就会成为垃圾,比如直接new BooK(),但此时并没有定义一个引用指向该对象,成为一个垃圾,又或者在赋值给一个引用之后,把该引用=Null,则该对象的引用计数=0,在申请gc进行处理时可能会被清理。要养成在不用一个引用之后把它设为空null的习惯。方便进行垃圾回收。
3 下面使用thinking in java P89中例子程序详细说明finalize()的一个作用以及System.gc()方法的使用
也(可能)会出现同样的结果推荐补充博客:http://blog.csdn.net/zsuguangh/article/details/6429592
1 关于finalize()方法
这是一个类内部的方法,在基类中就有定义,如果需要使用可以重写该方法,protected void finalize(),一旦垃圾回收期准备好对象占用的存储空间,将首先调用finalize()方法,并且在垃回收动作发生之前调用该方法,之后才会释放占用的内存,所以可以使用finalize()方法做一些重要的清理工作,或者是一些标记工作(对象终结条件的验证)。绝对不能直接调用finalize(),该方法是在后台系统级线程自动调用的。如果父类也有finalize()方法,可以super.finalize()。
2 关于System.gc()方法
这是向JVM提出垃圾申请的一个方法,只是告诉JVM这里有一个垃圾需要处理,但不一定会被处理。我们可以显示调用,但是不建议这么使用,会增加系统开销。在创建对象时。如果对象没有引用,就会成为垃圾,比如直接new BooK(),但此时并没有定义一个引用指向该对象,成为一个垃圾,又或者在赋值给一个引用之后,把该引用=Null,则该对象的引用计数=0,在申请gc进行处理时可能会被清理。要养成在不用一个引用之后把它设为空null的习惯。方便进行垃圾回收。
3 下面使用thinking in java P89中例子程序详细说明finalize()的一个作用以及System.gc()方法的使用
package com.itany.www; public class Book { private boolean checkOut; Book(boolean checkOut) { this.checkOut=checkOut; } //checkIn之后checkOut就会变成假 public void checkIn() { checkOut=false; } protected void finalize() { /* * 如果没有checkIn也就是checkOut为真 在系统清理垃圾之前自动调用finalize时会验证 * 也就是你可以把在对象垃圾清理之前 做一些你想做的事情 比如验证终结条件 是否已经被签入checkIn * 只有成功签入的书的对象才会正常被清理 */ if(checkOut) { System.out.println("ERROR BOOKSTATE:CHECKOUT"); } else { System.out.println("OK BOOKSTATE:CHECKIN"); } //父类的finalize如果也要做一些事情的话就要调用super.finalize()方法 如果不需要的话就不要调用了 // try // { // super.finalize(); // } // catch (Throwable e) // { // e.printStackTrace(); // } } } <pre name="code" class="java">public class Test { public static void main(String[] args) { //对象创建以后没被任何变量引用,所以被视为垃圾对象 // new Book(true); Book cc=new Book(true); cc=null; System.gc(); } } 运行结果:ERROR BOOKSTATE:CHECKOUT 如果只运行 <pre name="code" class="java">new Book(true); System.gc();
也(可能)会出现同样的结果推荐补充博客:http://blog.csdn.net/zsuguangh/article/details/6429592
相关文章推荐
- 深入Java核心 探秘Java垃圾回收机制
- 【转】深入理解 Java 垃圾回收机制
- 深入理解 Java 垃圾回收机制
- 深入理解Java垃圾回收机制
- Java内存区域分配、存储、垃圾回收策略与回收机制(深入JVM虚拟机)
- 深入理解 Java 垃圾回收机制
- 面试必备 | 深入解析Java垃圾回收机制
- 深入理解java垃圾回收机制
- 深入理解 Java 垃圾回收机制
- 【深入Java虚拟机】之二:Java垃圾回收机制
- 转载 深入Java核心 探秘Java垃圾回收机制
- 深入理解java垃圾回收机制----
- 面试必备 | 深入解析Java垃圾回收机制
- 深入Java核心 探秘Java垃圾回收机制(转自http://edu.21cn.com/java/g_189_859836-1.htm)
- 深入理解Java垃圾回收机制以及内存泄漏
- 深入理解 Java 垃圾回收机制
- 深入理解java垃圾回收机制----
- 深入理解Java的垃圾回收机制
- 深入理解 Java 垃圾回收机制
- 深入理解 Java 垃圾回收机制