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

4
假设以下场景:
void thisIsCalledManyTimes(){
    // ....
    someObject.executeIfNecessary( new Runnable(){
         void run(){ //do sth here}
    });
}

匿名对象需要多少空间?我理解每个匿名对象都会在其方法查找表中具有指向run相同实现的指针。


2
它会占用一些空间,你为什么想知道呢? - Denis Tulskiy
4个回答

5
Runnable 的源代码没有指定任何字段,因此匿名类将不会占用比 Object 更多的空间,但有两个区别。内部类具有对外部类实例的隐式引用,因此您需要考虑这一点。它还将复制从外部类引用的 final 变量的副本。

4

匿名类所占用的空间与非匿名类基本相同。所有对象都保留对其实例所属类的引用。

唯一不同的是,匿名类将包含对以下内容的引用:

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

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


0
使用分析器来检查类实例的大小。如果没有属性,它会非常小 - 它的大小与java.lang.Object的实例一样大。这取决于JVM版本。
如果您需要使其更有效,请执行以下操作:
void thisIsCalledManyTimes(){
// ....
   if (someObject.isItNecessary()) {
     someObject.execute( new Runnable(){
         void run(){ //do sth here}
     });
   } 

}

不过我不会太在意这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接