JEP 147:减少类元数据占用量
概括
减少 HotSpot 的类元数据内存占用,以提高小型设备上的性能。
成功指标
通过计算相关数据结构使用的空间(但不包括字节码和内部字符串使用的空间)来测量,将类、方法和字段元数据内存占用量减少 25%。
典型应用程序的启动和运行时性能下降不得超过 1%。
描述
CVM(一种用于 Java ME CDC 的嵌入式 JVM)中使用的许多内存减少技术都可以应用于 HotSpot。例如:
-
将很少使用的字段保留在类、方法和字段数据结构之外。
-
使所有结构字段尽可能小。
-
对某些字段进行编码,以便它们适合较小的类型。
-
不要以导致不必要填充的方式混合字段大小(即,相似大小的组类型)。
-
对于某些类型的数据,使用 16 位偏移量而不是 32 位指针。
-
当同时使用的字段组不超过一个时,请对字段组使用并集。根据类所处的状态,某些字段将具有不同的含义。
-
避免将 存储
cb*
在每个fb
和中mb
。 -
方法可以是抽象的、本机的或 Java 的。特定于这三种类型之一的任何数据都保存在单独的结构中,因此方法数据结构不携带并不总是需要的字段。
-
与已编译方法相关的数据在方法编译之前不会分配。
-
保留 Java 调试信息是可选的,并且通常在生产版本中禁用。
-
常量池条目(包括类型信息)为 40 位。
-
压缩 GC 位图以描述类中的哪些字段是引用类型。这通常只适合 32 位。
-
为加载的类分配内存时,限制 malloc 的数量以及由此产生的每个 malloc 块的开销。该类的大部分内容都放置在一个大型 malloc 分配中。
例如,以下四个布尔字段instanceKlass.hpp
可以组合成一个u1
字段:
bool _is_marked_dependent; // used for marking during flushing & deopt
bool _rewritten; // methods rewritten
bool _has_nonstatic_fields; // for sizing with UseCompressedOops
bool _should_verify_class; // allow caching of preverification
影响
- 其他 JDK 组件:了解类元数据格式的工具