在Java中垃圾收集对象的方法

时间:2011-12-13 13:30:12

标签: java memory-management garbage-collection

有没有垃圾收集对象的方法?据我所知,如果有任何对象要进行垃圾回收,就会调用finalize()

5 个答案:

答案 0 :(得分:6)

作为垃圾收集器删除对象的唯一真实方法是删除可用于访问它的所有引用。

Object o = new Object();
o = null; // at this point GC may remove the object.

要强制执行此过程,您可以尝试拨打System.gc()。但请记住,它不保证在此迭代的GC中您的对象将被真正删除。

答案 1 :(得分:4)

  

有没有垃圾收集对象的方法?

没有。

在“无法访问”之后,对象将(可能)被垃圾收集。可以通过调用System.gc()使垃圾收集器在特定时间运行。然而。允许JVM忽略您的System.gc()呼叫,并且在错误的时间运行GC会浪费资源。

实际上,调用System.gc()来回收单个对象可能效率低下,并且无论如何都不一定会回收它......即使它在那时是垃圾。


Java应用程序依赖于在特定时间进行垃圾回收的对象,或者在特定时间运行终结器时,这是错误的。如果您的应用程序设计为以这种方式工作,则应重新设计它。

答案 2 :(得分:3)

有一个方法System.gc();只向垃圾收集器提供提示到垃圾对象。但是,没有,你没有调用任何方法,并立即对象进行垃圾收集。

答案 3 :(得分:2)

您不应该依赖System.gc();图片。

以下示例将获取收集的对象垃圾。

bitmap.recycle(); 
bitmap = null;` 

注意:System.gc();会在某些设备上显着降低应用程序的速度。

答案 4 :(得分:1)

您可以查看this reply,其中显示了如何确保GC至少在使用来自jlibs的RuntimeUtil.gc()的堆的某个片段上运行:

   /**
    * This method guarantees that garbage collection is
    * done unlike <code>{@link System#gc()}</code>
    */
   public static void gc() {
     Object obj = new Object();
     WeakReference ref = new WeakReference<Object>(obj);
     obj = null;
     while(ref.get() != null) {
       System.gc();
     }
   }

您可以使用类似的技术将obj替换为您想要gc的对象的引用。

注意:如果GC从不运行并且收集新分配的对象,该方法将陷入无限循环。