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

Lou*_*man 12 java jvm permgen

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

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

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

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

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

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

fgl*_*lez 4

\n

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

\n
\n\n

一种方法可能是加载类以在不同的类加载器中进行测量并jmap -permstat按照本博客条目中的介绍进行使用。

\n\n
\n

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

\n\n
    \n
  1. 运行实用程序时快照中类加载器对象 \xe2\x80\x93 的地址。
  2. \n
  3. 加载的类的数量(由该加载器使用方法(java.lang.ClassLoader.defineClass)定义)。
  4. \n
  5. 该类加载器加载的所有类的元数据消耗的大约字节数。
  6. \n
  7. 父类加载器的地址(如果有)。
  8. \n
  9. \xe2\x80\x9clive\xe2\x80\x9d 或 \xe2\x80\x9cdead\xe2\x80\x9d 指示 \xe2\x80\x93 指示加载器对象将来是否会被垃圾收集。
  10. \n
  11. 该类加载器的类名。
  12. \n
\n
\n