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?
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?
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.
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. –
jak jest reprezentowane w pamięci wielowymiarową tablicę? – xdevel2000
Usunąłem moją odpowiedź, ponieważ nie wiem, jak obliczyć * dokładny * rozmiar włącznie z narzutem. – bakkal
Model int[]
lub int[][]
nie jest typem pierwotnym. Jest to obiekt w Javie. Za pomocą obiektu rozmiar nie może być obliczony od razu.
będziesz prawdopodobnie uzyskać najlepsze przybliżenie z tego: http://java.sun.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize(java.lang.Object)
Ten article, a to comprehensive one demonstruje/szczegóły tego podejścia
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ł.
Skąd bierze się 24-bajtowy narzut? Zakładam, że liczba jest dla konkretnej maszyny wirtualnej. –
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. –
do pierwotnego Typ: podstawy i rozmiaru bajtu
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.
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) –
'M =?', Tablica jest zawsze deklarowana 'int' .. ta odpowiedź mogłaby zostać poprawiona. – solidsnack
Czy istnieje motywacja do uzyskania "rzeczywistego wykorzystania pamięci" tych tablic? – bakkal