试着学习sun.misc.Unsafe低级java操作。我正在阅读this文章,但我的问题与使用不安全的优点有关。
在此示例中,Player p = (Player) unsafe.allocateInstance(Player.class);
对象在哪里创建?在JVM堆或非堆直接内存上?
文章非堆分配中解释的所有操作是什么?我问这个是因为,当你使用“new”关键字时,它应该在堆上创建一个实例。如果确实如此,那么实际的优势是什么,因为它不会绕过GC。
答案 0 :(得分:3)
方法Unsafe#allocateInstance(Class<?>)
将仅在初始化阶段分配堆中的内存。通过下一个link描述了这种方法避免初始化段落。您还可以查看openJDK thread这个问题也可以解决的问题。
您可以使用方法Unsafe#allocateMemory(long)分配非堆内存。您还可以查看由DirectByteBuffer创建的ByteBuffer#allocateDirect(int)课程中的使用示例。
如果您想使用非堆内存,请考虑使用ByteBuffer allocateDirect。但是使用非堆内存的实际优势令人怀疑。您应该制作性能基准以确保您具有性能优势。如果使用直接缓冲区,还可以考虑使用-XX:MaxDirectMemorySize参数强制重用本机内存。