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:
2.5.4 Obszar metody
Wirtualna maszyna Java ma obszar metod, który jest wspólny dla wszystkich wątków wirtualnej maszyny Java. Obszar metody jest analogiczny do obszaru przechowywania skompilowanego kodu konwencjonalnego języka lub analogiczny do segmentu „tekstowego” w procesie systemu operacyjnego. Przechowuje struktury dla poszczególnych klas, takie jak pula stałych w czasie wykonywania, dane pól i metod, a także kod metod i konstruktorów, w tym specjalne metody (§2.9) używane do inicjalizacji klas i instancji oraz inicjalizacji interfejsu.
Obszar metody jest tworzony podczas uruchamiania maszyny wirtualnej. Chociaż obszar metody jest logicznie częścią sterty, proste implementacje mogą zdecydować, że nie będzie go odśmiecać ani kompaktować. Ta wersja specyfikacji wirtualnej maszyny Java nie wymaga lokalizacji obszaru metody ani zasad używanych do zarządzania skompilowanym kodem. Obszar metody może mieć ustalony rozmiar lub może zostać rozszerzony zgodnie z wymaganiami obliczeń i może zostać skrócony, jeśli większy obszar metody stanie się niepotrzebny. Pamięć obszaru metody nie musi być ciągła.
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.