2015-06-11 14 views
6

C malloc in genere non allocano la quantità precisa di memoria richiesta ma consumano invece esecuzioni di memoria di dimensioni fisse, ad es. con potenza di due dimensioni, in modo che un'allocazione di 1025 byte richieda effettivamente un segmento di 2048 byte con 1023 byte persi come slop.Con quale precisione gli array Java utilizzano la memoria in HotSpot (cioè quanto slop)? Le implementazioni

HotSpot utilizza un meccanismo di allocazione simile per gli array Java? In tal caso, qual è il modo giusto per allocare un array Java in modo tale che non ci sia uno slop? (Ad esempio, se la lunghezza dell'array è una potenza di due o forse la potenza di due meno una certa quantità di overhead?)

+8

Supponiamo è necessario un array per memorizzare 1025 byte. Supponiamo che Java assegni 2048 byte di memoria per quella matrice, lasciando 1023 byte inutilizzati. Cosa vorresti ottenere creando un array di 2048 byte per memorizzare 1025 byte? Ora dovrai gestire tu stesso i 1023 byte inutilizzati e memorizzare la lunghezza effettiva dell'array da qualche parte, e passarlo come argomento invece di passare semplicemente l'array, invece di lasciare che JVM lo faccia per te. E la quantità di memoria consumata sarà la stessa. È un gioco da ragazzi. Il modo giusto per allocare un array è allocare un array con la lunghezza necessaria. –

+4

Onestamente, non mi preoccuperei di come un'implementazione JVM gestisca la memoria. Le gioie dell'uso di un linguaggio gestito come Java sono che la memoria non è semplicemente un gigantesco array, non devi mai preoccuparti del sovraccarico del buffer o della corruzione della memoria da problemi fuori limite o puntatori ribelli e non hai (quasi) mai bisogno preoccuparsi di ripulire gli oggetti. Apri te stesso allo zen di Java. – scottb

+2

'malloc' ha una serie di vincoli che un linguaggio spazzatura non deve assolutamente preoccupare. Non darei per scontato che Java debba preoccuparsi di queste cose. –

risposta

5

Se stai chiedendo informazioni sulla lingua, la risposta è: Non specificato (come per C)

Se stai chiedendo di un'implementazione specifica, controlla quella implementazione. Credo per Hotspot la sua granularità a 8 byte; cioè le dimensioni degli oggetti vengono arrotondate al limite successivo della granularità. Se la domanda riguarda l'aumento della dimensione dell'heap quando non c'è abbastanza heap libero, dipende dall'implementazione, dalle impostazioni GC, dai parametri della dimensione dell'heap e così via; rendendo poco pratico rispondere con precisione.

MODIFICA: utilizzando una piccola riflessione, accesso alla classe sun.misc.Unsafe (solo Oracle JRE), i riferimenti agli oggetti possono essere convertiti in indirizzi di memoria; emettere gli indirizzi di due array assegnati consecutivamente per verificare se stessi.

E ho praticamente fatto la stessa domanda qui: Determine the optimal size for array with respect to the JVM's memory granularity (Le risposte comprendono un esempio di utilizzo della classe non sicuri per verificare la presenza di dimensioni dell'oggetto)

+0

Ho effettivamente provato formulare la mia domanda per chiedere su HotSpot piuttosto che Java in generale. E guardando la risposta all'altra domanda, sembra che l'arrotondamento al limite di 8 byte più vicino sia la risposta. Grazie. – hsivonen

Problemi correlati