jak obliczyć zużycie pamięci przez tablicę java
Jeśli mam:
int c[] = new int[10];
i
int a[][] = new int[2][3];
i ogólnie mówiąc
tablica
n * m * .. * jjak mogę obliczyć rzeczywiste użycie pamięci, biorąc pod uwagę również zmienne odniesienia?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
6 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Ten wątek
https://coderoad.ru/2370288/
wyjaśnia więcej.
Problem z odpowiedziami Bragaadisa i Bakkali polega na tym, że ignorują oni koszty ogólne. Każda tablica przechowuje również takie rzeczy, jak liczba wymiarów, które ma, jej długość i niektóre elementy używane przez moduł odśmiecania pamięci.
Aby uzyskać proste oszacowanie, powinieneś być w porządku, korzystając z obliczeń z innych odpowiedzi i dodając 100-200 bajtów.
Anonimowy użytkownik
Potwierdzenie od:
Weźmy pierwszy przykład: Zgodnie z 64-bitowym modelem pamięci, wartość int wynosi 4 bajty, więc wszystkie elementy będą miały rozmiar 4 * N bajtów. Oprócz tego Java ma 24 bajty narzutu tablicy oraz 8 bajtów na rzeczywisty obiekt tablicy. W sumie daje to 32 + 4 * N bajtów.
Dla dwuwymiarowej tablicy: Zasadniczo jest tak samo, tylko każdy element w pierwszej tablicy jest inną tablicą o rozmiarze M, więc zamiast 4 mamy 32 + 4 * M, więc całkowity rozmiar to 32 + (32 + 4 * M) * N.
Prawdą jest, że uogólnienie na wymiary D jest dość trudne, ale masz pomysł.
Anonimowy użytkownik
Potwierdzenie od:
http:// java.sun.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize(java.lang.Object
http://java.sun.com/javase/6/d ... tSize(java.lang.Object)
)
To
artykuł
http://www.javalobby.org/java/forums/t52787.html, i to
wszechstronny,
http://www.javamex.com/tutoria ... shtml
demonstruje/wyszczególnia to podejście
Anonimowy użytkownik
Potwierdzenie od:
int []
lub nie jest pierwotnym typem danych. Jest to obiekt w Javie. W przypadku obiektu rozmiaru nie można od razu obliczyć.Anonimowy użytkownik
Potwierdzenie od:
https://www.javamex.com/tutori ... sage. shtml
https://www.javamex.com/tutori ... shtml
Oto mój przypadek: mam dużą tablicę
gdzie „duży” jest w rzeczywistości mylący: m-duży (3 ^ 18 = 387420489), ale n-mały (4). Ciągle miałem problemy z pamięcią, których nie rozumiałem, ponieważ m * n * 4 = 6198727824 (~ 6 GB), podczas gdy mam 16 GB pamięci RAM (i 12 jest dozwolonych dla maszyn JVM z -Xmx12G). Link, który właśnie umieściłem, dał mi odpowiedź:
każda z 10 linii ma swój własny 12-bajtowy nagłówek obiektu, 4 * 10 = 40 bajtów dla rzeczywistej linii ints i ponownie 4 bajty wypełnienia, aby suma dla tej linii była wielokrotnością 8
W tym miejscu pamięć mojej tablicy 2-D różni się znacznie od 4 * m * n: tutaj, ponieważ n jest małe (4), rozmiar każdego wiersza jest rzeczywiście różny od 4 * n; jeśli zastosujemy formułę podaną w linku (nawet jeśli jest przybliżona), otrzymamy dla każdej linii: 12 (tytuł) + 4 * 4 (cztery Inta) + 4 (uzupełnienie wielokrotności 8 bajtów) = 32. To jest dwa razy droższe niż się spodziewałem i wyjaśnia, że napotkałem przepełnienie pamięci.
Anonimowy użytkownik
Potwierdzenie od:
int a[M]: 24+4M
(16 dla klasy + 4, aby zachować rozmiar tablicy + 4, aby wyrównać pamięć) + (dla podwójnego rozmiaru M potrzebujemy 4 * M)
int a[M][N]: (24+4M) + M*(24+4N) = 24+28M+4MN ~~~4MN
traktuj [M] [N] jako rozmiar M podwójnej tablicy a [N] plus jedną dodatkową tablicę do przechowywania odniesień do wszystkich punktów początkowych tablicy o rozmiarze M.