2013-08-07 15 views
10

Per l'istruzione seguente in un programma, quanti oggetti verranno creati nella memoria heap e nel pool costante di stringhe?Ciclo di vita dell'oggetto in java e gestione della memoria?

Ho bisogno di chiarezza nella creazione di oggetti. Molte fonti che ho letto non stanno elaborando. Sono confuso quando l'oggetto viene distrutto.

String a="MAM"+"BCD"+"EFG"+"GFE"; 

Quanti oggetti verranno creati?

Sto cercando materiale valido sul ciclo di vita di oggetti, metodi e classi e su come la JVM li gestisce quando vengono modificati e modificati dinamicamente.

+0

Cosa ne pensi? –

+0

Qualcuno dovrebbe semplicemente eseguire 'javah' su di esso. Scommetto che mostrerebbe solo una costante. – Rekin

+0

fino a me solo uno ma molti amici in questa discussione mi ha confuso [link] (https://www.facebook.com/groups/java.for.developers/10151748401034501/?notif_t=group_comment_reply) – saikiran

risposta

3

Esattamente un oggetto viene creato e inserito nel pool costante, a meno che non esista già, nel qual caso viene utilizzato l'oggetto esistente. Il compilatore concatena le costanti di stringa insieme, come specificato in JLS 3.10.5 e 15.28.

Una stringa lunga letterale può sempre essere suddiviso in parti più brevi e scritto come espressione (possibilmente tra parentesi) utilizzando l'operatore di concatenazione di stringhe +

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5

6

Viene creato un solo oggetto.

string s1 = "java"; 
string s2 = "ja" + "va"; 
s.o.p(s1==s2); 

La dichiarazione risulta vera.

String s1="java"; 
string s2 = "ja"; 
String s3 = s2 +"va"; 
s.o.p(s1==s3); 

La dichiarazione produce false.

Quindi almeno un apparente deve essere permanente, quindi l'operatore '+' genera un nuovo oggetto stringa (nel pool non costante usando new()). Quindi, la domanda che hai chiesto non ne ha nemmeno una permanente. Ciò significa che crea un solo oggetto.

20

"MAM"+"BCD"+"EFG"+"GFE" è un tempo di compilazione espressione costante e si compila nel letterale stringa "MAMBCDEFGGFE". JVM creerà un'istanza di String da questo valore letterale durante il caricamento della classe contenente il codice sopra riportato e inserirà questo String nel pool di stringhe. Così String a = "MAM"+"BCD"+"EFG"+"GFE"; non crea alcun oggetto, vedere JLS 15.18.1. String Concatenation Operator +

L'oggetto String è appena creato (§12.5) a meno che l'espressione è una fase di compilazione espressione costante (§15.28).

Assegna semplicemente un riferimento all'oggetto String in pool alla variabile locale a.

+0

ho ottenuto il concetto ora grazie a @Evgeniy – saikiran

2

Un solo oggetto verrà creato poiché String a verrà compilato in "MAMBCDEFGGFE".

0

Le risposte che indicano un singolo oggetto heap nell'esempio sono corrette. Tuttavia, prendere in considerazione questo codice:

public class Tester 
{ 
    public String a="MAM"; 
    public String b ="BCD"; 
    public String c = "EFG"; 
    public String d ="GFE"; 

    public Tester() 
    { 
     String abcd = a + b + c + d; 
    } 
} 

In questo esempio, vengono create 7 stringhe. a, b, c e d non sono compilati in una singola costante: sono membri. Viene quindi creata una stringa per ciascun operatore + - semanticamente parlando, + è una concatenazione ma logicamente sta creando una nuova stringa in memoria.Le prime 2 stringhe di operatori vengono eliminate immediatamente e sono ora idonee per la garbage collection, ma il churn della memoria si verifica ancora.

Tecnicamente in un ottavo oggetto. L'istanza di Tester.

Edit: Questo è stato dimostrato di essere una sciocchezza nei commenti

+3

Il compilatore javac ha un'ottimizzazione: non ogni '+' genera una nuova stringa. Per prima cosa viene creato uno 'StringBuilder' interno, vengono aggiunti' a', 'b',' c', 'c' e quindi viene creato uno' String'. Questa ottimizzazione è in circolazione da oltre un decennio. Quindi il calcolo è 5 'String' e 5 associati' char [] ', 1' StringBuilder' più almeno un 'char []' associato - eventualmente più a causa del ridimensionamento dinamico. –

+0

Sono corretto! +1 – Gusdor

+0

vuoi dire che prima aggiungerai un + b e poi considererai un + b come una stringa e aggiungerai a c ?? non ti ho preso – saikiran

3

La maggior parte delle risposte sembrano concentrarsi che: a) l'espressione completa è volta che uno compilazione costante e b) che la linea stessa non costruisce un nuovo oggetto ma solo un riferimento a un oggetto.

Tuttavia finora nessuno ha menzionato che lo stesso String contiene un riferimento a un interno char[] (che è anche nel pool costante).

Sommario: Ci sono due oggetti nel pool costante (String e char[]). La linea non crea né distrugge alcun oggetto.

E per quanto riguarda:

Sono confuso quando l'oggetto viene distrutta.

Nessun oggetto viene distrutto, poiché elementi nel pool costante verranno distrutti solo se la classe stessa verrà scaricata. Al massimo si può dire che il riferimento a alla fine andrà alla fine.