Java方法的内存开销是多少?

类中函数的内存开销是多少?

例如,

Class A { int a } Class B { int a int foo(int); } 

所以A类的100个实例应该是80个字节。 B类的100个实例怎么样?

开销是……没有。

方法定义和代码地址存储在Class对象中,该对象具有唯一的实例,对象的每个实例都指向该实例。 既然如此,无论您是否添加了该方法,每个单独对象的开销都不算什么。

由于方法未包含在对象中,因此为80个字节。 除非你也在谈论“vtable”类型的东西,在这种情况下可能是160字节。

澄清了160个字节。 160将是每个对象分配其自己的vtable(这是一种可能的实现)。 或者(并且在评论中指出)更好的方法是每个类一个vtable,这意味着80 +指向vtable的指针的大小(可能是4或8个字节,具体取决于VM)。 所以84或88个字节。

这一切完全取决于VM分配内存和处理非最终方法的方式。 在不知道如何实现特定VM的情况下,既不能正确回答问题。

至少其他人至少已经说过,该方法不存储在序列化中。

您可以使用以下代码轻松地在此示例中进行测试以显示此信息。

 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 

对于32/64位JVM,这两个类的对象将使用大约20-24个字节。

该方法不以序列化forms存储。 就这么简单。

编辑:对于执行期间VM中的对象,无论对象的类有多少方法,大小都应该是常量。

等于,80! ( 简而言之)

可能v-table指针的大小向上舍入为16的倍数。