java - 以编程方式计算 Java 对象占用的内存,包括它引用的对象

标签 java memory-management

<分区>

我需要以编程方式准确找出给定 Java 对象占用的内存量,包括它引用的对象占用的内存。

我可以生成内存堆转储并使用工具分析结果。但是,生成堆转储需要花费大量时间,并且此类工具需要花费大量时间来读取转储以生成报告。考虑到我可能需要多次执行此操作,如果我可以在我的项目中添加一些代码来为我提供“运行时”值,我的工作会更加敏捷。

我怎样才能最好地实现这一目标?

ps:具体来说,我有一个 javax.xml.transform.Templates 类型的对象集合

最佳答案

你需要为此使用反射。生成的代码片段太复杂,我无法在此处发布(尽管它很快将作为我正在构建的 GPL 工具包的一部分提供),但主要思想是:

  • 对象头使用 8 个字节(用于类指针和引用计数)
  • 每个原始字段根据实际类型使用 1、2、4 或 8 个字节
  • 每个对象引用(即非原始)字段使用 4 个字节(引用加上引用对象使用的任何内容)

您需要单独处理数组(8 个字节的 header 、4 个字节的长度字段、4*length 个字节的表,加上内部对象正在使用的任何内容)。您需要使用反射处理遍历字段(及其父字段)的其他类型的对象。

你还需要在递归过程中保留一组“看到”的对象,以免在多个地方引用多次对象。

关于java - 以编程方式计算 Java 对象占用的内存,包括它引用的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/757300/

相关文章:

java - 告诉 Java 不要将对象插入交换空间

Python H2O 内存管理

java - 从项目 Android studio 中删除额外的 android.jar

c - Linux 上的 Malloc 没有过度使用

iphone - 使用 [UIImage imageNamed] 时内存警告图像未释放

java - If 语句,将一个变量与多个变量进行比较

Python内存序列化

java - 如何使用 WicketTester 查询元素(组件)的文本?

java - 对于 FindBugs,jar305.jar 中的注释是否应该优于 annotation.jar 中的类似注释?

java - 在单行中对齐 iText 中的文本