如何检查java中对象的内存使用情况[重复]

Posted

技术标签:

【中文标题】如何检查java中对象的内存使用情况[重复]【英文标题】:How can I check memory usage of an object in java [duplicate] 【发布时间】:2016-01-20 01:37:36 【问题描述】:

更新

我尝试了

的答案

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

但是当我尝试下面的代码时,它给了我 16 的下面代码

public class MemoryTest 

    public static void main(String[] args) 
        System.out.println(ObjectSizeFetcher.getObjectSize(new ArrayList<>().add(new DummyObject())));
    

而 16 不是我要找的,所以我又问了这个问题。 这道题还是重复题吗?


我想检查一个对象的内存使用情况,这是我尝试过的。 (java 8)

// Dummy Object class
public class DummyObject 
    int dummy;


// Separate class to check memory
public class MemoryTest 
    public static void main(String[] args) 
        Runtime runtime = Runtime.getRuntime();

        long before = runtime.totalMemory() - runtime.freeMemory();
        DummyObject obj = new DummyObject();
        long after = runtime.totalMemory() - runtime.freeMemory();

        System.out.println(after - before);
    

结果为“0”

谁能告诉我 1. 为什么结果为 0 2. 测量对象内存使用的正确方法是什么

提前致谢


更新

当我在 android 项目中尝试相同的代码时,(SDK 版本 23)

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        Runtime runtime = Runtime.getRuntime();

        long before = runtime.totalMemory() - runtime.freeMemory();
        DummyObject obj = new DummyObject();
        long after = runtime.totalMemory() - runtime.freeMemory();

        System.out.println("test memory: " + (after - before));
    

结果是“680”

造成这种差异的原因是什么?

【问题讨论】:

如果您想要计算对象大小的其他方法,请阅读this, this @user2932011 请参阅下面的内存分析答案。我认为您不是在寻找内存中单个对象的内存占用。 (或者你是吗?)如果你正在寻找一个类的所有实例的内存大小,那么你需要内存分析。 【参考方案1】:

接口Instrumentation提供了一个名为getObjectSize()的方法

返回指定对象消耗的存储量的特定于实现的近似值。结果可能包括对象的部分或全部开销,因此对于实现内的比较有用,而不是实现之间的比较。估计值可能会在 JVM 的单次调用期间发生变化。

返回指定对象消耗的存储量的特定于实现的近似值

也许这对你有帮助。

Documentation of Interface Instrumentation

【讨论】:

【参考方案2】:

如 javadoc 中所述,该方法返回

“当前可用于未来分配对象的内存总量的近似值,以字节为单位。”

另请参阅: Java - Runtime.freeMemory()

由于这些方法返回近似值,因此很难发现小的差异。 为了获得有关应用程序使用的内存的更多信息,您可以使用分析工具查看有关内存的更多信息。 例如检查 Eclipse 内存分析器 https://eclipse.org/mat/

更新:对更新的回答。 这些方法是在 JVM 中实现的,这意味着不同 JVM 之间的实现和近似精度可能会有所不同,也就是说,在 windows 或 Linux 中运行的 JVM 上返回的结果可能会返回不同的值。

还有基于 javadoc 的 totalMemory(): http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#totalMemory%28%29

返回 Java 虚拟机中的内存总量。这 此方法返回的值可能会随时间而变化,具体取决于 宿主环境。

请注意,保存任何给定对象所需的内存量 类型可能依赖于实现。

因此,您还使用了另一个随时间变化的近似值。 仅使用freeMemory() 来计算可用内存的减少可能会更好。

【讨论】:

为了检查小的差异是获取结果 0 的问题,我创建了 DummyObject[1000] 数组并将 1000 个对象放入其中。但是,我仍然得到 0。你能解释为什么我仍然得到 0 吗? 我猜对象的大小也很重要。尝试增加数组的大小并稍等片刻。 javadoc 的“近似”子句允许广泛的精度,这个函数根本不允许精确计算。

以上是关于如何检查java中对象的内存使用情况[重复]的主要内容,如果未能解决你的问题,请参考以下文章

计算Java中任何对象的总内存使用量[重复]

如何检查 Android 应用的内存使用情况

如何查看unix 的java内存使用情况

如何检查和解决java虚拟机内存溢出的问题

如何检查 C++ 代码中的内存泄漏。有没有检查内存泄漏的免费工具[重复]

Java内存管理——垃圾收集