垃圾回收

日期:2015-07-20点击次数:9571

       最近整理了 一些关于垃圾回收机制的相关知识,在这里和大家分享一下。
 
       垃圾回收和清理概要
       垃圾回收(Garbage Collection)的目的是为了释放内存,这也是它的唯一目的。它的工作是“找到”没用的对象,等内存不够用时,释放其内存。如果要其他释放资源(非new 创建的),可能会用到finalize()函数,JVM 会在内存回收前调用该方法。
 
       何时回收
       回收的条件指没有指向它的引用。但不能说没有引用的”对象“是无用的,常见的是临时对象,如Systen,out.print("hello")。实际上,引用也分为很多种:JDK1.2 后把引用分为强引用,弱引用,软引用,虚引用。强引用是我们最常用的那种,JVM 不会回收它,宁愿抛出Out of Memory 的异常;弱引用,软引用都是”可有可无的“,软引用只有内存不足时,gc 才会将它视为回收对象,弱引用无论当前内存是否满足,gc 都会去回收它;虚引用随时有被回收的可能。
       但满足回收条件也不一定会被回收,部分原因是GC 是个低优先级的线程。因此,我们并不能知道垃圾回收是否何时发生。
 
       finalize()
       使用finalize()的部分原因是”本地方法“的使用,(本地方法指在Java 里调用非Java
       代码,如C).这样在finalize()调用该语言的释放内存方法。
       finalize方法区别于C++的析构函数,不同之处即finalize()何时执行是不确定的。
 
       原理:
       1、finalize()方法是Object中的方法。
       2、finalize()方法会在对象被垃圾回收之前被垃圾回收器调用一次,这是Java语言的一种机制。
       3、finalize()方法在任何对象上最多只会被垃圾回收器调用一次。
 
       陷阱:
       1、垃圾回收器无法保证垃圾对象能被回收,因此,finalize()方法也无法保证运行。建议不要重写finalize()方法,即使重写,也不要在finalize()方法中写关键的代码。
       2、finalize()方法中可以把自己传递个别的对象,这样就不是垃圾了,避免了被回收。但是当下次这个对象又符合垃圾回收的时候,finalize()方法不会被调用第二次了,而是直接被清理掉了。
 
      通过编程的手段来影响垃圾回收
 
       1、将无用对象赋值为null。这种方式一般不会使用,因为当这个对象的作用域执行完毕后,该对象会自动释放;
       2、重新为引用变量赋值。比如:
       Kingsmirt k = new Kingsmirt("BeiJing");
       k = new Kingsmirt("XiZhiMen");
       这样,new Kingsmirt("BeiJing")这个对象就没有指向它的引用了,该对象者符合垃圾回收条件。
 
       3、强制的垃圾回收System.gc()
       实际上这里的强制,是程序员的意愿、建议,什么时候执行是JVM的垃圾回收器说了算。调用垃圾回收也不一定能保证未使用的对象一定能从内存中删除。
       唯一能保证的是,当你内存在极少的情况,垃圾回收器在程序抛出OutofMemaryException之前运行一次。

 
 
 




软件部       连鹏

姓名:
性别:
电话:
E-mail
问题:
问题描述: