Ich habe eine folgende Klasse
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);
}
}
Jetzt erstelle ich zwei Objekte vom Typ Student wie folgt
Student s1=new Student();
Student s2=new Student();
Nun werden zwei verschiedene Speichersätze für Instanzfelder zugewiesen. Jetzt ist meine Frage, ob Speicher für Methoden ( setResult
und displayResult
) zweimal oder einmal reserviert wird ?
Bitte sehen Sie sich die folgende Abbildung an und können Sie mir dabei helfen, zu sagen, welche Abbildung die richtigen Informationen enthält.
java
object-oriented
memory
jvm
Harish_N
quelle
quelle
Antworten:
Der Code für Methoden ist Teil von
Class
(genauer gesagtClass<Student>
) und wird beim ersten Laden der Klasse in den Speicher geladen.Das heißt, wenn Sie eine Methode ausführen, wird zusätzlicher Speicher verwendet, um Parameter, lokale Variablen, temporäre Ausdrucksergebnisse, Rückgabewerte usw. zu speichern. Dieser Speicher wird jedoch im Stack zugewiesen (der beim Erstellen einer neuen Instanz verwendete Speicher wird im Heap zugewiesen) .
Gemäß Ihrer Frage sollte jetzt klar sein, dass Abbildung B korrekt ist (obwohl es nicht widerspiegelt, was passiert, wenn Sie die Methode tatsächlich aufrufen).
quelle
Instanzfelder (einschließlich Eigenschafts-Hintergrundfelder) erhalten N-Kopien für N-Objekte.
Statische Felder erhalten eine einzelne Kopie pro Klasse.
Methoden sind Bytecode-Blöcke (oder nach JIT Blöcke nativer Anweisungen), die Teil des Programms "image" oder des ausführbaren Codesegments sind. Methoden sind bereits Teil des Programmimages, da es sich auf der Festplatte befindet. Sobald das Image vom Betriebssystem (oder CLR) geladen wurde, gibt es eine einzige gemeinsam genutzte Kopie des Methodencodes.
Sie sind im Allgemeinen kein Teil der Heap- oder Laufzeitzuweisung, außer in Fällen, in denen Sie den hostfähigen Compiler verwenden können, um neue Methoden im laufenden Betrieb zu kompilieren. Methoden werden nicht wie Objekte "zugewiesen" und sie werden nicht im Verhältnis zur Objekterstellung "zugewiesen". Sie existieren lediglich als Teil des Programms, bevor ein einzelnes Objekt jemals instanziiert wird. Selbst Lambdas / Delegierte werden nicht im laufenden Betrieb zugeteilt. Der Compiler erstellt bei Bedarf Klassen, um diese anderen scheinbar dynamischen Codeobjekte zu implementieren, und sie sind auch als Teil des Bytecode-Image auf der Festplatte vorhanden.
UPDATES per Kommentare:
Der JVM-Standard hat Folgendes zu sagen:
Es ist also klar, dass (1) ja die Spezifikation nicht vorschreibt, wie dies getan wird, aber (2) es ist analog zum Speicherbereich für kompilierten Code einer herkömmlichen Sprache, dh. das Textsegment. Das ist der Punkt, den ich mache.
quelle
Objekt im Heap-Speicher zugewiesen. Wenn Objekt zugewiesen wird, wird der Steckplatz für alle Instanzvariablen erstellt und zerstört, wenn das Objekt zerstört wird. So wird Instanzvariable auch im Heap-Speicher zugewiesen Methode aufgerufen werden.
quelle