It was a very fast and makeshift, bug fix..
It worked, but I would like to find a better understanding and solution.
This was the Class Constructor generating the leak
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));
// ..
}
The bug fix was to changed it (remove final) so that let me to assign null later
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;
}
There was a finish method that ended the thread, closes the streams, so I add there the “nuller” method call, and memory leak went away.
Why after finished the thread and closed the stream, it keep allocating memory in “byte[]” ?
Why GC don’t throw it away ? (except after that dirty with null asignment)
EDIT:
As casablanca says perhaps the NData object is still around,
there is a
final static ConcurrentHashMap <String,NData>();
so that have NData as values, A remove(key) is done to purge the object from the Map, but.. it seems not be enough.
Removing from a HashMap the only object reference won’t be enough to remove the object?
The GC will “throw” something away only when there are no more references to that object. In your case, this means that something is still holding a reference to the
NDataobject. By manually calling yournullermethod, you simply release the references to the member variables (din,doutetc.) but theNDataobject is probably still lying around. You need to look elsewhere to find out who is using this object and make sure that this reference is cleaned up.Update: How exactly did you come to the conclusion that there is a memory leak? The GC only runs periodically, so objects are not guaranteed to be freed immediately. You could try calling
System.gc()to force a GC run. Also,ConcurrentHashMap(which I’m not familiar with) might be caching references for concurrency and it’s possible that these aren’t freed immediately after callingremove.