Mam następującą klasę
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);
}
}
Teraz tworzę dwa obiekty typu Student w następujący sposób
Student s1=new Student();
Student s2=new Student();
Teraz przydzielono dwa różne zestawy pamięci dla pól instancji. Teraz moje pytanie brzmi: czy pamięć jest przydzielana na metody ( setResult
i displayResult
) dwa razy czy raz?
Proszę zobaczyć poniższy rysunek i czy możesz mi pomóc powiedzieć, który rysunek zawiera prawidłowe informacje.
java
object-oriented
memory
jvm
Harish_N
źródło
źródło
Odpowiedzi:
Kod metod jest częścią
Class
(bardziej zwięźleClass<Student>
) i jest ładowany do pamięci, gdy klasa jest ładowana po raz pierwszy.To powiedziawszy, kiedy wykonasz jakąkolwiek metodę, używana jest dodatkowa pamięć, aby przydzielić pamięć do parametrów, zmiennych lokalnych, wyników wyrażeń tymczasowych, wartości zwracanych i tak dalej. Ale taka pamięć jest przydzielana na stosie (pamięć używana podczas tworzenia nowej instancji jest przydzielana na stercie .
Zgodnie z twoim pytaniem, powinno być teraz jasne, że liczba B jest poprawna (chociaż nie odzwierciedla tego, co dzieje się, gdy faktycznie wywołujesz metodę).
źródło
Pola instancji (w tym pola kopii właściwości) otrzymują N-kopii dla N-obiektów.
Pola statyczne otrzymują po jednej kopii na klasę.
Metody to bloki kodu bajtowego (lub po JIT bloki instrukcji natywnych), które są częścią „obrazu” programu lub segmentu kodu wykonywalnego. Metody są już częścią obrazu programu, ponieważ znajduje się on na dysku. Po załadowaniu obrazu przez system operacyjny (lub CLR) istnieje jedna wspólna kopia kodu metody.
Nie są one częścią alokacji „sterty” ani środowiska wykonawczego, z wyjątkiem przypadków, w których można użyć kompilatora hostowalnego do kompilacji nowych metod w locie. Metody nie są „przydzielane” jak obiekty i nie są „przydzielane” w stosunku do tworzenia obiektu. Istnieją jedynie jako część programu, zanim zostanie utworzony instancja jednego obiektu. Nawet lambdas / delegaci nie są przydzielani na bieżąco. Kompilator tworzy klasy na żądanie, aby zaimplementować te pozornie dynamiczne obiekty kodu, a także istnieją jako część obrazu kodu bajtowego na dysku.
AKTUALIZACJE dla komentarzy:
Standard JVM ma to do powiedzenia:
Jest więc jasne, że (1) tak specyfikacja nie określa, jak to się robi, ale (2) jest analogiczna do obszaru przechowywania skompilowanego kodu konwencjonalnego języka, tj. segment tekstowy. Właśnie o to mi chodzi.
źródło
obiekt alokowany w pamięci sterty. gdy obiekt jest alokowany, miejsce na wszystkie zmienne instancji jest tworzone i niszczone, gdy obiekt jest niszczony, więc zmienna instancji jest również alokowana w pamięci sterty, a zmienna lokalna jest tworzona na stosie w momencie, gdy są wywoływane metody.
źródło