Quando creo un oggetto, la memoria nuova è assegnata a entrambi i campi e metodi dell'istanza o solo ai campi dell'istanza

13

Ho una classe seguente

class Student{

int rollNumber;
int marks;

public void setResult(int rollNumber, int marks){

    this.rollNumber=rollNumber;
    this.marks=marks;   
}

public void displayResult(){

    System.out.println("Roll Number= "+this.rollNumber+"   Marks= "+this.marks);

}
}

Ora creo due oggetti di tipo Student come segue

Student s1=new Student();
Student s2=new Student();

Ora sono allocati due diversi set di memoria per i campi di istanza. Ora la mia domanda è se la memoria è allocata per i metodi ( setResult e displayResult ) due volte o una volta?

Vedi la figura seguente e puoi aiutarmi a dire quale cifra fornisce informazioni corrette.

    
posta Harish_N 18.09.2014 - 18:56
fonte

3 risposte

12

Il codice per i metodi fa parte di Class (più concisamente, Class<Student> ) e viene caricato in memoria quando la classe viene caricata per la prima volta.

Detto questo, quando si esegue qualsiasi metodo viene utilizzata memoria aggiuntiva, per allocare memoria a parametri, variabili locali, risultati di espressioni temporanee, valori di ritorno e così via. Ma tale memoria è allocata in lo stack (la memoria utilizzata durante la creazione di una nuova istanza viene allocata in l'heap .

Come da tua domanda, dovrebbe essere chiaro ora che la figura B è corretta (anche se non riflette ciò che accade quando in realtà si chiama il metodo).

    
risposta data 18.09.2014 - 19:03
fonte
6

I campi di istanza (compresi i campi di proprietà) ottengono N copie per N oggetti.

I campi statici ottengono una singola copia per classe.

I metodi sono blocchi di bytecode (o dopo JIT, blocchi di istruzioni native) che fanno parte del programma "immagine" o segmento di codice eseguibile. I metodi sono già parte dell'immagine del programma mentre si trova sul disco. Una volta che l'immagine viene caricata dal sistema operativo (o CLR), c'è una singola copia condivisa del codice del metodo.

Non fanno parte di "heap" o allocazione di runtime in generale, tranne nei casi in cui è possibile utilizzare il compilatore hostable per compilare nuovi metodi al volo. I metodi non vengono "allocati" come oggetti e non sono "allocati" rispetto alla creazione dell'oggetto. Esse semplicemente come parte del programma prima che un singolo oggetto sia mai istanziato. Anche i lambda / i delegati non sono assegnati al volo. Il compilatore crea classi on-demand per implementare questi altri oggetti di codice apparentemente dinamici e esistono anche come parte dell'immagine bytecode sul disco.

AGGIORNAMENTI per commenti:

Lo standard JVM ha questo da dire:

2.5.4. Method Area

The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization.

The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. This version of the Java Virtual Machine specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous.

Quindi è chiaro che (1) sì le specifiche non dettano come ciò viene fatto, ma (2) è analogo all'area di memoria per il codice compilato di un linguaggio convenzionale, es. il segmento di testo. Questo è il punto che sto facendo.

    
risposta data 18.09.2014 - 19:58
fonte
-4

oggetto allocato nella memoria heap.quando l'oggetto viene allocato, lo slot per tutte le variabili di istanza viene creato e distrutto quando l'oggetto viene distrutto. Anche la variabile d'istanza viene allocata nella memoria heap.E la variabile locale viene creata nello stack al tempo in cui viene chiamato il metodo.

    
risposta data 17.02.2016 - 18:30
fonte

Leggi altre domande sui tag