我如何估计一个班级的总permgen记忆消耗量?

时间:2012-06-11 18:16:27

标签: java jvm permgen

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

我认为JVM必须将.class文件加载到内存中,因此除非至少有1000个元素,否则这些更改不会为自己付费。但是,除非类文件中额外的10KB是增加代码复杂性的唯一成本,否则该算法无效。

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

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

  • 如何衡量特定班级的实际permgen内存消耗?在运行时使用某些工具还是使用性能分析工具?
  • 有没有办法估算班级的permgen内存消耗,因为我正在编写它? (使用some background knowledge,您可以在编写类实例时估计类实例的内存消耗;我想知道我们是否可以估计类本身的permgen内存消耗。)

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

2 个答案:

答案 0 :(得分:4)

  

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

一种方法可能是加载要在不同的类加载器中进行测量的类,并使用此blog entry中显示的jmap -permstat

  

对于每个类装入器对象,将打印以下详细信息:

     
      
  1. 类加载器对象的地址 - 在运行实用程序时的快照上。
  2.   
  3. 加载的类数(由此加载器使用方法(java.lang.ClassLoader.defineClass)定义。
  4.   
  5. 此类加载器加载的所有类的元数据消耗的大致字节数。
  6.   
  7. 父类加载器的地址(如果有)。
  8.   
  9. “实时”或“死”指示 - 指示将来是否会对装载程序对象进行垃圾回收。
  10.   
  11. 此类加载器的类名。
  12.   

答案 1 :(得分:0)

这是对你的第二点的回答;我不确定这会有多大用处,但我发现演示文稿Building Memory-efficient Java Applications: Practices and Challenges中的幻灯片对于估计各种Java对象的大小和健康状况非常有帮助。在估算32位和64位JVM中对象的大小时,他会详细介绍,并提供指针,使您的对象更具内存效率。