12

最近,我正在编写一个类,在其中我发现我可以将实例的内存消耗减少约 10 字节/元素,但代价是使代码更加复杂。这将编译文件的大小增加了.class约 10KB。

我假设 JVM 必须将.class文件加载到内存中,因此除非至少有 1000 个左右的元素,否则这些更改不会为自己付出代价。但是除非类文件中额外的 10KB 是增加代码复杂性的唯一代价,否则这种算法是行不通的。

这个 Oracle 博客表明,permgen 中的类消耗了大量的额外内存,而不仅仅是基于.class文件 - 例如,我怀疑更复杂的代码可能需要更多内存来优化元数据。

所以,这个问题有两个部分:

  • 如何测量特定类的实际 permgen 内存消耗?是在运行时使用一些仪器,还是使用分析工具?
  • 有没有办法在我写它的时候估计这个类的 permgen 内存消耗?(有了一些背景知识,您可以在编写类实例时估计它们的内存消耗;我想知道我们是否可以估计类本身的 permgen 内存消耗。)

Dalvik VM 的类似细节将不胜感激,但我主要关注 OpenJDK 和其他“主流”JVM。

4

2 回答 2

4

如何测量特定类的实际 permgen 内存消耗?是在运行时使用一些仪器,还是使用分析工具?

一种方法是在不同的类加载器中加载要测量的类,并jmap -permstat按照此博客条目中的说明使用。

对于每个类加载器对象,打印以下详细信息:

  1. 类加载器对象的地址——在实用程序运行时的快照中。
  2. 加载的类的数量(由这个加载器使用方法(java.lang.ClassLoader.defineClass)定义。
  3. 此类加载器加载的所有类的元数据消耗的近似字节数。
  4. 父类加载器的地址(如果有)。
  5. “活”或“死”指示——指示加载器对象将来是否会被垃圾收集。
  6. 此类加载器的类名。
于 2012-06-12T11:35:40.380 回答
0

这是对第二点的回答;我不确定这会有多大用处,但我发现演示文稿构建内存高效的 Java 应用程序:实践和挑战中的幻灯片对于估计各种 Java 对象的大小和健康状况非常有帮助。在估计 32 位和 64 位 JVM 中对象的大小时,他详细介绍了很多细节,并且还提供了指针以使您的对象更节省内存。

于 2012-06-11T18:28:44.717 回答