跳到主要内容

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 组件:了解类元数据格式的工具