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

时间:2009-04-08 14:35:25

标签: java memory

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

例如,

Class A
{
 int a
}

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

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

7 个答案:

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