如何在java中检查对象的内存使用情况

use*_*011 5 java memory android object

UPDATE

我试过了答案

在Java中,确定对象大小的最佳方法是什么?

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

public class MemoryTest {

    public static void main(String[] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new ArrayList<>().add(new DummyObject())));
    }
}
Run Code Online (Sandbox Code Playgroud)

而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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是"0"

任何人都可以告诉我
1.为什么结果是0
2.什么是测量对象的内存使用的正确方法

提前致谢


UPDATE

当我在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));
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是"680"

是什么造成这种差异?为什么?

Pat*_*ick 1

该接口Instrumentation提供了一个方法,称为getObjectSize()

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

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

也许这可以帮助你。

接口仪表文档