Tak na pierwsze pytanie i nie na drugie pytanie; to maszyna wirtualna. Twoje problemy są prawdopodobnie związane z nieokreślonymi zmianami w implementacji biblioteki pomiędzy wersjami. Chociaż może to być, powiedzmy, stan wyścigu.
Maszyna wirtualna musi przejść przez kilka przeszkód. W szczególności odwołania są traktowane w plikach klas tak, jakby zajmowały tyle samo miejsca co int
s na stosie. double
i long
zajmij dwa sloty referencyjne. Na przykład pola, istnieje pewna rearanżacja, przez którą zwykle przechodzi VM. Wszystko to odbywa się (względnie) przejrzyście.
Również niektóre 64-bitowe maszyny JVM używają „skompresowanych błędów”. Ponieważ dane są wyrównane co około 8 lub 16 bajtów, trzy lub cztery bity adresu są bezużyteczne (chociaż w przypadku niektórych algorytmów może zostać skradziony bit „znacznika”). Dzięki temu 32-bitowe dane adresowe (a zatem wykorzystujące o połowę mniej przepustowości, a tym samym szybsze) mogą używać rozmiarów sterty 35- lub 36-bitowych na platformie 64-bitowej.