Page 22 - 《软件学报》2026年第7期
P. 22
赵英全 等: 基于大语言模型的 Java 新特性测试程序生成 2707
错能力. 为此, 本实验从现有工作中收集了历史揭错测试程序作为种子程序 [34] . 这些测试程序由现有工作从
OpenJDK 仓库中收集整理, 用于分析 JVM 缺陷在不同模块中的分布以及对应模块测试程序的程序特征. 为确保
种子程序的有效性, 本实验对原始数据集进行了清洗, 过滤了其中存在编译错误、执行异常以及可以直接触发
Java 编译器和 JVM 不一致行为的测试程序, 仅保留其余可以正常编译并执行的测试程序作为种子程序集合.
最终, 本实验收集到共计 390 个历史揭错测试程序作为种子程序, 种子程序信息如表 2 所示. 表 2 中展示了不
同种子程序所测试的模块、各模块下种子程序的数量、所有种子程序的代码行数量、定义的变量和函数数量.
通过对种子程序的分析可以发现, 本实验所使用的种子程序覆盖了 HotSpot 的 3 个核心模块, 分别是 Compiler、
Runtime 以及 GC (garbage collection). 根据已有工作的分析, 这些测试程序针对不同模块的功能进行设计, 具有各自
显著的程序结构特征. 此外, 本文对种子程序的结构特征做了进一步分析, 结果表明: 所有种子程序中共计包含 7 071 个
变量定义和 1 154 个函数定义. 这些丰富的程序特征以及变量和函数定义, 为新生成的代码片段提供了丰富的上下
文信息, 有助于生成更高质量的测试程序.
表 2 种子程序描述
数据集名称 模块 种子程序数量 代码行数量 变量定义数量 函数定义数量
Compiler 352 25 873 6 614 1 078
OpenJDKTests Runtime 25 462 88 57
GC 13 696 369 19
总计 390 27 031 7 071 1 154
本文在 4 个长期支持的 OpenJDK 版本 8、11、17 以及 21 上进行测试, 分别选择两款主流的 Java 编译器 javac
和 ECJ 以及两款主流的 Java 虚拟机 HotSpot 和 OpenJ9 作为测试对象. 其中, javac 是 OracleJDK 和 OpenJDK 中
提供的官方 Java 编译器, 而 ECJ 则是 Eclipse 项目中的 Java 编译器实现, 被广泛地应用于 Eclipse IDE 和相关的工
具链之中. 相似地, HotSpot 是 OracleJDK 和 OpenJDK 中默认的 JVM 实现, 以其性能优化 (如 JIT 编译器、逃逸分
析等) 而闻名, 是目前最主流的 Java 执行引擎之一. OpenJ9 是由 IBM 维护的高性能 JVM 实现, 起源于 IBM J9 VM,
现为 Eclipse 基金会的一部分. OpenJ9 以其低内存开销和快速启动时间等优势, 目前广泛应用于云计算和容器化
环境中.
表 3 展示了本实验所使用的 Java 编译器和 JVM 的详细信息.
表 3 测试对象描述
OpenJDK版本 测试对象 历史版本 最新版本
javac 1.8.0_302 1.8.0_442
Java编译器
ECJ 3.10.0 3.41.0
OpenJDK 8
Java虚拟机 HotSpot 25.211-b12 25.431-b10
OpenJ9 0.27.0 0.49.0
javac 11 11.0.26
Java编译器
ECJ 3.16.0 3.41.0
OpenJDK 11
Java虚拟机 HotSpot 11+28 11.0.25+9
OpenJ9 0.27.0 0.49.0
javac 17 17.0.14
Java编译器
ECJ 3.28.0 3.41.0
OpenJDK 17
Java虚拟机 HotSpot 17+35 17.0.13+10
OpenJ9 0.29.1 0.49.0
javac 21 21.0.6
Java编译器
ECJ 3.36.0 3.41.0
OpenJDK 21
Java虚拟机 HotSpot 21+35 21.0.5+9
OpenJ9 0.42.0 0.49.0
具体来说, 本实验分别选择了每个 Java 编译器和 JVM 实现的历史版本和最新版本作为测试对象. 其中, 历史

