Java - 匿名对象占用多少空间?

时间:2012-10-22 13:17:32

标签: java heap space anonymous-class

假设以下情况:

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

匿名类占用的空间与非匿名类相同。所有对象都保持对它们是实例的类的引用。

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

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

答案 2 :(得分:1)

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

例如,

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;匿名对象的每个实例都将获得这些变量的副本。

答案 3 :(得分:0)

使用分析器检查类实例的大小。它很小,因为没有属性 - 它和java.lang.Object的实例一样大。这取决于JVM版本。

如果你需要做得更有效,那就去做:

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

}

但是我不会为此烦恼太多。