Java:分配未初始化的内存块?

时间:2009-01-25 16:19:33

标签: java memory-management

有没有办法在Java中分配未初始化的内存块,例如包含遗留下来的垃圾的数组?我想这样做,以便对Java的内存分配器/垃圾收集器分配/释放内存块的速度进行基准测试。

6 个答案:

答案 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。但这不会给你一个“正常”对象处理的基准(虽然你想要基准测试的东西是正常的分配/解除分配,但是你不清楚为什么要这样做。)