Это было очень быстро и самодельно, исправление ошибки ..
Это сработало, но я хотел бы найти лучшее понимание и решение.
Это был конструктор классов, генерирующий утечку
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));
// ..
}
Исправление ошибки состояло в том, чтобы изменить его (удалить финал), чтобы позволить мне позже присвоить ноль
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;
}
Был метод финиша, который завершил поток, закрыл потоки, поэтому я добавил туда вызов метода "nuller", и утечка памяти ушла.
Почему после завершения потока и закрытия потока он продолжает выделять память в "byte []"?
Почему GC не выбрасывает это? (кроме как после этого грязного с нулевым присвоением)
EDIT:
Как Касабланка говорит, что, возможно, объект NData все еще существует,
есть
final static ConcurrentHashMap <String,NData>();
для того, чтобы в качестве значений были указаны NData, выполняется удаление (ключ), чтобы удалить объект с карты, но ... этого недостаточно.
Удаление из HashMap единственной ссылки на объект будет недостаточно для удаления объекта?