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

16 浏览
0 Comments

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

这个问题已经有答案了

如何确定Java中对象的大小

更新

我尝试了以下回答

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

但是当我尝试下面的代码时,它给我返回了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”

是什么导致了这种差异和原因呢?

admin 更改状态以发布 2023年5月22日
0
0 Comments

如javado中所述,该方法返回:

“预估当前未来分配对象可以使用的总内存量,以字节为单位。”

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

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

更新:更新的答案。
这些方法是在JVM中实现的,这意味着不同JVM之间的实现和近似精度可能会有所不同,即在Windows或Linux和Android中运行的JVM返回的结果可能不同。

此外,根据javadoc中的总内存(totalMemory()):
http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#totalMemory%28%29

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

请注意,保持任何给定类型对象所需的内存量可能是与实现密切相关的。

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

0
0 Comments

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

返回特定实现中的对象所消耗的存储空间的近似值。结果可能包括某些或所有对象的开销,因此对于实现内部比较有用,但不能在实现之间进行比较。估计值在JVM的单个调用期间可能会发生变化。

返回特定实现中的对象所消耗的存储空间的近似值。

可能这可以帮助您。

Instrumentation 接口的文档

0