这篇文章介绍我的之前承诺的那个可以计算出Java对象的shallow size和deep size的小类库。
这个类库包含一个公共类:com.codeinstructions.sizeof.SizeOf,它实现了5个公共方法:
static long deepSize(java.lang.Object object) – 计算给定对象的deep size。
static long deepSize(java.lang.Object object, long maxSize) – 计算给定对象的deep size,但是为了避免深入到一个非常大的对象树中,因此只计算到给定的程度为止(maxSize)。
static long depthLimitedDeepSize(java.lang.Object object, int depth) – 返回给定对象的deep size,但是只计算到给定的深度(depth)。
static boolean isLargerThan(java.lang.Object object, long size) – 判断给定对象的deep size是否超过给定的限制(size)。
static int shallowSize(java.lang.Object object) – 返回给定对象的shallow size。
完整的java文档请看这里。
工作原理
这个类库基本上就是用反射(reflection)来得到类的内部细节,从而计算出其实例的大小。同样,也是用反射来遍历对象图来计算其deep size。
目前为止这个类库还是试验版本,仅在32位的Java 6的JDK第11个升级版上测试通过。
这个类库有BSD风格公共许可(BSD-like public license),也就是说只要你也遵守这个许可,就可以按照自己的喜好对这个类库进行修改了。