为什么存在sun.misc.Unsafe,如何在现实世界中使用?

2022-08-31 05:23:13

前几天我遇到了sun.misc.Unsafe软件包,并对它能做什么感到惊讶。

当然,这门课是没有记录的,但我想知道是否有充分的理由使用它。在哪些情况下可能会出现需要使用它的情况?如何在实际场景中使用它?

此外,如果你确实需要它,这是否表明你的设计可能有问题?

为什么Java甚至包含这个类?


答案 1

例子

  1. VM “intrinsification.” 即在无锁哈希表中使用的CAS(Compare-And-Swap),例如:sun.misc.Unsafe.compareAndSwapInt,它可以对包含CAS特殊说明的本机代码进行真正的JNI调用。

    在此处阅读有关 CAS 的更多信息,http://en.wikipedia.org/wiki/Compare-and-swap

  2. 主机 VM 的 sun.misc.Unsafe 功能可用于分配未初始化的对象,然后将构造函数调用解释为任何其他方法调用。

  3. 可以从本地地址跟踪数据。可以使用java.lang.Unsafe类检索对象的内存地址,并通过不安全的get/put方法直接对其字段进行操作!

  4. JVM 的编译时优化。高性能VM使用“魔术”,需要低级操作。例如:http://en.wikipedia.org/wiki/Jikes_RVM

  5. 分配内存,sun.misc.Unsafe.allocateMemory eg:- DirectByteBuffer 构造函数在调用 ByteBuffer.allocateDirect 时在内部调用它

  6. 跟踪调用堆栈并使用 sun.misc.Unsafe 实例化的值重放,这对于检测很有用

  7. sun.misc.Unsafe.arrayBaseOffset 和 arrayIndexScale 可用于开发 arraylet,这是一种将大型数组有效地分解为较小对象的技术,以限制对大型对象进行扫描、更新或移动操作的实时成本。

  8. http://robaustin.wikidot.com/how-to-write-to-direct-memory-locations-in-java

有关此处的更多参考资料 - http://bytescrolls.blogspot.com/2011/04/interesting-uses-of-sunmiscunsafe.html


答案 2

只需在一些代码搜索引擎中运行搜索,我就可以得到以下示例:

用于获取对 {@link Unsafe} 对象的访问权限的简单类。{@link不安全} * 是允许在阵列上执行高效 CAS 操作所必需的。请注意,{@link java.util.concurrent.atomic} 中的版本,例如 {@link java.util.concurrent.atomic.AtomicLongArray},需要额外的内存排序保证,这些算法通常不需要这些保证,而且在大多数处理器上也很昂贵。

  • SoyLatte - java 6 for osx javadoc excerpt

/** 基于不安全的静态字段的基于 sun.misc.的字段访问器的基类。观察结果是,从反射代码的角度来看,只有九种类型的字段:八种基元类型和 Object。使用类 Unsafe 而不是生成的字节码可为动态生成的 FieldAccessors 节省内存和加载时间。*/

  • 斯派克源

/* 通过网络发送的最终字段 。.如何在接收端解构并重新创建对象?我们不想调用构造函数,因为它会为最终字段建立值。我们必须完全按照发送方端的字段重新创建最终字段。太阳.misc.Unsafe为我们做到了这一点。*/

还有很多其他的例子,只需按照上面的链接...


推荐