最近,我写了一个类,在其中我发现我可以减少~10个字节/元素的内存消耗,但这只是以使代码更加复杂为代价.这使编译.class文件的大小增加了大约10KB.
我假设JVM必须将.class文件加载到内存中,因此除非至少有1000个元素,否则这些更改不会为自己付费.但是,除非类文件中额外的10KB是增加代码复杂性的唯一成本,否则该算法无法解决.
这个Oracle博客表明,permgen中的类消耗了相当多的额外内存,而不仅仅是基于.class文件 - 例如,我怀疑更复杂的代码可能需要更多的内存来优化元数据.
所以,这个问题有两个部分:
Dalvik VM的类似细节将不胜感激,但我主要关注的是OpenJDK和其他"主流"JVM.
\n\n\n如何测量特定类的实际 permgen 内存消耗?是在运行时使用一些仪器,还是使用分析工具?
\n
一种方法可能是加载类以在不同的类加载器中进行测量并jmap -permstat按照本博客条目中的介绍进行使用。
\n\n对于每个类加载器对象,都会打印以下详细信息:
\n\n\n
\n- 运行实用程序时快照中类加载器对象 \xe2\x80\x93 的地址。
\n- 加载的类的数量(由该加载器使用方法(java.lang.ClassLoader.defineClass)定义)。
\n- 该类加载器加载的所有类的元数据消耗的大约字节数。
\n- 父类加载器的地址(如果有)。
\n- \xe2\x80\x9clive\xe2\x80\x9d 或 \xe2\x80\x9cdead\xe2\x80\x9d 指示 \xe2\x80\x93 指示加载器对象将来是否会被垃圾收集。
\n- 该类加载器的类名。
\n