【问题标题】:get object from memory by hash code通过哈希码从内存中获取对象
【发布时间】:2016-03-20 02:27:05
【问题描述】:

我的问题是关于 JVM 的安全级别

我们如何通过证明哈希码从内存中获取对象?

今天我在想。我在执行环境 One 中创建了一个 A 类的对象。并从此处获取该对象的哈希码。

现在在另一个执行环境中,我想通过提供哈希码来取回 A 类对象。

我认为这是可能的。因为当我执行环境一时。我一次又一次地得到JVM返回相同的哈希码。

意味着它首先在其缓存中找到对象。如果它得到引用,它只是返回它。


所以现在回到问题,我们必须了解当我们复制什么数据时 写=。

  Object a=new Object();// here as we know reference of new object will be stored in refvar a.

那么实际上是经过的。

如果我们得到什么数据是通过 =(equal operator) 传递的。我们将能够从内存中获取对象。

谢谢

【问题讨论】:

  • 通过调用对象的hashCode() 方法返回哈希码。如果您覆盖默认值,您可以为具有相同属性的对象返回相同的哈希码。默认实现(来自Object)并不能保证这一点。然而,最重要的是要注意 1) 哈希码不能唯一标识一个对象,以及 2) 哈希码并不代表对象的内存位置。
  • 博斯科我对你很满意。但是他们有什么方法可以得到那个实际地址。或 java 库中的任何本机方法。

标签: java jvm


【解决方案1】:

我们如何通过证明哈希码从内存中获取对象?

您不能不访问 JVM 的内部。即使这样,您也需要扫描内存中的每个对象。与具有相同 hashCode 的多个对象相比,您也会遇到问题。顺便说一句:默认情况下,对象在您要求之前没有 hashCode。

我认为这是可能的。因为当我执行环境一时。我一次又一次地得到 JVM 返回相同的哈希码。

这只是因为您正在重新创建生成 hashCode 的确切条件,最轻微的变化,您将获得不同的 hashCode。

意味着它首先在其缓存中找到对象。如果它得到引用,它只是返回它。

it 是指需要维护的缓存,JVM 中不存在这样的缓存。

所以现在回到问题上来,我们必须了解当我们写 = 时复制了哪些数据。

Object a=new Object();// here as we know reference of new object will be stored in refvar a.

那么实际上是经过的。

引用已通过,如您所说。没有别的了。

【讨论】:

  • 地址。表示堆地址、哈希码或任何其他。
  • 但我认为 = 运算符可能会传递 JVM 寄存器地址或 CPU 寄存器地址。所以请澄清 on = equal operator
  • @D.k.Agrawal = 是一个赋值,而不是 ==equals(),这会将对象的地址分配给一个变量。该变量可能在堆栈或寄存器中,或者如果不使用a,它可能会被消除。
  • @D.k.Agrawal 引用可以是索引,即不是可用地址,例如,32 位 JVM 可以使用索引到地址的各种转换来寻址高达 64 GB 的内存。例如(index * 16) + offset
【解决方案2】:

我猜这无关紧要,因为哈希码可能与内存地址相关,也可能不相关 看看documentation

通常每个 JVM 都有自己的内存堆栈,因此您是否可以从其他 JVM 访问对象取决于 JVM 实现,我想这很少可能。

【讨论】:

  • 当我们开始在 JavaTM 中执行时,它会根据文档创建新的执行环境,并会创建一个新的堆栈。比它返回我们在之前运行中创建的对象的引用如何可能
  • 您所说的参考是什么意思?如果您的意思是哈希码,那么它不是参考,它可能包含一些地址信息,但它并不总是正确的。事实上,有时你会得到相同的代码,这是由于 jvm 在内存中分配了相同的空间
猜你喜欢
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多