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

时间:2015-10-21 06:56:14

标签: java android object memory

更新

我尝试了

的答案
  

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);
    }
}

结果是&#34; 0&#34;

任何人都可以告诉我 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));
    }
}

结果是&#34; 680&#34;

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

2 个答案:

答案 0 :(得分:0)

接口Instrumentation提供了一种名为getObjectSize()

的方法
  

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

返回指定对象

所消耗的存储量的特定于实现的近似值

也许这可以帮到你。

Documentation of Interface Instrumentation

答案 1 :(得分:0)

如javadoc中所述,该方法返回

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

另见: Java - Runtime.freeMemory()

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

更新:回复更新。 这些方法在JVM中实现,这意味着实现并且可能在不同JVM之间的近似精度可能不同,即在Windows或Linux中运行的JVM上的结果返回,并且android可以返回不同的值。

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

  

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

     

请注意保存任何给定对象所需的内存量   类型可能与实现有关。

所以你也在使用另一种随时间变化的近似值。 仅使用freeMemory()来计算可用内存的减少可能更好。