类中函数的内存开销是多少?
例如,
Class A
{
int a
}
Class B
{
int a
int foo(int);
}所以A类的100个实例应该是80个字节。那么B类的100个实例呢?
发布于 2009-04-08 16:33:17
开销是...没有。
方法定义和代码地址存储在Class对象中,它有一个唯一的实例,对象的每个实例都指向该实例。由于情况就是这样,无论是否添加了该方法,每个单独对象的开销都是零。
发布于 2009-04-08 14:38:35
80字节,因为对象中不包含方法。除非你也在谈论"vtable“类型的东西,在这种情况下可能有160个字节。
160个字节的说明。如果每个对象分配其自己的vtable (这是一种可能的实现),则将是160。或者(正如评论中指出的),更好的方法是每个类一个vtable,这意味着指向vtable的指针大小为80 +(可能是4或8字节,具体取决于VM)。所以84或88个字节。
整个事情完全取决于VM分配内存和处理非最终方法的方式。如果不知道特定的VM是如何实现的,这两个问题都无法正确回答。
发布于 2009-04-08 14:52:25
至少其他一些人已经说过,该方法不会存储在序列化中。
在此示例中,您可以使用以下代码轻松地执行一个测试来显示这一点。
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
48https://stackoverflow.com/questions/730321
复制相似问题