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 * .. * j
jak mogę obliczyć rzeczywiste użycie pamięci, biorąc pod uwagę również zmienne odniesienia?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz dokładnej odpowiedzi, nie możesz. Przynajmniej nie w łatwy sposób.

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

Anonimowy użytkownik

Potwierdzenie od:

Wiem, że jestem trochę spóźniony na imprezę, ale naprawdę nie jest tak trudno określić ilość pamięci.
Weźmy pierwszy przykład:
int c [] = new int [N];
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:
int a [] [] = new int [N] [M];
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

Anonimowy użytkownik

Potwierdzenie od:

prawdopodobnie uzyskasz lepsze przybliżenie z tego:

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

Anonimowy użytkownik

Potwierdzenie od:

int []
lub
int [] []
nie jest pierwotnym typem danych. Jest to obiekt w Javie. W przypadku obiektu rozmiaru nie można od razu obliczyć.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wiem, że to stare pytanie, ale miałem to samo i informacje podane w tym wątku mi nie pomogły. Źródło, które dostarczyło mi potrzebnych informacji:

https://www.javamex.com/tutori ... sage. shtml
https://www.javamex.com/tutori ... shtml
Oto mój przypadek: mam dużą tablicę
int a[][] = new int[m][n];

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

Anonimowy użytkownik

Potwierdzenie od:

dla typu oryginalnego: rozmiar bazowy i rozmiar bajtów
  • boolean 1
  • bajt 1
  • char 1
  • int 4
  • pływak 4
  • długi 8
  • podwójna 8
  • Liczba całkowita 24 (16 dla instancji klasy + 4 dla int4 dla wyrównania pamięci)


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.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się