2015-06-11 14 views
6

C malloc implementacje zwykle nie przydzielają dokładnej ilości żądanej pamięci, ale zamiast tego pobierają ciągi o stałej wielkości, np. z potęgą dwóch rozmiarów, tak że alokacja 1025 bajtów rzeczywiście zajmuje 2048-bajtowy segment z 1023 bajtami utraconymi jako przemiatanie.Jak dokładnie macierze Java wykorzystują pamięć w HotSpot (tj. Ile slopu)?

Czy HotSpot używa podobnego mechanizmu alokacji dla tablic Java? Jeśli tak, to jaki jest właściwy sposób przydzielania tablicy Java w taki sposób, że nie ma w niej luzu? (Np. Czy długość tablicy powinna być potęgą dwóch, czy może potęgą dwóch minus pewna ustalona kwota narzutów?)

+8

Załóżmy trzeba tablicę do przechowywania 1025 bajtów. Załóżmy, że Java przydziela 2048 bajtów pamięci dla tej tablicy, pozostawiając 1023 bajty nieużywane. Co byś zyskał tworząc tablicę o wielkości 2048 bajtów do przechowywania 1025 bajtów? Teraz będziesz musiał sam sobie poradzić z nieużywanymi 1023 bajtami i przechowywać rzeczywistą długość tablicy gdzieś i przekazać ją jako argument, zamiast tylko przekazywać tablicę, zamiast pozwolić JVM zrobić to za Ciebie. A ilość zużytej pamięci będzie taka sama. To nie myślenia. Właściwym sposobem przydzielenia tablicy jest przydzielenie tablicy o wymaganej długości. –

+4

Szczerze mówiąc, nie martwię się, jak implementacja JVM obsługuje pamięć. Radości używania języka zarządzanego, takiego jak Java, polegają na tym, że pamięć nie jest po prostu gigantyczną tablicą, nigdy nie musisz się martwić przepełnieniem bufora lub uszkodzeniem pamięci z problemów poza granicami lub niepotrzebnymi wskaźnikami, a Ty (prawie) nigdy nie potrzebujesz martwić się o czyszczenie obiektu. Otwórz się na zen Java. – scottb

+2

'malloc' ma garść ograniczeń, a język, który zbiera śmieci, wcale nie musi się martwić. Nie zakładałbym, że Java musi się tym martwić. –

Odpowiedz

5

Jeśli pytasz o język, odpowiedź brzmi: Nie określono (tak samo jak dla C)

Jeśli pytasz o konkretną implementację, sprawdź tę implementację. Wierzę, że Hotspot ma 8-bajtową ziarnistość; czyli rozmiary obiektów są zaokrąglane do następnej granicy granulacji. Jeśli pytanie dotyczy zwiększenia wielkości sterty, gdy nie ma wystarczającej ilości wolnej sterty, zależy to od implementacji, ustawień GC, parowania wielkości sterty i tak dalej; sprawienie, że precyzyjne udzielenie odpowiedzi jest niepraktyczne.

EDYCJA: Używając małego hackowania, uzyskując dostęp do klasy sun.misc.Unsafe (tylko Oracle JRE), odwołania do obiektów można konwertować na adresy pamięci; wypisz adresy dwóch kolejno przydzielonych tablic, aby sprawdzić samemu.

I w zasadzie to samo pytanie tutaj: Determine the optimal size for array with respect to the JVM's memory granularity (Odpowiedzi obejmują przykład używając Niebezpieczne klasę w celu sprawdzenia wielkości obiektu)

+0

Rzeczywiście spróbowałem aby sformułować moje pytanie, aby zapytać o HotSpot, a nie ogólnie o Javę. Patrząc na odpowiedź na drugie pytanie, wygląda na to, że zaokrąglanie do najbliższej 8-bajtowej granicy jest odpowiedzią. Dzięki. – hsivonen

Powiązane problemy