Java Leyden可3倍提高JVM启动和预热时间
内容提要
Java Leyden是一个用于改进Java程序启动时间和性能的存储库,通过优化缓存、类处理、方法配置文件、常量池解析、方法编译、动态代理和反射数据生成以及类加载器查找缓存等方式,显著提高JVM的启动和预热时间。
延伸解读
训练运行:启动优化的关键
Leyden 的核心思路是将部分工作从运行时转移到训练运行阶段。在训练运行中,系统根据应用程序的实际行为预先计算信息,并将字节码预编译为本机代码。这样,生产运行时就能直接利用这些预计算数据,从而显著缩短启动和预热时间。这种方法尤其适合需要快速启动的应用场景。
统一缓存数据存储:CDS 的增强
统一缓存数据存储(JDK-8320264)是对 CDS 的重要增强。现在 CDS 不仅能存储类元数据和堆对象,还能存储分析数据以及已编译的 Java 方法。同时,CDS 档案的创建过程被简化,便于在 Java 应用程序中使用。该功能通过新的 VM 标志 -XX:CacheDataStore 启用。
方法配置文件与提前编译:加速预热
通过将训练运行中的方法配置文件存储在 CDS 档案中(JDK-8325147),JIT 能在预热期间更早开始编译,使应用更快达到最佳性能。此外,训练运行期间经常使用的方法可以提前编译并与 CDS 档案一起存储,从而在生产运行时本地执行。相关标志包括 -XX:+RecordTraining、-XX:+ReplayTraining 以及 -XX:+StoreCachedCode 等。
其他优化:常量池、动态代理与反射
Leyden 还包含多项优化:提前解析常量池条目(通过 -XX:+ArchiveFieldReferences 等标志)可加快启动并改善 AOT 代码生成;提前生成动态代理(-XX:+ArchiveDynamicProxies)和反射数据(-XX:+ArchiveReflectionData)能缩短启动时间;类加载器查找缓存(-XX:+ArchiveLoaderLookupCache)则优化了按名称的类查找,避免扫描类路径。
Q&A
Java Leyden如何提高JVM的启动时间?
Java Leyden通过优化缓存、类处理、方法配置文件等方式,显著提高JVM的启动和预热时间。
Leyden的训练运行是什么?
训练运行是根据应用程序实际行为预先计算信息并将字节码预编译为本机代码的过程。
CDS档案在Java Leyden中有什么作用?
CDS档案用于存储分析数据和已编译的Java方法,使JVM在启动时能够立即加载类。
如何提前解析常量池条目?
可以通过新的VM标志如-XX:+ArchiveFieldReferences和-XX:+ArchiveMethodReferences在训练运行期间提前解析常量池条目。
Java Leyden支持哪些优化功能?
Java Leyden支持统一缓存数据存储、提前编译方法、提前生成动态代理和反射数据等优化功能。
类加载器查找缓存的优化有什么好处?
类加载器查找缓存优化允许快速完成类查找,提升效率,避免扫描类路径。