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  实现的历史版本和最新版本作为测试对象. 其中, 历史
   17   18   19   20   21   22   23   24   25   26   27