Domanda

Sono un programmatore C ++ attualmente cercando di lavorare su Java. Lavorando su C ++ Ho un abitudine di tenere traccia delle allocazioni di memoria dinamica e che impiegano varie tecniche come RAII alla perdita di memoria evitare. Java come sappiamo fornisce un Garbage Collector (GC) per prendersi cura della memoria leaks.So mentre programing in Java dovrebbe uno solo lasciar andare tutte le preoccupazioni genuini della memoria heap e lasciare per GC di prendersi cura delle perdite di memoria o si dovrebbe avere un approccio simile a quello durante la programmazione di lingue senza GC, cercare di prendere la cura della memoria si alloca e lasciare GC prendersi cura di quelli che si potrebbe perdere. Quale dovrebbe essere l'approccio? Quali sono gli svantaggi di entrambi?

È stato utile?

Soluzione

Non sono sicuro di cosa si intende per cercare di prendersi cura della memoria si alloca in presenza di un GC, ma ci proverò un po 'di lettura della mente.

In sostanza, non si deve "preoccupazione" circa la memoria di essere raccolti. Se non si fa riferimento a più oggetti, essi saranno prelevati. perdite di memoria logici sono ancora possibili se si crea una situazione in cui gli oggetti si fa riferimento per il resto del programma (ad esempio: registrare gli ascoltatori e non li annullare la registrazione, ad esempio: l'attuazione di un vettore simile collezione che non impostare le voci di null quando la rimozione di elementi fuori alla fine).

Tuttavia, se si dispone di un forte background Raii, sarete delusi di sapere che non v'è alcun equivalente diretto in Java. Il GC è uno strumento di prima classe per fare con la memoria, ma non non è garantita quando (o anche se) sono chiamati finalizzatori. Ciò significa che il trattamento di prima classe applicato alla memoria è non applicato a qualsiasi altra risorsa, come ad esempio:. Finestre, le connessioni al database, prese, file, primitive di sincronizzazione, ecc

Altri suggerimenti

Con Java e .net (e immagino, più altre lingue GC'ed), non è necessario preoccuparsi molto di memoria heap a tutti. Quello che do necessità di preoccuparsi, è risorse autoctone come handle di file, prese, primitive GUI come font e così via. Coloro che in genere bisogno di essere "disposto", che rilascia le risorse autoctone. (Spesso si dispongono sulla finalizzazione in ogni caso, ma è un po 'incerto a ripiegare su questo. Roba Dispose te stesso.)

Con un GC, è necessario:

  • ancora prendersi cura correttamente rilasciare risorse non di memoria come handle di file e connessioni DB.
  • assicurarsi di non tenere i riferimenti a oggetti che non ti servono più (come il loro mantenimento in collezioni). Perché se lo fai, si dispone di una perdita di memoria.

Oltre a questo, è non possono davvero "prendersi cura della memoria si alloca", e cercando di farlo sarebbe uno spreco di tempo.

Tecnicamente non c'è bisogno di preoccuparsi di pulizia dopo le allocazioni di memoria dal momento che tutti gli oggetti siano correttamente riferimento contati e il GC si prenderà cura di tutto. In pratica, un GC iperattiva avrà un impatto negativo sulle prestazioni. Così, mentre Java non ha un operatore di delete, si farà bene a oggetti di riutilizzo, per quanto possibile.

Anche Java non ha i distruttori poiché gli oggetti esisteranno fino a quando il GC arriva a loro ,. Java ha quindi il costrutto finally che si dovrebbe usare per assicurare che tutte le risorse correlate non-memoria (file prese, ecc) sono chiuse quando si è finito con loro. Non fare affidamento sul metodo finalise di fare questo per voi.

In Java il GC si prende cura di allocazione di memoria e liberare la memoria inutilizzata. Questo non significa che è possibile ignorare il problema alltogether.

Gli oggetti Java libera GC che hanno non sono riferiti dalla radice. Ciò significa che Java può ancora avere perdite di memoria se non si è attenti a rimuovere i riferimenti da contesti globali come le cache in HashMaps globali, ecc.

Se uno qualsiasi insieme di oggetti che fanno riferimento vicenda, non si fa riferimento alla radice, il GC Java liberarli. Cioè non funziona con i conteggi di riferimento, in modo da non dovete null tutti i riferimenti agli oggetti (anche se alcuni stili di codifica preferiscono eliminare i riferimenti come sonn in quanto non sono più necessari.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top