当前位置: 首页 > 面试题库 >

以编程方式计算Java对象(包括其引用的对象)占用的内存

傅峰
2023-03-14
问题内容

我需要以编程方式确切地找出给定的Java对象正在占用多少内存,包括它所引用的对象所占用的内存。

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

我怎样才能最好地做到这一点?

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


问题答案:

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

  • 对象标头使用8个字节(用于类指针和引用计数)
  • 每个原始字段使用1、2、4或8个字节,具体取决于实际类型
  • 每个对象引用(即非原始对象)字段使用4个字节(引用以及所引用对象使用的所有内容)

您需要分别处理数组(8个字节的标头,4个字节的length字段,4 * length个表的字节,以及内部使用的任何对象)。您需要使用反射来处理遍历字段(及其父字段)的其他类型的对象。

您还需要在递归过程中保留一组“可见”对象,以免多次计数在多个位置引用的对象。



 类似资料:
  • 本文向大家介绍对Java的面对对象编程中对象和引用以及内部类的理解,包括了对Java的面对对象编程中对象和引用以及内部类的理解的使用技巧和注意事项,需要的朋友参考一下 最近利用下班的时候看了看的think in java感觉再看 和第一次看大不一样 接下来说一下java中对象和引用的关系,以及内部类的概念。 1、java中一切都是对象  在java中是什么来操作者对象呢?答案是引用,这就好比C或者

  • 本文向大家介绍计算一个Java对象占用字节数的方法,包括了计算一个Java对象占用字节数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法。分享给大家供大家参考。具体分析如下: 通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:   某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲

  • 我们已经研究了类和对象的多个内容以及与它们相关的多个术语。通过本章,你已经了解了面向对象的编程的优点和缺陷。Python是一个高度面向对象的语言,理解这些概念会在将来有助于你进一步深入学习Python。 接下来,我们将学习如何处理输入/输出已经如何用Python访问文件。

  • 本文向大家介绍如何计算Java对象占用了多少空间?,包括了如何计算Java对象占用了多少空间?的使用技巧和注意事项,需要的朋友参考一下 本文介绍了计算Java对象占用了多少空间的方法,分享给大家供大家参考,具体内容如下 一、对象头 对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下: 1、对象的HashCode,锁信息等 2、到对象类型数据的指针 3、数组的长度(如果是数组的

  • 问题内容: 如果知道与该线程关联的ID,该如何获取正在运行的线程的引用? 例如 问题答案: 您有2种方法可以做到。两者都很简单: 旧方法:获取您可以循环访问..getParent()的根线程组。并打电话 较新(但速度较慢)。 第一种方法有一个小问题,由于存在错误,ThreadGroup可能根本无法枚举任何东西。 第二个比较慢,但是有安全漏洞。

  • 我们已经讨论了类/对象可以拥有像函数一样的方法,这些方法与函数的区别只是一个额外的self变量。现在我们来学习一个例子。 使用对象的方法 例11.2 使用对象的方法 #!/usr/bin/python # Filename: method.py classPerson:     defsayHi(self):         print'Hello, how are you?' p = Perso