[原创]在Java中如何计算一个Object的size

我之所以要计算一个Object的size,是因为有一个项目里要缓存一些Object,想在unit test里预估一下每个Object占用的内存大小,从而估计出服务器的内存可以缓存多少Object。

于是Google了一下,找到到这个网页这个网页。后面那个链接中提到了一个非常有用的library:memory-measurer,著名的Guava库也在内部使用了它。从它的介绍:

A small tool that is very handy when e.g. you design data structures and want to see how much memory each one uses. To do this, it uses a simple reflection-based object-traversing framework (ObjectExplorer). On it, it builds two facilities:
 
* MemoryMeasurer, which can estimate the memory footprint of an object graph in bytes. This requires installing a javaagent when running the JVM, e.g. by passing -javaagent:path/to/object-explorer.jar.
* ObjectGraphMeasurer does not need a javaagent, and can also give a much more qualitative measurement than MemoryMeasurer - it counts the number of objects, references, and primitives (of each kind) that an object graph entails.
我们可以看出来,要得到一个Object的大小,只需要像下面这样用就可以了:

System.out.println(MemoryMeasurer.measureBytes(new HashMap<String, String>()));

文章来源:http://www.codelast.com/
接下来,把对这个package的依赖添加到你的项目中:

  • 如果你的项目是Ant管理的,那么,把jar包拷贝到你项目里的jar包目录下
  • 如果你的项目是Maven管理的,貌似作者还没有把该项目加入到Maven central repo中,所以我不知道pom.xml该怎么改

然后你会发现,就算你已经添加好了依赖,在IDE中直接运行这个unit test,还是会报错,无法运行。错误提示大概是下面这个样子:

java.lang.ExceptionInInitializerError
at ...
Caused by: java.lang.IllegalStateException: Instrumentation is not setup properly. You have to pass -javaagent:path/to/object-explorer.jar to the java interpreter
at com.google.common.base.Preconditions.checkState(Preconditions.java:145)
at objectexplorer.InstrumentationGrabber.checkSetup(InstrumentationGrabber.java:20)
at objectexplorer.InstrumentationGrabber.instrumentation(InstrumentationGrabber.java:25)
at objectexplorer.MemoryMeasurer.<clinit>(MemoryMeasurer.java:21)
错误信息已经说得比较清楚了,要向Java interpreter传递一个参数:

-javaagent:testlib/object-explorer.jar

在这里,testlib/object-explorer.jar 是我的object-explorer.jar在项目中的相对路径。
问题是,这个参数填到哪里去呢?
文章来源:http://www.codelast.com/
前面已经说了,我是在unit test中运行的,所以,这跟IDE有关。我用的是IntelliJ,应该像下面这样设置:
『1』点击IntelliJ菜单 Run→Edit Configurations→在左栏的列表中选择你的那个unit test,则右边的对话框设置的是此unit test的属性。
『2』在对话框中的“VM options”一项中,我们看到它已经填上了“-ea”,现在要加上前面提到的参数,变成:

-ea -javaagent:testlib/object-explorer.jar

然后再重新运行unit test,成功!打印了出了Object的size。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast

发表评论