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的倍数。