Perché l'overhead durante l'allocazione di oggetti / matrici in Java?

9

Quanti byte occupa una matrice in Java? Supponiamo che sia una macchina a 64 bit e supponiamo anche che ci siano N elementi in una matrice, quindi tutti questi elementi occuperebbero 2 * N, 4 * N o 8 * N byte per diversi tipi di array.

E una conferenza a Coursera dice che occuperebbe 2 * N + 24, 4 * N + 24 o 8 * N + 24 byte per un array di elementi N e che i 24 byte sono chiamati overhead, ma non spiegano perché il sovraccarico è necessario.

Anche gli oggetti hanno overheads, ovvero 16 byte.

Quali sono esattamente questi overhead? Cosa sono questi 24/16 byte composti da?

Inoltre, questi overheads esistono solo in Java? Che ne dici di C, C ++ e Python?

    
posta Gnijuohz 28.08.2012 - 05:15
fonte

1 risposta

16

Ogni oggetto Java ha un'intestazione che contiene informazioni importanti per la JVM. Il più importante è un riferimento alla classe dell'oggetto (una parola macchina), e ci sono alcuni flag usati dal garbage collector e per gestire la sincronizzazione (dato che ogni oggetto può essere sincronizzato) che occupa un'altra parola macchina (usando parole parziali sarebbe essere cattivo per le prestazioni). Quindi sono 2 parole, 8 byte su sistemi a 32 bit e 16 byte su 64 bit. Gli array necessitano inoltre di un campo int per la lunghezza dell'array, che è un altro 4 byte, possibilmente 8 su sistemi a 64 bit.

Come per altre lingue:

  • C non ha oggetti, quindi ovviamente non ha intestazioni oggetto - ma può avere un'intestazione su ciascun pezzo di memoria allocata separatamente.

  • In C ++, non hai garbage collection e non puoi usare oggetti arbitrari per la sincronizzazione, ma se hai classi con metodi sovrascritti, ogni oggetto ha un puntatore al suo vtable, proprio come il riferimento dell'oggetto Java al suo classe. Se si utilizzano puntatori intelligenti che eseguono la garbage collection, hanno bisogno dei dati di manutenzione.

  • Non conosco Python, ma sono abbastanza sicuro che abbia bisogno anche di un riferimento alla classe e delle informazioni di gestione per il garbage collector.

risposta data 28.08.2012 - 10:46
fonte

Leggi altre domande sui tag