【问题标题】:Write/read memory using Unsafe in java在 java 中使用 Unsafe 写/读内存
【发布时间】:2011-10-06 16:54:12
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java memory-management unsafe-pointers


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      您不应该假设会有某种机制可以防止您破坏您不应该接触的进程内存部分。

      Unsafe.getUnsafe() 旁边的 comment 非常清楚:

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

      【讨论】:

      • 那么,我可以写入任何区域并导致整个操作系统崩溃?
      • @Leonardo:不,根据我的回答,您可能会损坏您的进程的内存。一个不太像样的操作系统会阻止你影响其他进程。
      猜你喜欢
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2013-01-10
      • 2018-01-22
      • 2015-08-15
      相关资源
      最近更新 更多