在java中使用Unsafe写入/读取内存

时间:2011-10-06 16:54:12

标签: java memory-management unsafe-pointers

我知道可以通过在jvm中使用Unsafe类直接写入和读取内存。

除了这确实不安全并且在某种程度上适得其反之外,我反而想知道谁/什么负责检查允许的内存位置的边界。 如果有一些机制可以保护已经分配的内存被覆盖。 与这个最新的问题相关,可以通过覆盖他不应该做的事情来造成什么损害?嗯,这可以最好改写为:可以写入的内存类型,或者已经存储了哪种类型的信息?

由于

2 个答案:

答案 0 :(得分:2)

底层操作系统将确保您不会在分配给应用程序的内存之外写入(由于Virtual Memory,它可以轻松地执行)。如果这样做,您将收到分段错误或类似错误除此之外,JVM可能会执行自己的绑定检查。你肯定不会被允许写入任何明智的(即其他应用程序)内存,我怀疑JVM会允许你覆盖内部结构,但我可能在那里错了。因此,总结一下您的问题的答案:在您应用程序出现故障的最佳情况下,在不应该覆盖的地方可能会造成损坏,最糟糕的情况是JVM崩溃。

关于安全措施,不使用Unsafe会是一个非常好的...除此之外,你当然可以在Unsafe分配的内存中编写自己的内存分配器并标记一些区域,这样你的应用程序代码就不会写了进入不应该的区域。

所以你的上一个问题的答案是,如果JVM允许你访问分配的不安全区域之外的内存,那么你可以访问的内存的信息和类型是你的任何对象以及任何内部JVM结构。显然,改变这些会造成严重破坏,因此尝试这样做可能会导致崩溃。

答案 1 :(得分:2)

使用Unsafe类,负责检查允许的内存位置的边界。

你不应该假设会有一些机制可以防止你破坏你不应该接触的过程内存部分。

Unsafe.getUnsafe()附带的comment非常明确:

  

[Unsafe实例]可用于读取和写入数据   任意内存地址。