这是一个非常快速和临时的错误修复程序..
它有效,但我希望找到更好的理解和解决方案.

这是生成泄漏的类构造函数

final transient  DataInputStream din;
final transient  DataOutputStream dout;
final transient  BufferedReader bin;
final transient  BufferedWriter bout;

NData(Socket sock0) throws IOException
    {
        sock=sock0;
        din= new DataInputStream(sock.getInputStream());
        dout = new DataOutputStream(sock.getOutputStream());
        bin = new BufferedReader(new InputStreamReader(din));
        bout = new BufferedWriter(new OutputStreamWriter(dout));
     //   .. 
    }

错误修复是更改它(删除最终),以便让我稍后分配null

transient  DataInputStream din;
transient  DataOutputStream dout;
transient  BufferedReader bin;
transient  BufferedWriter bout;

NData(Socket sock0) throws IOException
    {
        sock=sock0;
        din= new DataInputStream(sock.getInputStream());
        dout = new DataOutputStream(sock.getOutputStream());
        bin = new BufferedReader(new InputStreamReader(din));
        bout = new BufferedWriter(new OutputStreamWriter(dout));
     //   .. 
    } 

 //And to add a "magic" destructor

 void nuller() {
        din=null;
        dout=null;
        bin=null;
        bout=null;
    }

有一个finish方法结束了线程,关闭了流,所以我添加了“nuller”方法调用,内存泄漏消失了.


为什么在完成线程并关闭流后,它会继续在“byte []”中分配内存?
为什么GC不扔掉它? (除了那些带有空对齐的脏之外)

编辑:

正如卡萨布兰卡所说,也许NData对象仍在,
有一个

final static ConcurrentHashMap <String,NData>(); 

因此,将NData作为值,使用remove(key)从Map中清除对象,但是……似乎还不够.

从HashMap中删除唯一的对象引用是不足以删除对象?

解决方法:

Why after finished the thread and closed the stream, it keep allocating memory in “byte[]” ? Why GC don’t throw it away ?

只有在没有对该对象的引用时,GC才会“扔掉”某些内容.在您的情况下,这意味着某些东西仍然持有对NData对象的引用.通过手动调用你的nuller方法,你只需释放对成员变量的引用(din,dout等),但NData对象可能仍然存在.您需要查看其他地方以找出谁正在使用此对象并确保清除此引用.

更新:您究竟是如何得出内存泄漏的结论? GC仅定期运行,因此不保证立即释放对象.您可以尝试调用System.gc()来强制运行GC.此外,ConcurrentHashMap(我不熟悉)可能是缓存并发的引用,并且可能在调用remove后不会立即释放它们.

标签: java, null, final, garbage-collection, memory-leaks

相关文章推荐

添加新评论,含*的栏目为必填