2013-02-25 6 views
8

Che cosa succede se si esegue il seguente codice ..domande di memoria Java su 'nuovo' parola chiave

while (true) { 
    String x = new String("ABC"); 
} 

in termini di memoria?

La stringa x è allocata nello stack o nell'heap? Il programma finirà per bloccarsi a causa di un overflow di memoria, o la raccolta di dati inutili lo impedirà? La nuova parola chiave crea sempre l'oggetto sull'heap? Quando viene creato un oggetto nello stack?

Grazie!

+1

Si potrebbe voler guardare http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 –

+0

Ciao Rohan, per favore, una domanda alla volta. – MByD

+0

sono domande correlate, quindi li ho aggiunti insieme così io (e altri) posso ottenere una comprensione ampia di questo argomento! –

risposta

7

La stringa x è allocata nello stack o nell'heap?

x non è un String. È un riferimento a un String. Il riferimento è una variabile locale e quindi va in pila. Il String è un oggetto e quindi va sull'heap.

Sarà il programma eventualmente bloccarsi a causa di un overflow di memoria

non

Probabilmente.

oppure la raccolta dei dati inutili può impedirlo?

Dovrebbe.

La nuova parola chiave crea sempre l'oggetto nell'heap?

Sì.

Quando un oggetto viene creato nello stack?

Mai ... a meno che la JVM decida che non può uscire dall'ambito corrente e quindi decide di farlo.

+0

+1 Nice rispostessss con spiegazione. :) –

+1

Non completamente la mia area di competenza - ma non è in questo caso particolare una situazione in cui l'oggetto non può sfuggire l'ambito corrente e l'analisi di escape causa quindi l'allocazione della stringa nello stack? – mikera

+0

Sì, il programma non si arresterà in modo anomalo, ho continuato a eseguire questo snippet per molto tempo e il programma era ancora in esecuzione. Bella risposta!! (+1) – asifsid88

2

L'utilizzo di nuovo, sì, mette gli oggetti nello heap. Oggetti che non sono più accessibili da nessun thread possono essere raccolti. Che tu stia esaurendo la memoria o meno dipende dalla dimensione dei dati che il tuo programma usa, e se sei bravo a "liberare" oggetti non ne hai più bisogno (pensa: le perdite di memoria sono cattive).

Nel tuo esempio, gestirai il garbage collector come un matto, che credo sia ciò che intendi dimostrare.

Le variabili locali vanno in pila.

-1

In teoria, new crea sull'heap e gli oggetti non (ad esempio, int s, char s e così via) vengono creati nello stack. L'unica eccezione, afaik, sono le stringhe, create anche nello stack. In pratica, il compilatore JIT di molti JVM moderni vedrà che, in alcuni casi, gli oggetti creati con new possono essere creati nello stack (ad esempio, oggetti locali che non sono referenziati al di fuori della funzione corrente).

Il garbage collector si prenderà cura della deallocation per te, questo è il suo scopo, ma ovviamente puoi esaurire la memoria se crei e mantenga riferimenti su troppi oggetti contemporaneamente (prova a creare un elenco con un miliardi di stringhe, per esempio).

+0

Non ci sono eccezioni per le stringhe nello stack. – EJP