如何确定我的课程使用多少内存?

时间:2014-01-07 00:29:47

标签: java class memory byte

我与我的计算机科学老师讨论了JAVA课程的内存占用量。我们都不知道具体的答案,但我有一些他无法回答的问题。

1)原始数据类型使用的每个类的字节数是否与确定其内存使用量的因素一样简单?

2)如果你创建一个类的实例并将其设置为null,它是否仍会占用与非空的实例一样多的字节?

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

4)如果一个类没有变量,没有方法,没有任何东西,只是看起来像这样:

public class Test{}

还会占用记忆吗?

3 个答案:

答案 0 :(得分:1)

你在两个不同的东西之间混淆:class占用的内存量(元数据或实例的“蓝图”)和instance的内存量采取(数据/对象)。

对于类,您可以使用java.lang.instrument.Instrument.getObjectSize(yourObject.getClass());,对于实例 - 它不一定具有固定大小。例如,如果您有一个Person实例并且它有一个name字段 - 那么不同的名称将根据字符串的长度捕获不同的空格。

您可以使用分析器来查看内存实例占用的内容,YourKit是一个优秀的分析器,但它不是免费的。

答案 1 :(得分:0)

使用此:java.lang.instrument package

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

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

在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

来源:In Java, what is the best way to determine the size of an object?

答案 2 :(得分:0)

您可以使用此处的技术测量尺寸:

https://stackoverflow.com/a/383597/3049628

除此之外,您通常可以猜测大量的内存(大多数事情是4个字节或8个,具体取决于32位或64位系统。数组打包得更好。)但实际实现依赖于JVM,所以有没有固定的规则。