假設以下情形:Java - 匿名對象需要多少空間?
void thisIsCalledManyTimes(){
// ....
someObject.executeIfNecessary(new Runnable(){
void run(){ //do sth here}
});
}
多少空間,匿名對象採取?我知道每個匿名obj對象都有一個指向其方法查找表中的相同實現run
的指針。
假設以下情形:Java - 匿名對象需要多少空間?
void thisIsCalledManyTimes(){
// ....
someObject.executeIfNecessary(new Runnable(){
void run(){ //do sth here}
});
}
多少空間,匿名對象採取?我知道每個匿名obj對象都有一個指向其方法查找表中的相同實現run
的指針。
Runnable的源代碼沒有指定任何字段,所以匿名類將不會佔用比Object
更多的空間,但有兩點不同。內部類對外部類實例有一個隱式引用,因此您可能需要考慮這個因素。它還會從外部類中引用final
變量的副本。
匿名類佔用與非匿名類相同數量的空間。所有對象都保持對它們是實例的類的引用。
只有約一個匿名類不同的是,它會包含對
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
}
});
}
保留在對象中的空間來存儲value1
,value2
,和this
;匿名對象的每個實例都將獲得這些變量的副本。
使用事件探查器檢查班級實例的大小。由於沒有屬性,它非常小 - 它和java.lang.Object的實例一樣大。它取決於JVM版本。
如果您需要進行此比較有效只是做:
void thisIsCalledManyTimes(){
// ....
if (someObject.isItNecessary()) {
someObject.execute(new Runnable(){
void run(){ //do sth here}
});
}
}
但是我不會理會這個太多,因爲這一點。
它需要一些空間,爲什麼你想知道它? –