最近,我写了一个类,在其中我发现我可以将实例的内存消耗减少~10个字节/元素,但这只会使代码变得更加复杂。这使编译的.class
文件的大小增加了大约10KB。
我认为JVM必须将.class
文件加载到内存中,因此除非至少有1000个元素,否则这些更改不会为自己付费。但是,除非类文件中额外的10KB是增加代码复杂性的唯一成本,否则该算法无效。
This Oracle blog表明permgen中的类消耗了相当多的额外内存,而不仅仅基于.class
文件 - 例如,我怀疑更复杂的代码可能需要更多内存来优化元数据。
所以,这个问题有两个部分:
Dalvik VM的类似细节将不胜感激,但我主要关注的是OpenJDK和其他“主流”JVM。
答案 0 :(得分:4)
如何测量特定类的实际permgen内存消耗?在运行时使用某些工具还是使用性能分析工具?
一种方法可能是加载要在不同的类加载器中进行测量的类,并使用此blog entry中显示的jmap -permstat
。
对于每个类装入器对象,将打印以下详细信息:
- 类加载器对象的地址 - 在运行实用程序时的快照上。
- 加载的类数(由此加载器使用方法(java.lang.ClassLoader.defineClass)定义。
- 此类加载器加载的所有类的元数据消耗的大致字节数。
- 父类加载器的地址(如果有)。
- “实时”或“死”指示 - 指示将来是否会对装载程序对象进行垃圾回收。
- 此类加载器的类名。
醇>
答案 1 :(得分:0)
这是对你的第二点的回答;我不确定这会有多大用处,但我发现演示文稿Building Memory-efficient Java Applications: Practices and Challenges中的幻灯片对于估计各种Java对象的大小和健康状况非常有帮助。在估算32位和64位JVM中对象的大小时,他会详细介绍,并提供指针,使您的对象更具内存效率。