有没有办法在Java中分配未初始化的内存块,例如包含遗留下来的垃圾的数组?我想这样做,以便对Java的内存分配器/垃圾收集器分配/释放内存块的速度进行基准测试。
答案 0 :(得分:6)
没有。您不能将分配与初始化分开,至少不能与数组分开。
你究竟想要进行基准测试的是什么?
我要问的是,正在运行的JVM中有很多变量会影响任何对象分配时间,范围从对象的大小(确定分配的位置)到其他正在发生的事情。 JVM同时(一旦你开始分配对象,它们就会在各代之间混乱),Hotspot是否决定你的代码没有做任何事情,可以用无操作代替。
顺便提一下,有一组相似但不重叠的变量阻碍了malloc()的基准测试......
答案 1 :(得分:1)
如果你能做到这一点,你就会对实际程序中没有发生的事情进行基准测试,结果不会有任何意义。
我做了类似的事情,发现50%的时间分配大约250 ns,10%的时间分配大约500 ns,大约1,200 ns,1%的时间。
这取决于您的处理器速度,机器的内存架构以及您正在创建的对象。
答案 2 :(得分:1)
我想你不能做到这一点的原因之一是安全模型。
答案 3 :(得分:1)
也许你正在寻找java.nio.ByteBuffer。你的理由有点含糊不清: - )
答案 4 :(得分:0)
关于你可以做你所问的唯一方法是通过JNI,这将使你得到任何基准,因为它不会反映真正的Java使用。由于其他人已经给出的原因。通过Java进行任何分配(通过“new”)将始终初始化内存。
答案 5 :(得分:0)
没有办法分配未初始化的内存块和通过“正常”分配/ GC机制。
可以做的是在任意内存地址(来自本机方法)构造一个直接的ByteBuffer。但这不会给你一个“正常”对象处理的基准(虽然你想要基准测试的东西是正常的分配/解除分配,但是你不清楚为什么要这样做。)