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?)
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. –
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
'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ć. –