2017-02-22 133 views
-1

在下面的最小代码中可以看到,我想在JAVA对象完成时,测试变量中分配的对象将被分配。我可以做些什么来取消分配这个对象? 我用nullsystem.gc,但它们不能解除分配对象。如何在java中释放分配的对象?

package chatclient; 
/** 
* 
* @author root 
*/ 
import java.io.IOException; 


public class ChatClient { 
    private void run() throws IOException { 
     long test[]=new long[10000000]; 
     test[10000]=100; 
     // Process all messages from server, according to the protocol. 
     test=null; 
     System.gc(); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     super.finalize(); //To change body of generated methods, choose Tools | Templates. 
    } 

    /** 
    * Runs the client as an application with a closeable frame. 
    */ 
    public static void main(String[] args) throws Exception { 
     while(true){ 
      ChatClient client = new ChatClient(); 
      client.run(); 
     } 
    } 
} 
+1

你不能,明确。 –

+2

为了澄清上述评论:[阅读此问题](http://stackoverflow.com/questions/66540/when-does-system-gc-do-anything)。基本上,'System.gc()'调用仅仅是JVM的一个暗示,也许,如果它觉得它可能会运行垃圾收集。虽然没有压力。 – Phylogenesis

+0

请**编辑**问题以说明您的意思是“不工作”。你在看什么让你相信对象没有被“释放”?由于“免费”是一个C概念,你在这里意味着什么? – slim

回答

2

Java是一种垃圾回收语言。它没有提供明确释放内存的方法。相反,如果无法访问某个对象,则该对象将成为Garbage Collection的候选对象,并且在运行时的GC算法确定其需要空间时将被删除。

现代版本的Java中的GC算法非常复杂,性能高。但是,当内存使用量未达到配置的限制时,它不会从堆中删除对象是很正常的。

这对程序员来说是一大福音 - 大多数时候你根本不需要担心内存管理。但是,如果您在非常紧张的内存环境中运行,Java可能不适合您。