2012-07-04 110 views
28

我知道Java有自己的垃圾回收,但有时我想手动删除垃圾。有没有办法做这样的工作?考虑到我有很长或很长的function其中声明了许多变量,这是一个好主意,在使用后立即删除未使用的内存,而不是在函数结束时自动收集?如果我手动删除垃圾,会影响我的应用程序的速度吗?感谢您的帮助!在java中删除未使用的变量的内存

+1

这是一个好主意,使用后将变量设置为null。 HotSpot也会为你做到这一点,但不能100%保证。 –

回答

28

在java中没有直接和直接的方式来释放内存。您可以尝试说服垃圾收集器使用众所周知带走一些对象:

Object obj = new Object(); 
// use obj 
obj = null; 
System.gc(); 

,但是这将实际可用内存立即难保。

虽然这适用于堆内存,但堆栈分配的项只能在函数返回时释放。

+2

那里**是**保证GC将尽最大努力立即做某件事。 Javadoc:“**当控制从方法调用**返回时,Java虚拟机已尽最大努力从所有被丢弃的对象中回收空间。”目前还不能确定将要清理的内容。 –

4

你可以拨打System.gc();哪个可能引导垃圾收集器清理。但确定这会影响你的应用程序的性能。一般来说,尝试在这里“优化”任何东西都是没有意义的。

3

你可以给变量赋值null,验证没有任何对这些对象的引用并调用System.gc(),但这只是JVM调用GC的建议,但不能保证。垃圾收集会减慢应用程序的速度(停止世界GC)。

4

手动执行此操作并不值得,因为垃圾回收器通常会做得更好,而且自己做这件事不太可能会在应用程序中产生明显的差异。

如果您必须,您可以将变量引用设置为null,并调用System.gc(),这将手动调用垃圾回收器。

12

为什么要“手动”删除垃圾?如果是因为内存不足,请回想一下,在实际抛出OutOfMemoryError之前,Java将运行垃圾回收。如果你真的内存不足,那么即使你手动删除也没有垃圾。

声明一个变量不会在堆上分配内存。用new做一个对象呢。 JVM可以对甚至没有超出范围但在方法结束之前不再使用的GC对象引用进行转义分析。

如果您的意思是您主动想要在系统资源不重要的某个点释放内存,那么请使用更好的JVM调优,如使用并行GC算法。

如果仅仅因为您无谓地支付无效引用的成本,或者调用GC的次数超过所需的次数,通过将事物设置为null来“手动”垃圾收集可能会降低速度。

2

一个非常普遍的建议是使用System.gc()其中 JVM可能会选择忽略。您也可以使用范围,例如:

import java.io.*; 
public class AutoVariableTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String fileName = "test.txt"; 
     {// This is local block just to keep auto variable in check 
      File file = new File(fileName); // file is not visible outside the scope and is available for garbage collection 
      BufferedReader br = null; 

      try{ 
       br = new BufferedReader(new FileReader(file)); 
       // ... 
      }finally{ 
       if(br != null) 
        br.close(); 
      } 
     }// local block end 
    } 
} 
1

如果您尝试管理内存,Java并不适用!或者如果您有很多时间,则在JVM中编写自己的垃圾收集机制

1

如果您打算减少某个点后使用的内存量,最好使用数组作为变量,以便您可以设置一旦数组不再有必要时,该数组为null。这样,垃圾回收器清理所有数据的时间就会少很多。