I metodi statici sono solo metodi, non sono memorizzati nell'heap, semplicemente non utilizzano un parametro "questo".
Le variabili statiche fungono da "radici" del GC. Di conseguenza, a meno che tu non li imposti esplicitamente a null, vivranno finché il programma vive, e così è tutto raggiungibile da loro.
Una situazione è considerata una perdita di memoria solo se si intende che la memoria diventi libera e non diventi libera. Se si intende che la variabile statica contenga un riferimento a un oggetto per una parte del tempo e si dimentichi di impostarlo su null quando si è finito con quell'oggetto, si rischia di provocare una perdita. Tuttavia, se lo si inserisce nella variabile statica e si prevede che esso rimanga lì per tutto il tempo in cui il programma è in esecuzione, allora non è sicuramente una perdita, è più probabile un "singleton permanente". Se l'oggetto è stato recuperato mentre volevi che esistesse ancora, sarebbe stato molto brutto.
Come per la domanda sull'heap: Tutti gli oggetti in Java esistono nell'heap o nello stack. Gli oggetti vengono creati sullo heap con il nuovo operatore. Un riferimento è quindi allegato a loro. Se il riferimento diventa nullo o non rientra nell'ambito (ad esempio, la fine del blocco), il GC si rende conto che non c'è modo di raggiungere quell'oggetto mai più e lo reclama. Se il riferimento è in una variabile statica, non rientra mai nell'ambito ma è comunque possibile impostarlo su null o su un altro oggetto.
IIRC i campi statici saranno GCed non appena la classe che li dichiara è GCed.Se l'istanza elast della classe è sparita, la dichiarazione di classe andrà e i campi statici con esso. – ordnungswidrig
Non sono sicuro che @ o11rig sia completamente preciso, ma credo che il GC sia autorizzato a raccogliere le statiche per le classi che non hanno membri in determinate circostanze. L'ho sentito da un paio di fonti, ma non ho mai sentito una spiegazione esatta. –
Debole cavillo: tutti gli oggetti Java * * vivono nell'heap. Oggetti * riferimenti * e primitive possono essere memorizzati nello stack se sono locals del metodo attualmente in esecuzione e vengono memorizzati nell'heap in altro modo. (Tranne che in qualsiasi JVM moderna con JIT, dove l'ottimizzatore del JIT può mettere gli oggetti dove vuole, purché * agisca * come gli oggetti siano sullo heap.) E si potrebbe sostenere che i metodi statici - o , almeno, il bytecode Java che li implementa - vive anche nell'heap, come parte dell'oggetto Class che rappresenta la classe in cui sono stati definiti. –