2010-06-04 15 views
13

Jeśli mam:jak obliczyć Składnia java pamici tablica

int c[] = new int[10]; 

i

int a[][] = new int[2][3]; 

i ogólnie

w n*m*..*j tablicy

jak mogę obliczyć zużycie pamięci rzeczywisty biorąc również pod uwagę zmienne referencyjne?

+0

Czy istnieje motywacja do uzyskania "rzeczywistego wykorzystania pamięci" tych tablic? – bakkal

Odpowiedz

14

Jeśli chcesz uzyskać dokładną odpowiedź, nie możesz. Przynajmniej nie w łatwy sposób. This thread objaśnia więcej.

Kłopot z odpowiedziami Bragaadeesha i Bakkala polega na tym, że ignorują one koszty ogólne. Każda tablica przechowuje również takie rzeczy, jak liczba jego wymiarów, długość i niektóre rzeczy, które wykorzystuje garbage collector.

Aby uzyskać proste oszacowanie, powinieneś być w porządku, korzystając z obliczeń z innych odpowiedzi i dodając 100-200 bajtów.

+1

Ta odpowiedź jest poprawna. Zawsze jest na górze z powodu informacji typu/GC i czegokolwiek. Plus jest fakt, że Java nie ma prawdziwej wielowymiarowej tablicy, tylko poszarpane tablice, które w końcu generują sporo tego narzutu. –

+0

jak jest reprezentowane w pamięci wielowymiarową tablicę? – xdevel2000

+0

Usunąłem moją odpowiedź, ponieważ nie wiem, jak obliczyć * dokładny * rozmiar włącznie z narzutem. – bakkal

1

Model int[] lub int[][] nie jest typem pierwotnym. Jest to obiekt w Javie. Za pomocą obiektu rozmiar nie może być obliczony od razu.

+0

skąd pochodzi '+ sizeof (int)'? – bakkal

+0

Odwołanie może nie być 4 bajtami w zależności od platformy. –

+0

@Matti: Zgoda. Całe to nie jest poprawne. Pozwól mi to edytować. – bragboy

8

Wiem, że trochę późno do partii, ale to naprawdę nie jest niezwykle trudne do obliczenia śladu pamięci.

Weźmy pierwszy przykład: int c[] = new int[N];

Według modelu pamięci 64-bitowym int wynosi 4 bajty, więc wszystkie elementy zostaną 4 * N bajtów. Oprócz tego Java ma 24-bajtowy narzut na tablicę i jest 8 bajtów dla rzeczywistego obiektu tablicy. Łącznie 32 + 4 * N bajtów.

na 2 wymiarowe tablicy: int a[][] = new int[N][M];

to w zasadzie takie same tylko, że każdy element pierwszego układu jest inna tablica rozmiarze M, więc zamiast 4 mamy 32 + 4 * m, więc całkowity rozmiar to 32 + (32 + 4 * M) * N.

To prawda, że ​​generalizacja wymiarów D jest dość skomplikowana, ale masz pomysł.

+0

Skąd bierze się 24-bajtowy narzut? Zakładam, że liczba jest dla konkretnej maszyny wirtualnej. –

+0

To była odpowiedź, której potrzebowałem. Pracuję nad projektem, w którym będę potrzebował całkiem sporej tablicy, nie chcę jej rozbić na kilka operacji na dyskach i muszę wiedzieć, ile pamięci te obiekty zużyją. Dziękuję Ci. –

-1

do pierwotnego Typ: podstawy i rozmiaru bajtu

  • logicznej 1
  • Bajt 1
  • char 1
  • Int 4
  • pływak 4
  • długości 8
  • podwójne 8
  • Inter GER 24 (16, na przykład klasy +4 INT +4 do wyrównywania pamięci)

int A [m]: 24 + 4M

(16 do klasy +4 do zapisania rozmiar tablicy +4 dla wyrównania pamięci) + (dla M rozmiaru podwójnego, potrzebujemy 4 * M)

int a [M] [N]: (24 + 4M) + M * (24 + 4N) = 24 + 28M + 4MN ~~~ 4MN

Traktuj [M] [N] jako M rozmiar podwójnej tablicy a [N] plus jedną dodatkową tablicę do przechowywania odniesienia wszystkich M si ze punktem początkowym tablicy.

+0

podczas omawiania różnych typów, możemy mieć inny rozmiar, ale dla int, możemy mieć obliczenia (może być pewna luka z powodu wyrównania pamięci) –

+0

'M =?', Tablica jest zawsze deklarowana 'int' .. ta odpowiedź mogłaby zostać poprawiona. – solidsnack