Java: 1-d-arrays immer zusammenhängend im Speicher?
Viele Bücher/Artikel, die ich gelesen habe zu diesem Thema, sowie ein kleines Programm schrieb ich mit 'Unsicher', zeigen, dass 1-d arrays in Java sind immer zusammenhängend im Speicher. So ist es bestimmt von JLS oder ist es eine Implementierung Konvention? Die Frage ist, bestätigen diese Angabe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, die JVM-Spezifikation hat keine solchen Garantien:
http://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#16446
In der Praxis ist es wahrscheinlich der Fall, aber Sie haben auch keine Garantie, die über das Wort Größe.
Unsicher ist nicht ein standard-Java-Klasse, so dass, wenn Ihr Programm verwendet diese, dann ist es ohnehin nicht portabel...
Ich aktualisieren möchten dieser Frage mit was Die Java Language Specification, Java SE 8 Edition - (JLS) und Die Java Virtual Machine Specification, Java SE 8 Edition (JVMS) sagen, über Sie.
Müssen wir Möglichkeiten, um Antwort auf diese Frage:
Punkt werde ich zur Spezifikation von constraints.
Wenn wir uns anschauen, Kapitel 10. Arrays von JLS (und jedem anderen Kapiteln JLS und JVMS Bezug auf arrays) konnten wir nicht finden jede Erwähnung von memory layout Beschränkungen für arrays. So ist es definitiv bedeutet, dass die array-möglicherweise nicht kontinuierlich.
Darüber hinaus JLS sagt, dass arrays sind Objekte:
Und gleichzeitig JVMS sagt, dass Objekte und arrays werden auf dem heap gespeichert:
Aber JVMS nicht zwingen heap-Speicher werden kontinuierlich:
Als alle arrays gespeichert werden, in-Heaps und heap möglicherweise nicht kontinuierlich, es folgt, dass arrays auch möglicherweise nicht kontinuierlich.
Da es keine wirkliche Möglichkeit zur Interaktion mit Speicher-Adressen in Java, ist es auch nicht definiert in der Spezifikation, wie das layout des Objekts im Speicher aussieht.
Beachten Sie, dass die Verwendung
Unsafe
ziemlich viel automatisch bedeutet, dass Sie sind, ein Bummel außerhalb des Bereichs der spec.Dass gesagt wird, ich wage, dass die meisten JVM-Implementierungen tun in der Tat verwenden eine lineare layout für (eindimensionale) arrays.
Gegeben, dass viele JVM ist eine Anforderung haben, dass der Haufen kontinuierliche in-memory-ich denke, seine unwahrscheinlich, dass Sie Ort ein 1d-array von primitives in verschiedenen Orten im Speicher.
Referenziert das Objekt durch ein Objekt[] unwahrscheinlich sind, werden kontinuierliche in-memory-und selbst wenn Sie sind, können neu angeordnet werden, ohne Warnung.
Hinweis: die Verwendung von Unsicheren Lesen Sie die Referenzen in einem array als
int
Werte, um zu sehen, was Sie vor und nach einem GC. Einige JVMs verwenden eine 64-bit-Referenzen, in denen eine lange, aber die meisten 32-bti-Referenzen (auch für 64-bit-JVMs)