2011-12-13 74 views
0

是否有任何垃圾收集对象的方法?据我所知finalize()之前被调用,如果任何对象将被垃圾收集。在Java中垃圾收集对象的方法

+3

一般来说,这不是你应该试图做的事情,除非在极少数情况下,通常有更好的方法来解决问题。 –

回答

3

有一种方法System.gc();它只是给提示垃圾收集器垃圾对象。但是,不,没有任何方法可以调用,并立即收集垃圾。

6

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

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

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

+3

+1它不能保证你的对象在这个迭代的GC中真的被删除。 – Kent

+1

它也不保证在System.gc()被调用时实际运行垃圾回收。 – Bombe

4

是否有任何垃圾收集对象的方法?

没有没有。

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

事实上,呼吁System.gc()收回单个对象是可怕效率低,而且不一定会收回它无论如何,即使这是在这一点上的垃圾。


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

+0

嗨斯蒂芬,其实这个问题在一次采访中问我,当时我忘了System.gc(),我告诉他没有方法来垃圾对象。不管怎么说谢谢 – saloni

+0

好,你说得对,那么。 – Bombe

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从不运行并收集新分配的对象,该方法将陷入无限循环。

2

你不应该依靠System.gc();与图像。

以下示例将收集对象垃圾回收。

bitmap.recycle(); 
bitmap = null;` 

注:System.gc();明显减慢了应用上的一些设备。