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
No, la specifica JVM non dispone tali garanzie: http://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#16446
in pratica è probabilmente il caso, ma hai anche alcuna garanzia circa la dimensione della parola.
non sicuro non è una classe Java standard, quindi se il vostro programma utilizza questo, allora non è portatile comunque ...
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).
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)
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:
- 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.
- 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.
Solo una nota: [Quando la formattazione del codice deve essere utilizzata per il testo non di codice?] (Http://meta.stackoverflow.com/a/254995) :). – Tom
Come potrei fare le citazioni simili dalle specifiche ufficiali? Voglio isolarli da un altro testo per una migliore lettura. – likern
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
- 1. Gli array multidimensionali C sono contigui senza buchi?
- 2. I dati in std :: array nidificati sono garantiti come contigui?
- 3. Come sono formattati gli array multidimensionali in memoria?
- 4. Capire come sono disposti in memoria gli array numpy
- 5. In che modo gli array 2D in C diventano array 1D?
- 6. Divisione di array 1d in blocchi
- 7. Numpy concatena gli array 2D con l'array 1D
- 8. Produzione di array 2D da un array 1D in MATLAB
- 9. Da ND ad array 1D
- 10. Accesso a un array 1D come array 2D in C++
- 11. Converti indice array 1D in indice array 2D
- 12. Gli interi sono sempre inizializzati a 0?
- 13. StopWatch.ElapsedTicks e StopWatch.Elapsed.Ticks sono sempre gli stessi?
- 14. I metodi statici sono sempre tenuti in memoria?
- 15. Gli array di stringhe sono mutabili?
- 16. Numpy: ottieni array 1D come array 2D senza rimodellare
- 17. Perché utilizzare gli array paralleli in Java?
- 18. Convertire un indice di array 2D in un indice 1D
- 19. Come sommare gli array in Java
- 20. In Java, perché gli oggetti array sono? Ci sono dei motivi specifici?
- 21. numpy: array 1D con varie forme
- 22. Convert una matrice 2D in un array 1D
- 23. Gli array basati su stack sono possibili in C#?
- 24. Gli array javascript sono effettivamente implementati come array?
- 25. Come posso riempire gli array in Java?
- 26. Le classi interne in enumerazione sono sempre statiche in Java?
- 27. Cosa sono gli oggetti mock in Java?
- 28. Gli array node.js sono in realtà delle hashmap?
- 29. Gli algoritmi java sono implementati in C o in java?
- 30. In che modo gli oggetti Java sono disposti in memoria su Android?
concordato, ma l'array stesso sarà contiguo, giusto? qualcosa del genere: 1000-> aa, 1001-> bb, 1002-> cd ecc. – shrini1000
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. –
@ 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. –