2016-03-02 10 views
13

Sto studiando la documentazione Java 8 per ArrayList. Ho capito che la dimensione massima dell'array è definita come Integer.MAX_VALUE - 8 significa 2^31 - 8 = . Quindi mi sono concentrato sul motivo per cui 8 viene sottratto o why not less than 8 o more than 8 viene sottratto?Perché la dimensione massima dell'array di ArrayList è Integer.MAX_VALUE - 8?

/** 
* The maximum size of array to allocate. 
* Some VMs reserve some header words in an array. 
* Attempts to allocate larger arrays may result in 
* OutOfMemoryError: Requested array size exceeds VM limit 
*/ 
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 

Ho ottenuto alcune risposte correlate ma non soddisfacendo la mia spinta.

  1. Do Java arrays have a maximum size?
  2. How many data a list can hold at the maximum
  3. Why I can't create an array with large size?

Alcune persone trattate con una certa logica che secondo la documentazione "Some VMs reserve some header words in an array". Quindi per le parole di intestazione, 8 viene sottratto. Ma su quel caso, se le parole di intestazione hanno bisogno di più di 8, allora quale sarà la risposta?

Per favore chiariscimi su questa base. Grazie per la collaborazione.

+5

Se sono necessari più di 8 parole di intestazione, allora sarebbe in crash quando ha ottenuto così grande. Quindi 8 è la stima dell'autore di ArrayList del numero massimo di parole di intestazione extra che sarebbero necessarie. –

+2

Su una nota non correlata: se stai allocando un array con 2 miliardi di elementi, probabilmente c'è qualcosa che non va da qualche parte. – Tunaki

+0

@LouisWasserman - in VM 8 byte è più alto? Se possibile, per favore fatemelo sapere. – SkyWalker

risposta

7

Leggi l'articolo sopra circa Java Memory management, in cui si afferma chiaramente

Credo che questo vale per ArrayList in quanto è la Implementazione di array ridimensionabile.

Anatomia di una matrice di oggetti Java

La forma e la struttura di un oggetto matrice, ad esempio una matrice di int valori, è simile a quella di un oggetto Java standard. La differenza primaria è che l'oggetto array ha una parte aggiuntiva di metadati che indica la dimensione dell'array. I metadati di un oggetto dell'array, , consistono in: Class: Un puntatore alle informazioni sulla classe, che descrive il tipo di oggetto. Nel caso di un array di campi int, questo è un puntatore alla classe int [].

Flags: Una collezione di flag che descrivono lo stato dell'oggetto, compreso il codice hash per l'oggetto se presente, e la forma della dell'oggetto (cioè, se l'oggetto è un array).

Blocco: le informazioni di sincronizzazione per l'oggetto, ovvero se l'oggetto è attualmente sincronizzato.

Dimensioni: la dimensione dell'array.

dimensione massima

2^31 = 2,147,483,648 

come Array esso auto deve 8 bytes al memorizza la dimensione 2,147,483,648

così

2^31 -8 (for storing size), 

così massima dimensione dell'array è definito come Integer.MAX_VALUE - 8

+0

per processi java a 32 e 64 bit, l'array ha bisogno di 8 byte in entrambi i casi? – SkyWalker

+1

Poiché le dimensioni degli oggetti sono arrotondate a un multiplo di 8 byte, sì. –

3

Il valore è uno scenario peggiore. Si noti il ​​commento:

tenta di allocare gli array più grandi può risultato nella OutOfMemoryError

Non dire sarà, basta può. Se rimani al di sotto di questo valore, non dovresti avere problemi (purché la memoria sia disponibile, ovviamente).

Si consiglia di guardare le risposte a questa domanda per ulteriori informazioni:
Why I can't create an array with large size?

5

La dimensione dell'intestazione dell'oggetto non può superare 8 byte.

Per HotSpot:

L'intestazione oggetto è costituito da a mark word e a klass pointer.

il marchio ha dimensione di parola (4 byte su architetture a 32 bit, 8 byte su 64 architetture bit) e

il puntatore klass ha dimensione parola 32 bit architetture. Nelle architetture 64 bit il puntatore klass ha o la dimensione della parola, ma può anche avere 4 byte se gli indirizzi heap possono essere codificati in questi 4 bytes.

Questa ottimizzazione è denominata "compressa oops" e puoi anche controllarla con l'opzione UseCompressedOops.

What is in java object header

Problemi correlati