środa, września 23, 2020

Magia w Java'ie ;-)

Jaki jest maksymalny rozmiar tablicy w Java'ie? ;-)

Niby wydaje się, że ma to coś z int wspólnego, ale nie będzie to pełny zakres int, bo w Java'ie int jest signed, więc Integer.MAX_VALUE wydaje się być rozsądnym kandydatem...

Ale jak wrzucimy kod w stylu:

var array = new int[Integer.MAX_VALUE];

To poleci nam:

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit

nawet gdy uruchomimy JVM z odpowiednim zapasem RAM (8GB, a testowałem z 24GB dla pewności ;-)).

Podobnie:

var array = new int[Integer.MAX_VALUE-1];

wyrzuci taki sam wyjątek.

Ale już:

var array = new int[Integer.MAX_VALUE-2];

zadziała :-)

Przyznam, że próbowałem kiedyś dotrzeć w źródłach JVM do miejsca gdzie to jest zakodowane, a dokładniej gdzie widać skąd to magiczne 2.... ale sam limit chyba znalazłem, ale nie pamiętam powodu.

No chyba, że po prostu te 8 bajtów jest na długość albo opis obiektu? 

Chyba mam coś do poszukania :-)




Podobne postybeta
Android - nawet platofrma potrafi przeciwko Tobie knuć ;-)
Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)
Distinct (albo unique) w JavaScript
Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)
Distinct w JavaScript #2

Brak komentarzy:

Publikowanie komentarza