【发布时间】:2012-06-14 16:06:29
【问题描述】:
最近,我正在编写一个类,在该类中我发现我可以将实例的内存消耗减少约 10 字节/元素,但代价是使代码更加复杂。这将编译后的 .class 文件的大小增加了约 10KB。
我假设 JVM 必须将 .class 文件加载到内存中,因此除非至少有 1000 个左右的元素,否则这些更改不会收回成本。但是,除非类文件中额外的 10KB 是增加代码复杂性的唯一成本,否则该算法行不通。
This Oracle blog 表明 permgen 中的类消耗了相当多的额外内存,而不仅仅是基于.class 文件——例如,我怀疑更复杂的代码可能需要更多内存用于优化元数据。
所以,这个问题有两个部分:
- 如何测量特定类的实际 permgen 内存消耗?是在运行时使用一些工具,还是使用分析工具?
- 有没有一种方法可以在我编写该类时估计它的 permgen 内存消耗? (使用some background knowledge,您可以在编写类实例时估计它们的内存消耗;我想知道我们是否可以估计类本身的永久内存消耗。)
Dalvik VM 的类似细节将不胜感激,但我主要关注 OpenJDK 和其他“主流”JVM。
【问题讨论】:
-
内存需求也取决于 HotSpot 是否编译它。 JITed 代码有其自身的成本。
-
@JesseWilson:这显然是正确的,但有没有一种好的方法来估算成本?只是原始组件的消耗,还是有很多额外的簿记?
-
我可能会说一些奇怪的东西,但是既然 XXX.class 是 Class 的一个实例,我们就不能使用与普通实例相同的方法吗?像 Java 代理的 getObjectSize 方法一样?但也许它不包括你所说的“优化元数据”