最近我在写一个类时发现,通过增加代码复杂性可以减少实例内存消耗约10个字节/元素,但代价是增加编译的.class文件大小约10KB。
我假设JVM必须将.class文件加载到内存中,因此除非有至少1000个元素左右,否则这些更改不会回报成本。但是,除非额外的10KB在类文件中是增加代码复杂性的唯一代价,否则这种算法行不通。
这篇Oracle博客指出,在永久区中,类所消耗的额外内存并不仅仅基于.class文件——例如,我怀疑更复杂的代码可能需要更多内存来存储优化元数据。
因此,这个问题有两个部分:
- 我该如何测量特定类的永久区实际内存消耗?无论是运行时使用一些工具进行检测,还是使用分析工具?
- 在编写过程中是否有一种方法可以估计类的永久区内存消耗?(使用某些背景知识,您可以在编写实例时估计内存消耗;我想知道是否可以估计类本身在永久区中的内存消耗。)
欢迎提供Dalvik VM的类似细节,但我主要关注OpenJDK和其他“主流”JVM。