跳到主要内容

JEP 149:减少核心库内存使用量

概括

减少核心库类使用的动态内存,而不会对性能产生不利影响。

成功指标

现有的工作负载和指标(包括 SPECjbb2005 和 SPECjvm98)将用于判断这些更改的好处和影响。

动机

减少核心库类的动态内存(堆)使用量将增加可以在 Java 运行时的给定内存分配内运行的应用程序的大小,允许更多应用程序以相同的动态占用空间运行,并提高吞吐量由于更有效的内存使用,应用程序的数量。

描述

寻找实际减少动态内存量的工作与其他性能工作并行。将识别和检查典型的工作负载,以确定可能的改进机会。将对库类进行各种改进,以减少堆使用并改进相关的本机实现,并将对其进行原型设计并评估其有效性。将使用现有工作负载和指标(包括 SPECjbb2005 和 SPECjvm98)来衡量性能影响。

将纳入减少动态内存使用而不影响性能并且可在源代码中长期维护的改进。仅对某些应用程序有效的更改应该是可配置的,以便可以根据需要启用或禁用它们。

候选者:减小对象大小

仅当对类应用特定操作时才使用其中的几个字段java.lang.Class,例如反射、注释访问和类重新定义(通过 JVMTI)。

Class当不需要这些字段时,将这些字段移动到单独的帮助器类可以减少对象的大小。但相反,必须注意的是,如果需要任何字段,那么我们不仅需要恢复相同的有效对象大小,而且还为辅助引用添加了 4 个字节,为辅助对象本身添加了 8 个字节。

支持反射缓存和注释的字段可以移动到辅助类,而不影响虚拟机或序列化。反射和注释信息访问器对性能不是特别敏感,但应测量并潜在地调节由于间接引起的性能影响。

一般来说,将不常用的字段移至辅助类将减少典型情况下的分配,但额外的间接寻址可能会对性能产生影响,必须测量和考虑这一点。

候选:禁用反射编译器

反射编译器为方法调用生成字节码以提高性能。禁用编译器将减少动态占用空间。在专门设计的测试中,性能损失可能很大,但在不严重依赖反射的典型应用程序中,性能损失预计相当小。

候选:杂项内存减少

其他内存减少需要通过分析候选应用程序中的堆使用情况来调查。可能的减少包括调整内部表、缓存和缓冲区的初始大小以减少浪费。