Prima di tutto, ricorda che non è possibile garantire che la finalizzazione venga eseguita per tutti gli oggetti. È possibile utilizzarlo per liberare la memoria allocata nel codice nativo associato a un oggetto, ma per il puro codice Java la maggior parte dei casi d'uso serve solo a eseguire un meccanismo di "backup" per ripulire le risorse. Ciò significa che nella maggior parte dei casi dovresti liberare le risorse manualmente ei finalizzatori potrebbero agire solo come una sorta di aiuto da ripulire se ti dimentichi di farlo nel modo standard. Tuttavia, non è possibile utilizzarli come unico o principale meccanismo di pulizia. Ancora più in generale, non dovresti scrivere alcun codice la cui correttezza dipenda dai finalizzatori in esecuzione.
Annuncio 1.Per quanto ne so, non ci sono garanzie su ciò che chiama thread finalize()
, anche se in pratica questo sarà probabilmente uno dei thread GC.
Annuncio 2. L'istanziazione di nuovi oggetti è consentita. Tuttavia, ci sono una serie di problemi con la gestione dei riferimenti agli oggetti nei finalizzatori. In particolare, se si memorizza un riferimento hard all'oggetto finalizzato in alcuni oggetti live, è possibile impedire che l'oggetto about-to-be-garbage-gather venga ripulito. Questo tipo di resurrezione di oggetti può portare all'esaurimento delle risorse se diventa fuori controllo. Inoltre, fai attenzione alle eccezioni in finalize()
- potrebbero interrompere la finalizzazione, ma non c'è modo automatico per il tuo programma di apprenderle. È necessario avvolgere il codice nei blocchi try-catch e propagare le informazioni da soli. Inoltre, il tempo di esecuzione lungo dei finalizzatori può causare la coda degli oggetti da creare e consumare molta memoria. Alcuni altri problemi e limitazioni degni di nota sono descritti in this JavaWorld article.
Ad 3. Non ci dovrebbero essere problemi con la chiamata di metodi statici dai finalizzatori.
Ad 4. Come accennato al punto 2, è possibile impedire che un oggetto venga sottoposto a garbage collection (per resuscitarlo) ponendo un riferimento ad esso in un altro oggetto live durante la finalizzazione. Tuttavia, questo è un comportamento complicato e probabilmente non una buona pratica.
Per riassumere, non è possibile fare affidamento sui finalizzatori per ripulire le risorse. È necessario gestirlo manualmente e i finalizzatori nel tuo caso potrebbero essere utilizzati al meglio come meccanismo di backup per coprire dopo una codifica scadente in un certo grado. Questo significa, sfortunatamente, che la tua idea di rendere l'API più carina usando i finalizzatori per ripulire le risorse OpenGL probabilmente non funzionerà.
fonte
2012-03-04 17:23:18
Questa non è una risposta diretta alla tua domanda, ma sappi che finalizzare non è garantito che venga mai chiamato, il che è uno dei tanti motivi per cui non viene usato pesantemente. (EDIT: e anche se lo fosse, verrà chiamato a causa della pressione della memoria nella memoria gestita da Java. Ciò significa che se stai cercando di usarlo per liberare altre risorse, allora potresti esaurirle e il tuo programma si arresta in modo anomalo anche se la pulitura potrebbe recuperarli tutti, solo perché Java non sa che l'esecuzione del GC riacquisirà (ad es.) i file handle). – jacobm