java - 测量 Java 对象在内存中占用的最佳方法

标签 java profiling

简单的愚蠢问题。我有一个包含 java 对象的集合。这些对象不是同一类的实例,但它们实现相同的接口(interface)并且在概念上非常“相似”,因此它们的大小应该非常相似。我需要了解这个集合将在内存中消耗多少空间。计算该值的最简单(最佳)方法是什么?

我知道我可以获取可以驻留在集合中的每个java类,计算它们的大小(深度大小、反射等),获取平均值,乘以N(集合大小)并得到最终值。

但是可以用相反的方式来完成吗 - 计算现有集合的大小(无需深入研究反射、字段大小等)?我知道将集合序列化为字节流并测量输出大小将不起作用,因为序列化不会反射(reflect)确切的对象内存布局。但也许还有其他方法可以做到这一点?

最佳答案

如果您使用像 YourKit 这样的分析器,它可以告诉您对象的深度大小。您可以使用 Instrumentation.getObjectSize() 但使用起来确实很痛苦(而且它只能提供浅层大小)

最好的方法可能是自己估计/计算。将每个字段的大小相加(四舍五入到接下来的 8 个字节),每个对象增加 12 个字节的开销,如果您使用的是 64 位 JVM 并且“压缩 Oops”关闭,则增加 16 个字节。

关于java - 测量 Java 对象在内存中占用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573116/

相关文章:

java - 如何使用自定义@Rule正确配置@RunWith(Parameterized.class) + SpringClassRule + SpringMethodRule?

java - 在Java图片中查找图片?

java - 尝试在空对象引用上调用接口(interface)方法 'boolean java.util.List.add(java.lang.Object)'

php - 如何在 PostgreSQL 9.1 中使用 pgFouine?

parallel-processing - Julia:如何剖析并行代码

Java Yourkit Profiler 显示 5K+ char[] 对象没有被垃圾收集,我如何知道哪个类是罪魁祸首?

asp.net - 是否有比升级到 Visual Studio 2010 Ultimate 更便宜的负载测试方法

java - JPA self-join问题,我怎么只能得到第一级引用?

java - 如何使用 Scanner 处理无效输入(InputMismatchException)引起的无限循环

google-app-engine - 分析 java Google App Engine 应用程序