【问题标题】: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
}
});
}
在对象中保留空间来存储value1、value2和this;匿名对象的每个实例都将获得这些变量的副本。
【解决方案4】:
使用分析器检查您的班级实例的大小。它相当小,因为没有属性 - 它与 java.lang.Object 的实例一样大。这取决于 JVM 版本。
如果您需要提高效率,请执行以下操作:
void thisIsCalledManyTimes(){
// ....
if (someObject.isItNecessary()) {
someObject.execute( new Runnable(){
void run(){ //do sth here}
});
}
}
不过,我不会像这个那样费心。