2010-01-12 7 views

risposta

29

Gli oggetti hanno riferimenti ad altri oggetti che possono a loro volta avere riferimenti a più oggetti incluso l'oggetto di partenza. Questo crea un grafico di oggetti, utile nelle analisi di raggiungibilità. Ad esempio, se l'oggetto di partenza è raggiungibile (diciamo che si trova nello stack locale di un thread), tutti gli oggetti nel grafico sono raggiungibili e un garbage collector esatto non può raccogliere nessuno di questi oggetti. Allo stesso modo, partendo da un insieme di oggetti live (radici) se creiamo un elenco di tutti gli oggetti raggiungibili, tutti gli altri oggetti sono garbage - fair game per la raccolta.

+1

Re "not all": Penso che tutti gli oggetti abbiano riferimenti ad altri oggetti, per lo meno un riferimento alla loro classe. – Thilo

+0

@Thilo: buon punto. Ho rimosso "non tutti". –

+0

forse i primitivi tipi di array non ... – Thilo

5

grafico oggetto è fondamentalmente un grafico delle dipendenze tra oggetti

Esso è utilizzato per determinare quali oggetti sono raggiungibili e quali no, in modo che tutti gli oggetti non raggiungibili potrebbe essere fatto per la garbage collection.

+0

perché qualcuno dovrebbe dare una risposta a questa risposta :) –

+0

Non so. Ero incline al downvote perché hai descritto il grafico di raggiungibilità come un grafico di dipendenza :-) –

14

Un 'Object Graph' è la concettualizzazione di tutte le istanze degli oggetti dal modello a oggetti (le classi nel programma) e le loro interconnessioni.

Prendiamo ad esempio:

si hanno due classi

Class Foo 
{ 
    String aString = "foo"; 
    Bar aBar; 
} 

Class Bar 
{ 
    String aString = "boo"; 
} 

Se si dovesse creare un'istanza, Foo myFoo e quindi creare un'istanza di Bar myBar, e collegarli, myFoo.aBar = myBar;, il grafico oggetto sarebbe consiste in una singola istanza di Foo con un riferimento a una singola istanza di Bar.

Il garbage collector utilizza essenzialmente il grafico dell'oggetto per determinare quali istanze in memoria sono ancora collegate a qualcosa ed eventualmente necessarie al programma e quali istanze non sono più accessibili e pertanto possono essere eliminate.


Qualcuno su wikipedia lo mette più eloquente di me:

applicazioni orientate agli oggetti contengono complesso reti di oggetti interconnessi. Gli oggetti sono collegati tra loro da un oggetto che possiede o contiene un altro oggetto o con un riferimento in un altro oggetto. Questa rete di oggetti è denominata un oggetto grafico ed è la struttura più astratta che può essere utilizzata per discutere lo stato dell'applicazione.

6

Ciò di cui stiamo parlando è la nozione matematica di un grafico diretto costituito da nodi e spigoli che collegano i nodi. Un oggetto grafico è un grafico i cui nodi sono oggetti e i cui bordi sono relazioni di interesse tra gli oggetti.

Nel caso del garbage collector Java, il grafico dell'oggetto di interesse è il grafico degli oggetti raggiungibili. In questo grafico, i nodi sono oggetti Java e i bordi sono riferimenti espliciti o impliciti che consentono a un programma in esecuzione di "raggiungere" altri oggetti da un dato. (Ad esempio di un riferimento implicito, c'è un riferimento implicito da un oggetto al suo oggetto Class, e quindi agli oggetti heap che contengono le classi statics e il suo codice ... ma sto divagando.)

Come ha spiegato @Chandra Patni, la raccolta di dati inutili attraversa il grafico di raggiungibilità costituito da tutti gli oggetti raggiungibili da una serie di punti di partenza; il "root set" nella terminologia GC. Qualsiasi oggetto che non si trova in questo attraversamento grafico non può più influenzare il calcolo ed è quindi idoneo per essere raccolto.

0

Come sappiamo, gli oggetti sono esempi di una classe. Un oggetto può avere un riferimento all'altro oggetto (uso di Puntatori per l'indirizzamento). Anche questi oggetti possono avere un riferimento a un altro oggetto e così via che portano a riferimenti di Gerarchia di Oggetti.

Questo è un Oggetto grafico.

0

Il grafico oggetto è una rete di istanze di classi della nostra applicazione/software attualmente esistenti in memoria.

Istruzioni per vedere l'immagine: http://blog.ploeh.dk/content/binary/Windows-Live-Writer/Compose-object-graphs-with-confidence_921A/Tree_1.png

Può essere una lunga catena di oggetti per un breve grafico un oggetto anche. E.g .: diciamo che abbiamo classi come PetDog, Owner, PetKennel in un'applicazione. Ora PetDog ha il proprietario, il proprietario ha uno o più PetDog, PetDog è formato da un PetKennel e un PetKennel allena molti PedDog. Ora, sull'implementazione di queste relazioni in Object Oriented Approach, un proprietario (diciamo che: un'istanza/oggetto della classe Owner) potrebbe fare riferimento (collegamento a) a molte istanze di PetDog (se si hanno molti altri cani si fa riferimento a un solo PetDog) , ancora una volta PetDog fa riferimento alla sua particolare istanza/oggetto proprietario (che si trova nella tua custodia per cani, a cui John farà riferimento (collegato al suo cane), potresti aver comprato un cane da un altro canile (dove i cani sono addestrato e venduto anche) quindi ciascuna delle istanze/riferimenti oggetti/PetDog collegati ai loro specifici club di allevamento. Ciò crea una complessa rete di oggetti correlati l'uno con l'altro.

Se vi capita di rappresentare ogni istanza/oggetto (ogni oggetto di PetDog, Proprietario, PetKennel) come cerchio/quadrato (o qualsiasi forma) nella vostra nota/libro di disegno e disegnare freccia o linee per rappresentare l'oggetto è collegato (referencing) con cui oggetto quindi si crea un grafo di oggetto.

A volte accade che quando si eliminano o si modificano i collegamenti tra quelle istanze di una classe, alcune istanze potrebbero non essere referenziate (collegate) a qualsiasi altra istanza che verrà rimossa dal Garbage Collector.

Problemi correlati