在java中对象创建需要多少个cpu周期?

时间:2016-07-10 18:51:13

标签: algorithm jvm heap-memory

我很好奇创建一个java中没有字段的类对象需要多少个cpu周期或时间?我和同事一起讨论是否以独特的方式创建新对象以获取某些内容或创建uuid是个好主意,在他的辩护中,他说如今创建对象在java中非常轻,我也同意。

但问题是它如何与像uuid一代完全不同的东西相比?

因此,怀疑分配对象和协议需要多少CPU周期?涉及的具体步骤是什么?

1 个答案:

答案 0 :(得分:7)

Java中的对象创建可能需要从0到数十亿周期。

  • 零:当一个对象没有转义本地范围时,JIT编译器可能会因为分配消除优化而用局部变量替换分配。
  • 数十亿,因为任何分配可能会触发(可能很长)垃圾收集。

我已经在thisthis回答中对HotSpot JVM中的分配进行了高级概述。

在TLAB中分配对象的最常用方法包括以下步骤:

  1. 加载tlab_top指针(x64上通常有一个专用的CPU寄存器用于线程本地)。
  2. 将其增加一个对象的大小。
  3. tlab_top + object_sizetlab_end进行比较。如果需要,跳转到慢速路径。
  4. 存储tlab_top的新值。前一个值是新创建的对象的地址。
  5. 设置对象的默认标题。
  6. 设置klass字段 - 指向对象类元数据的指针。
  7. 使用零初始化其余对象数据。即使没有字段的对象也可能有对齐填充。
  8. 这些都是大约10-15个CPU指令。

    让我们使用JMH基准来衡量对象创建的平均时间。

    package bench;
    
    import org.openjdk.jmh.annotations.Benchmark;
    
    public class Alloc {
    
        @Benchmark
        public Object baseline() {
            return "Some preallocated object";
        }
    
        @Benchmark
        public Object newObject() {
            return new Object();
        }
    }
    

    结果:

    Benchmark        Mode  Cnt  Score   Error  Units
    Alloc.baseline   avgt   10  3,428 ± 0,089  ns/op
    Alloc.newObject  avgt   10  4,505 ± 0,056  ns/op
    

    因此,对象分配以及基准测试开销在2.4GHz CPU上需要大约4.5 ns或大约11个周期。与UUID生成算法相比,这确实很便宜。