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?