使用unsafe.allocateInstance()创建对象时的Idenfifying

时间:2014-02-05 21:43:10

标签: java performance

试着学习sun.misc.Unsafe低级java操作。我正在阅读this文章,但我的问题与使用不安全的优点有关。

在此示例中,Player p = (Player) unsafe.allocateInstance(Player.class);对象在哪里创建?在JVM堆或非堆直接内存上?

文章非堆分配中解释的所有操作是什么?我问这个是因为,当你使用“new”关键字时,它应该在堆上创建一个实例。如果确实如此,那么实际的优势是什么,因为它不会绕过GC。

1 个答案:

答案 0 :(得分:3)

方法Unsafe#allocateInstance(Class<?>)将仅在初始化阶段分配堆中的内存。通过下一个link描述了这种方法避免初始化段落。您还可以查看openJDK thread这个问题也可以解决的问题。

您可以使用方法Unsafe#allocateMemory(long)分配非堆内存。您还可以查看由DirectByteBuffer创建的ByteBuffer#allocateDirect(int)课程中的使用示例。

如果您想使用非堆内存,请考虑使用ByteBuffer allocateDirect。但是使用非堆内存的实际优势令人怀疑。您应该制作性能基准以确保您具有性能优势。如果使用直接缓冲区,还可以考虑使用-XX:MaxDirectMemorySize参数强制重用本机内存。