【问题标题】:Java Object and array memory locationJava 对象和数组内存位置
【发布时间】:2010-08-09 21:35:12
【问题描述】:

我正在用 Java 编写一个数组支持的哈希表,其中键和值的类型是 Object;没有其他保证。

对我来说最简单的代码方式是创建一个对象来保存它们:

public class Pair { 
    public Object key;
    public Object value;
}

然后创建一个数组

public Pair[] storage = new Pair[8];

但是 jvm 如何在内存中处理它?也就是说,数组究竟会不会:

  • 是指向其他地方的 Pair() 对象的指针数组,或者
  • 包含实际数据?

编辑

由于对象稍后被实例化为 new Pair(),它们被随机放置在堆中。有什么好的方法可以确保它们在堆中是连续的?我是否需要对 sun.misc.unsafe 做一些诡计才能使其发挥作用?

解释我的动机,如果我想尝试确保连续项目在同一内存页中,有没有办法在 Java 中做到这一点?

【问题讨论】:

  • 我想你知道,但是 public Pair[] storage = new Pair[8];不创建对对象。只是说,如果你没有。 :)

标签: java arrays memory hashtable paging


【解决方案1】:

数组将是堆上的一个对象,其中包含指向 Pair 对象的指针,这些对象也将在堆上(但与数组本身分开)。

【讨论】:

  • +1。有什么好的方法可以将它们组合在一起吗?否则,看起来非原始数组会在内存中变得一团糟。
  • 数组本身将是一个连续的块,如果同时分配了其他对象(假设中间没有其他线程并且没有 GC 运行),那么它们将被放置在每个对象的旁边其他也在记忆中。但是,不能保证它们会在同一个内存页面中。您可以自己将对象序列化为字节数组并以这种方式强制布局,但它不会很漂亮。
  • 现在不用太担心漂亮了;绕过硬件抽象永远不会看起来很好。谢谢!
【解决方案2】:

不,存储数组将只包含指向存在于堆上其他位置的实际 Pair 对象的指针。但是,请记住实例化 8 个 Pair 对象并使数组的每个元素都指向这些对象。在你编写的代码之后你需要有这样的东西:

for(int i=0;i<storage.length;i++)
    storage[i] = new Pair() ;

只有这样,存储阵列才会创建并正确引用 Pair 对象。

【讨论】:

  • 哦,我知道我必须初始化对象,但我想知道数组是否保证对象在内存中是连续的;这听起来像一个明确的不。 +1,感谢您的回答!
  • 我不确定按时间顺序创建的对象是否在内存中是连续的,但考虑到垃圾收集是在语言中自动完成的,这似乎不太可能。但是,由于对象不包含在数组中,因此无法保证这一点。数组中的指针当然必须是连续的。
猜你喜欢
  • 2014-01-07
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多