Java中计算对象的大小
我想记录一个对象在一个项目中占用了多少内存(希望以字节为单位)(我正在比较数据结构的大小),并且似乎在Java中没有方法可以做到这一点。据说,C/C++ 有 sizeOf()
方法,但 Java 中不存在这个方法。我尝试在创建对象之前和之后使用 Runtime.getRuntime().freeMemory() 记录 JVM 中的可用内存,然后记录差异,但它只会给出 0 或 131304,并且什么也没有之间,无论结构中的元素数量如何。请帮忙!
I want to record how much memory (in bytes, hopefully) an object takes up for a project (I'm comparing sizes of data structures) and it seems like there is no method to do this in Java. Supposedly, C/C++ has sizeOf()
method, but this is nonexistant in Java. I tried recording the free memory in the JVM with Runtime.getRuntime().freeMemory()
before and after creating the object and then recording the difference, but it would only give 0 or 131304, and nothing in between, regardless of the number of elements in the structure. Help please!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用
java.lang。仪器
包。它有一个方法可用于获取特定于实现的对象大小的近似值以及与对象相关的开销。
Sergey 链接的答案有一个很好的例子,我将在此处重新发布,但您应该已经从他的评论中看到:
使用
getObjectSize
:来源
You can use the
java.lang.instrumentation
package.It has a method that can be used to get the implementation specific approximation of object size, as well as overhead associated with the object.
The answer that Sergey linked has a great example, which I'll repost here, but you should have already looked at from his comment:
Use
getObjectSize
:Source
查看https://github.com/DimitrisAndreou/memory-measurer。
Guava 在内部使用它,并且
ObjectGraphMeasurer
特别易于开箱即用,无需任何特殊的命令行参数。Look into https://github.com/DimitrisAndreou/memory-measurer.
Guava uses it internally, and
ObjectGraphMeasurer
is especially straightforward to use out-of-the-box, without any special command-line arguments.java.lang.instrument.Instrumentation 类提供了一种获取 Java 对象大小的好方法,但它要求您定义一个 premain 并使用java代理。当您不需要任何代理并且必须为您的应用程序提供一个虚拟 Jar 代理时,这是非常无聊的。
因此,我使用
sun.misc
中的Unsafe
类获得了替代解决方案。因此,根据处理器架构考虑对象堆对齐并计算最大字段偏移量,您可以测量 Java 对象的大小。在下面的示例中,我使用辅助类UtilUnsafe
来获取对sun.misc.Unsafe
对象的引用。The
java.lang.instrument.Instrumentation
class provides a nice way to get the size of a Java Object, but it requires you to define apremain
and run your program with a java agent. This is very boring when you do not need any agent and then you have to provide a dummy Jar agent to your application.So I got an alternative solution using the
Unsafe
class from thesun.misc
. So, considering the objects heap alignment according to the processor architecture and calculating the maximum field offset, you can measure the size of a Java Object. In the example below I use an auxiliary classUtilUnsafe
to get a reference to thesun.misc.Unsafe
object.