【发布时间】:2009-01-25 16:19:33
【问题描述】:
有没有办法在 Java 中分配未初始化的内存块,例如包含碰巧留下的任何垃圾的数组?我想这样做是为了对 Java 的内存分配器/垃圾收集器分配/释放内存块的速度进行基准测试。
【问题讨论】:
有没有办法在 Java 中分配未初始化的内存块,例如包含碰巧留下的任何垃圾的数组?我想这样做是为了对 Java 的内存分配器/垃圾收集器分配/释放内存块的速度进行基准测试。
【问题讨论】:
没有。您不能将分配与初始化分开,至少对于数组而言是这样。
您到底要对什么进行基准测试?
我问的原因是,在运行的 JVM 中有很多变量会影响任何对象分配时间,从对象的大小(决定分配的位置)到在同时 JVM(一旦你开始分配对象,它们就会在不同的代之间被打乱),以确定 Hotspot 是否决定你的代码没有做任何事情并且可以被无操作替换。
顺便说一句,有一组类似但不重叠的变量妨碍了对 malloc() 进行基准测试...
【讨论】:
如果你能做到这一点,你就会对实际程序中不会发生的事情进行基准测试,因此结果将没有任何意义。
我做了类似的事情,发现分配大约需要 250 ns 50% 的时间和 500 ns 或更多 10% 的时间和大约 1,200 ns 的时间 1%。
这取决于您的处理器速度、您机器的内存架构以及您正在创建的对象。
【讨论】:
我想你不能这样做的原因之一是安全模型。
【讨论】:
也许 java.nio.ByteBuffer 是您正在寻找的。不过你的理由有点含糊:-)
【讨论】:
关于您可以做您所询问的唯一方法是通过 JNI,这将使您获得的任何基准测试都没有实际意义,因为它不会反映真正的 Java 使用情况。由于其他人已经给出的原因。通过 Java(通过“new”)进行的任何分配都将始终初始化内存。
【讨论】:
无法分配未初始化的内存块并且通过“正常”分配/GC机制。
您可以做的是在任意内存地址(来自本机方法)构造一个直接的 ByteBuffer。但这不会为您提供“正常”对象处理的基准(尽管如果您想要基准的东西是正常的分配/释放,则不清楚您为什么要这样做)。
【讨论】: