Przejdź do głównej zawartości

2 posty z tagiem "jvm"

Wyświetl wszystkie tagi

· 14 min aby przeczytać
Bartek Jabłoński

W skrócie

  • Każdy obiekt ma narzut pamięci (metadane) (12-16 bajtów na metadane - referencja, headery + pamięć na dane).
  • Procesory (CPU) mogą być 32 bitowe (4 byte - maxymalnie 4 GB pamięci RAM) lub 64 bitowe (8 byte). To oznacza tyle, że CPU ma dostęp do tyłu adresów ile można zapisać w 4 lub 8 bytach. Dodatkowo CPU pobiera paczkami dane z RAM po 8 bytów naraz.
  • Padding - wyrównanie do 8 bajtów - czyli obiekty zajmują pamięć równą wielokrotności 8 bajtów. Można to zwiększyć bo ogranicza to użycie maksymalnego heapa na poziomie 32 GB.
  • Referencja zajmuje 4 (32bit CPU lub 64bit CPU z Compressed References (default)) lub 8 bajtów (64bit CPU).
    • Maksymalny heap dla Compressed References = 32 GB - wykorzystanie przesunięcia bitowego o 3 miejsca ze względu na to że zapis 8 byte zawsze po prawej stronie ma trzy zera. (8 byte bo jest wyrównanie do 8 bytów). Dlatego możemy użyć 32 GB heapa zamiast 4 GB.
    • Gdy używamy 64bit CPU z Compressed References i zwiększymy Pamięć heapa powyżej 32 GB możemy mieć problemy z aplikacją i znaczący wzrost zajmowanego heapa ze względu na zmianę pamięci referencji z 4 bytes do 8 bytes - np. zmiana z -Xmx31g do -Xmx33g może spowodować wzrost zajęcia danych o 40% (w zależności od danych)

· 7 min aby przeczytać
Bartek Jabłoński

W skrócie:

  • Na pamięć obiektu String składa się 24 byte na metadane + ilość znaków razy 1 byte lub 2 byte w zależności od wartości coder
    • Metadane : mark word x2 (4 bytes x2 = 8 bytes), klass word (4 bytes), referencja do tablicy byte[] lub char[] (4 byte), hash (4 byte), hashIsZero (1 byte), coder (1 byte), padding (2 byte)
  • Obiekt String ma 2 dodatkowe flagi:
    • gdy coder =1 to kodowanie UTF-16 (2 bytes na znak)
    • gdy coder = 0 to kodowanie LATIN-1 (1 byte na znak)
    • hashIsZero jest to flaga która mówi czy obliczenie hasha zostało już wykonane