Java 我如何确定我的类使用了多少内存?

Java 我如何确定我的类使用了多少内存?,java,class,memory,byte,Java,Class,Memory,Byte,我和我的计算机科学老师讨论了一个JAVA类占用多少内存的问题。我们都不知道具体的答案,但我有几个问题他无法回答 1) 它是否像其基本数据类型使用的每个类的字节数一样简单?是什么决定了它的内存使用量 2) 如果创建一个类的实例并将其设置为null,它会占用与非null实例相同的字节数吗 3) 一个包含100个字符的字符串是否具有与单个字符串相同的字节数 4) 如果一个类没有变量,没有方法,什么都没有,只是看起来像这样: public class Test{} 它还会占用内存吗?请使用以下选项:

我和我的计算机科学老师讨论了一个JAVA类占用多少内存的问题。我们都不知道具体的答案,但我有几个问题他无法回答

1) 它是否像其基本数据类型使用的每个类的字节数一样简单?是什么决定了它的内存使用量

2) 如果创建一个类的实例并将其设置为null,它会占用与非null实例相同的字节数吗

3) 一个包含100个字符的字符串是否具有与单个字符串相同的字节数

4) 如果一个类没有变量,没有方法,什么都没有,只是看起来像这样:

public class Test{}
它还会占用内存吗?

请使用以下选项:

编译该库并将其包含在jar中。 然后:

在Manifest.MF中添加:

Premain-Class: ObjectSizeFetcher
现在做:

public class C {
    private int x;
    private int y;

    public static void main(String [] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new Test()));
    }
}
您可以使用以下命令调用代码:

java -javaagent:ObjectSizeFetcherAgent.jar C

来源:

您可以使用以下技术测量尺寸:


除此之外,您通常可以猜测大致的内存量(在32位或64位系统中,大多数内存是4字节或8字节,这取决于系统的大小。阵列的压缩效果更好。)但是实际的实现依赖于JVM,因此没有固定的规则。

您混淆了两个不同的东西:一个
占用的内存量(元数据,或实例的“蓝图”)和一个
实例
占用的内存量(数据/对象)

对于类,可以使用
java.lang.instrument.instrument.getObjectSize(yourObject.getClass())Person
的实例,并且它有一个
name
字段,那么不同的名称将根据字符串的长度捕获不同的空格


您可以使用探查器来查看实例占用了多少内存,这是一个优秀的探查器,但它不是免费的。

根据定义,实例不为空。一个变量可以存储一个
null
引用,但一个实例就是实际的对象。我认为vm有决定的余地,但我认为每个变量都有一个引用的大小(对于某些原语来说可能更小),并且引用指向一个对象(大致相当于其原语的大小加上支持OOP的vtables等)。根据这一逻辑1)no 2)no 3)稍微多一点4)yes参考阅读第42-43页以了解信息存储的位置。如果你的老师确实不能回答这些问题,那么他/她就不应该教Java。@PM77-1我认为最后的评论有点苛刻。编译理论和计算语言理论之间存在着很大的差异,我相信这一问题与计算语言理论是一致的,计算语言理论可能是相关教师的核心技能。你也可能假设老师是大学水平的,而不是小学水平的,这两个国家对核心技能的要求有很大的不同。@robnick-我假设这是高中老师。我希望任何教Java的人都知道单词
堆栈
,并且理解
本身(就像Java中的几乎所有东西一样)是一个
对象
java -javaagent:ObjectSizeFetcherAgent.jar C