数组是java几乎顺序的内存数据结构吗?或物理顺序?

时间:2014-07-17 09:38:16

标签: java arrays memory

我试着找出原始java' array'之间的区别。和'列出'数据结构(如ArrayList),找到这样的文章或Q& A(Difference between List and Array)。包括该链接在内的许多文章指出了java原语'数组'是顺序记忆'。在这一点上,什么是顺序?这在物理内存中是否真的顺序?或在虚拟内存中顺序?我的猜测在虚拟内存中是顺序的,因为OS通常分配物理内存,而应用程序(JVM)并不关心特定的内存分配。但我不知道确切的答案。

4 个答案:

答案 0 :(得分:3)

Java数组在虚拟内存中是顺序的,不一定在物理内存中。

用户空间应用程序(例如JVM)对构成其虚拟地址空间的物理页是否在内存中是连续的没有发言权。事实上,在典型的现代操作系统中,它甚至无法理解这一点。这些都是由机器的虚拟内存硬件和(用户空间)指令集架构从用户空间应用程序中隐藏的。


查看JVM规范对物理内存问题不具有指导意义。这根本不相关。

并且似乎强制数组在虚拟内存中是连续的。但是,涉及非连续虚拟内存的表示会导致昂贵的阵列操作,因此您不太可能找到执行此操作的主流JVM。)

参考文献:

  • JVM Spec 2.7说:

      

    “Java虚拟机不要求任何特定的对象内部结构。”

    规范的其他部分暗示“对象”在这里指的是类和数组的BOTH实例。

  • JVM Spec 2.4讨论数组,但没有提到它们在内存中的表现方式。


数组与ArrayList之间的差异处于较高水平。数组具有固定大小。 ArrayLists具有可变大小。但是在幕后,ArrayList是使用(单个)数组实现的......如果列表变得太大,可以重新分配(即替换)。

答案 1 :(得分:2)

您必须查看JVM规范以查看是否有任何此类要求(数组是否需要是顺序内存),但为了提高效率,有意义的是,数组将以malloc类型方式分配

对于虚拟与物理,一切(在操作系统之上)与虚拟内存一起使用。 JVM的低级别不足以访问内核在Ring-0处所做的事情。

最后,为什么你感兴趣,你在编写自己的JVM吗?

答案 2 :(得分:1)

JVM从OS获取虚拟顺序内存。仅在OS级别,可以顺序分配物理内存。

在顺序存储器分配和顺序访问之间不要混淆也很重要 - 顺序访问意味着以预定的有序序列访问一组元素。如果只能以一个特定的顺序访问它包含的值,则称数据结构具有顺序访问。规范示例是链表。 而顺序存储器意味着分配顺序存储器(不一定是物理顺序存储,而是虚拟顺序存储)。

除了您发布的链接,ArrayArrayList之间存在一些主要差异:

  • 数组大小固定,ArrayList大小为动态
  • Array可以存储基元,ArrayList只能存储Objects(Wrapper 基元类型)
  • 您可以在ArrayList
  • 中使用泛型
  • 您可以使用add()方法将元素插入ArrayList中,您可以 只需使用赋值运算符将元素存储到数组

参考文献:Java67 articleWikipedia

答案 3 :(得分:0)

这可能是一篇解释你问题的有趣文章。

  • 数组也是Java中的对象,因此对象在内存中的外观如何应用于数组。

总结:

class A {
int x;
int y;
}



public void m1() {
int i = 0;
m2();
}

public void m2() {
A a = new A();
}

当调用m1时,新帧(Frame-1)被推入堆栈,而局部变量i也在Frame-1中创建。 然后在m1内部调用m2,将另一个新帧(Frame-2)推入堆栈。在m2中,在堆中创建类A的对象,并将引用变量放在第2帧中。

物理内存位置不在您手中,将由操作系统分配

http://www.programcreek.com/2013/04/what-does-a-java-array-look-like-in-memory/