2012-04-19 16 views
21

Molti libri/articoli che ho letto su questo argomento, nonché un piccolo programma che ho scritto usando 'Unsafe', indicano che gli array 1-d in Java sono sempre contigui in memoria. Quindi è dettato da JLS o è una convenzione di implementazione? Alla domanda viene chiesto di confermare questa indicazione.Java: gli array 1-d sono sempre contigui in memoria?

risposta

10

Poiché non esiste un modo reale di interagire con gli indirizzi di memoria in Java, non è definito nelle specifiche come si presenta il layout dell'oggetto in memoria.

Nota che l'utilizzo di Unsafe significa automaticamente che stai camminando fuori dal regno delle specifiche.

Detto questo, mi permetto che la maggior parte delle implementazioni JVM do utilizzino infatti un layout lineare per matrici (unidimensionali).

3

Dato che molti JVM sono un requisito che l'heap è continuo nella memoria penso che sia improbabile posizioneranno una matrice 1d di primitivi in ​​diversi punti della memoria.

L'oggetto a cui fa riferimento un oggetto [] è improbabile che sia persistente in memoria e anche se lo sono, può essere riorganizzato senza preavviso.

Nota: Utilizzando Unsafe è possibile leggere i riferimenti in un array come valori int per vedere cosa sono prima e dopo un GC. Alcune JVM usano riferimenti a 64 bit che richiedono un lungo, ma il più utilizzato 32-bti riferimenti (anche per JVM a 64 bit)

+2

concordato, ma l'array stesso sarà contiguo, giusto? qualcosa del genere: 1000-> aa, 1001-> bb, 1002-> cd ecc. – shrini1000

+1

Mi aspetterei che i riferimenti dovrebbero essere memorizzati in modo continuo (ma non credo sia specificato da nessuna parte) Questo è simile al fatto che il Le specifiche non dicono che il conteggio dei riferimenti non sarà usato per GC in nessuna JVM, ma nessuno AFAIK lo fa. –

+3

@ shrini1000 se l'heap non è un blocco contiguo di memoria virtuale, quindi un array spannig due frammenti NON avrà layout contiguo. D'altra parte, l'heap contiguo non implica nulla sul fatto che anche gli array, forse solo indirettamente, lo rende più probabile in quanto i vincoli di progettazione del GC sarebbero simili. –

8

Desidero aggiornare questa domanda con cosa dicono di questo The Java Language Specification, Java SE 8 Edition (JLS) e The Java Virtual Machine Specification, Java SE 8 Edition (JVMS).

dobbiamo scelte per rispondere a questa domanda:

  1. Quali vincoli imposti sulle implementazioni di JVM. Questo è l'approccio più affidabile poiché l'implementazione di qualsiasi specifica presume intrinsecamente lo "Tutto ciò che non è vietato è permesso" principio.
  2. cosa maggior parte delle implementazioni di JVM suggeriscono ragionevole

io indicherò a vincoli di specifica.

Se guardiamo Capitolo 10. Array di JLS (e tutti gli altri capitoli di JLS e JVM legati alla array) non siamo riusciti a trovare alcuna menzione dei vincoli di layout di memoria imposti agli array. Ciò significa che la matrice potrebbe non essere continua.

Inoltre, JLS dice che gli array sono oggetti:

Capitolo 10. Array.

Nel linguaggio di programmazione Java, array sono oggetti (§4.3.1), vengono creati dinamicamente, e possono essere assegnati a variabili di tipo Object (§4.3.2). Tutti i metodi di classe Object possono essere invocati su un array.
...

4.3.1. Oggetti.

Un oggetto è un'istanza di classe o un array. (E Array è Object)

E allo stesso tempo JVM dice che gli oggetti e gli array sono memorizzati sul mucchio:

2.5.3. Heap

La Java Virtual Machine ha un heap condiviso tra tutti i thread Java Virtual Machine. L'heap è l'area dati di runtime dalla quale viene allocata la memoria per tutte le istanze e gli array di classe.

Ma JVM non obbliga memoria heap essere continuo:

2.5.3. Heap

... La memoria per l'heap non deve essere continua.

Poiché tutti gli array sono memorizzati in mucchio e mucchio potrebbe non essere continuo, ne consegue che anche matrici potrebbero non essere continuo.

+0

Solo una nota: [Quando la formattazione del codice deve essere utilizzata per il testo non di codice?] (Http://meta.stackoverflow.com/a/254995) :). – Tom

+0

Come potrei fare le citazioni simili dalle specifiche ufficiali? Voglio isolarli da un altro testo per una migliore lettura. – likern

+0

Ricordare la differenza tra "formattazione del codice" e "blockquote". Parole come "JLS", "JVMS" e "Capitolo 10. Array". non sono codice e dovrebbero essere formattati come tali :). Le virgolette sono corrette. – Tom

Problemi correlati