类中函数的内存开销是多少?
例如,
Class A
{
int a
}
Class B
{
int a
int foo(int);
}
所以A类的100个实例应该是80个字节。那么B类的100个实例呢?
答案 0 :(得分:11)
开销是......没有。
方法定义和代码地址存储在Class对象中,该对象具有唯一的实例,对象的每个实例都指向该实例。 既然如此,无论你是否添加了这个方法,每个单独对象的开销都不算什么。
答案 1 :(得分:4)
80个字节。除非你也在谈论“vtable”类型的东西,在这种情况下大概160个字节。
对160个字节的澄清。 160将是每个对象分配其自己的vtable(这是一种可能的实现)。或者(并且如评论中所指出的)更好的方法是每个类一个vtable,这意味着80 +指向vtable的指针的大小(可能是4或8个字节,具体取决于VM)。所以84或88字节。
这一切完全取决于VM分配内存和处理非最终方法的方式。在不知道如何实现特定VM的情况下,任何问题都无法正确回答。
答案 2 :(得分:2)
正如其他一些人至少所说,该方法没有存储在序列化中。
您可以使用以下代码轻松地进行测试以在此示例中显示此内容。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializationTest {
public static void main(String[] args) {
serialize(true);
serialize(false);
}
public static void serialize(boolean aOrB) {
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream("output.txt");
out = new ObjectOutputStream(fos);
out.writeObject(aOrB ? new A() : new B());
out.close();
fos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
File file = new File("output.txt");
System.out.println(file.length());
}
public static class A implements Serializable {
int a = 0;
}
public static class B implements Serializable {
int a = 0;
public int foo(int a) {
return a;
}
}
}
对我来说这打印出来
48
48
答案 3 :(得分:2)
对于32/64位JVM,两个类的对象将使用大约20-24个字节。
答案 4 :(得分:1)
该方法未以序列化形式存储。就这么简单。
编辑:对于执行期间VM中的对象,无论对象的类有多少方法,大小都应该是常量。
答案 5 :(得分:1)
等于,80! (简而言之)
答案 6 :(得分:-1)
v-table指针的大小可能会四舍五入为16的倍数。