Purtroppo, senza vedere il tuo codice (quanto hai postato non è sufficiente né utile) non potrei nemmeno tirare ad indovinare.
Un oggetto è "raggiungibile" se è possibile tracciare un cammino (anche indiretto, attraverso altri oggetti) verso l'oggetto partendo da un certo ben preciso insieme di "radici". Questo insieme di radici è composto principalmente da tutti i campi reference "di classe" (static) presenti nelle classi caricate e da tutti i reference presenti negli stack frame degli stack dei "live" thread (ogni thread ha un suo proprio stack). C'è sicuramente anche dell'altro (ad esempio legato a JNI) ma dovresti vedere libri/siti specifici, perché qui andiamo su argomenti davvero "fini" e che non ricordo perfettamente.
Se il garbage collector può tracciare questo cammino, allora l'oggetto è raggiungibile e non può assolutamente essere toccato né collezionato dal g.c. ... nemmeno per sogno.
Il principio di raggiungibilità non è da confondere con il fatto che un oggetto è semplicemente e banalmente "referenziato". Due oggetti posso referenziarsi a vicenda tra di loro e non essere raggiungibili. In questo caso il g.c. (tutte le implementazioni moderne, ormai da tanti anni) è perfettamente in grado di collezionarli e liberare la memoria per entrambi.
Riguardo i "distruttori", ripeto che in Java non c'è espressamente questo concetto. In C++ un distruttore è una funzione membro della classe che viene invocato automaticamente quando l'oggetto viene rilasciato (esplicitamente tramite delete su un puntatore o perché la variabile che tiene l'oggetto termina la sua esistenza, ad esempio).
In Java non c'è proprio un equivalente. Esiste un finalize() (originariamente in java.lang.Object) ma qualunque libro valido e serio su Java ti dirà che è più critico da gestire, su cui non fare affidamento più di tanto e quindi generalmente da ignorare.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet