【问题标题】:Java - how much space does anonymous object take?Java - 匿名对象占用多少空间?
【发布时间】:2012-10-22 13:17:32
【问题描述】:

假设以下场景:

void thisIsCalledManyTimes(){
    // ....
    someObject.executeIfNecessary( new Runnable(){
         void run(){ //do sth here}
    });
}

匿名对象会占用多少空间?我知道每个对象匿名 obj 在其方法查找表中都有一个指向 run 的相同实现的指针。

【问题讨论】:

  • 它会占用一些空间,你为什么想知道它?

标签: java heap-memory anonymous-class


【解决方案1】:

Runnable 的源代码没有指定任何字段,因此匿名类不会比Object 占用更多空间,但有两个不同之处。内部类对外部类实例有一个隐式引用,因此您需要将其考虑在内。它还将获取从外部类引用的final 变量的副本。

【讨论】:

    【解决方案2】:

    匿名类占用的空间与非匿名类大致相同。所有对象都保留对它们作为实例的类的引用。

    匿名类的唯一不同在于它将包含对

    的引用
    • 外部类实例
    • 使用的任何最终变量的副本。

    【讨论】:

      【解决方案3】:

      run 的所有实例确实将共享同一个指向方法查找表的“指针”。但是,对象的精确大小取决于run 和它上面的... 的内容。编译器生成的匿名类除了存储对封闭类的this 对象的引用之外,还提供空间用于存储run 方法引用的变量。

      例如,

      private String name;
      
      void thisIsCalledManyTimes(){
          final int value1 = 123;
          final double value2 = 456.789.
          someObject.executeIfNecessary( new Runnable(){
               void run(){
                   System.out.println(name);   // Referenced through the enclosing "this"
                   System.out.println(value1); // Variable will be inserted by the compiler
                   System.out.println(value2); // Variable will be inserted by the compiler
               }
          });
      }
      

      在对象中保留空间来存储value1value2this;匿名对象的每个实例都将获得这些变量的副本。

      【讨论】:

        【解决方案4】:

        使用分析器检查您的班级实例的大小。它相当小,因为没有属性 - 它与 java.lang.Object 的实例一样大。这取决于 JVM 版本。

        如果您需要提高效率,请执行以下操作:

        void thisIsCalledManyTimes(){
        // ....
           if (someObject.isItNecessary()) {
             someObject.execute( new Runnable(){
                 void run(){ //do sth here}
             });
           } 
        

        }

        不过,我不会像这个那样费心。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多