在C/C++中计算某一个基本类型或者对象占用内存大小的方法很简单,只要调用库里面的sizeof()操作符即可,但是在Java的API里面并没有给我们提供类似的方法。那么我们可不可以自己实现一个Java中的sizeof()方法呢?答案是肯定的。为了计算一个Java对象占用内存的大小,首先你得对Java对象的内存结构有所了解。如果你还不了解,请先阅读Java内存结构。
首先介绍一下sun.misc.Unsafe类,该类是Java中很神奇的一个类,这个类是用于执行低级别、不安全操作的方法集合。尽管这个类和所有的方法都是公开的(public),但是这个类的使用仍然受限,你无法在自己Java程序中直接使用该类,因为它的构造函数是私有的(private)。但是我们仍然能获得它的实例,方法如下:
Unsafe unsafe;
try {
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
unsafe = (Unsafe)unsafeField.get(null);
} catch (Throwable t) {
unsafe = null;
}Unsafe类的更多介绍和用法可以参照
http://mishadoff.github.io/

Java API未提供直接计算对象内存大小的方法,但可以通过sun.misc.Unsafe类实现。Unsafe类包含低级别、不安全的操作,虽然不能直接实例化,但可以通过反射获取其实例。通过Unsafe的sizeof()方法,可以针对32位HotSpot虚拟机计算对象占用的内存。这种方法揭示了Java对象的内存结构,显示了类编号、实例数量、内存大小和类名等信息。
最低0.47元/天 解锁文章
483

被折叠的 条评论
为什么被折叠?



