【问题标题】:Java: Allocate uninitialized block of memory?Java:分配未初始化的内存块?
【发布时间】:2009-01-25 16:19:33
【问题描述】:

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

【问题讨论】:

    标签: java memory-management


    【解决方案1】:

    没有。您不能将分配与初始化分开,至少对于数组而言是这样。

    您到底要对什么进行基准测试?

    我问的原因是,在运行的 JVM 中有很多变量会影响任何对象分配时间,从对象的大小(决定分配的位置)到在同时 JVM(一旦你开始分配对象,它们就会在不同的代之间被打乱),以确定 Hotspot 是否决定你的代码没有做任何事情并且可以被无操作替换。

    顺便说一句,有一组类似但不重叠的变量妨碍了对 malloc() 进行基准测试...

    【讨论】:

    【解决方案2】:

    如果你能做到这一点,你就会对实际程序中不会发生的事情进行基准测试,因此结果将没有任何意义。

    我做了类似的事情,发现分配大约需要 250 ns 50% 的时间和 500 ns 或更多 10% 的时间和大约 1,200 ns 的时间 1%。

    这取决于您的处理器速度、您机器的内存架构以及您正在创建的对象。

    【讨论】:

      【解决方案3】:

      我想你不能这样做的原因之一是安全模型。

      【讨论】:

      • 您不必使用具有安全性的 Java。 Java 的哲学是让事情可预测(尽可能合理地),将所有内容归零就是其中的一部分。
      【解决方案4】:

      也许 java.nio.ByteBuffer 是您正在寻找的。不过你的理由有点含糊:-)

      【讨论】:

        【解决方案5】:

        关于您可以做您所询问的唯一方法是通过 JNI,这将使您获得的任何基准测试都没有实际意义,因为它不会反映真正的 Java 使用情况。由于其他人已经给出的原因。通过 Java(通过“new”)进行的任何分配都将始终初始化内存。

        【讨论】:

          【解决方案6】:

          无法分配未初始化的内存块并且通过“正常”分配/GC机制。

          可以做的是在任意内存地址(来自本机方法)构造一个直接的 ByteBuffer。但这不会为您提供“正常”对象处理的基准(尽管如果您想要基准的东西是正常的分配/释放,则不清楚您为什么要这样做)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-20
            • 2022-09-27
            • 2012-12-04
            • 1970-01-01
            • 2012-01-30
            • 2021-11-20
            • 2015-07-11
            相关资源
            最近更新 更多