#gc #垃圾收集 #分配 #收集 #垃圾 #单元测试 #测试框架

mmtk

MMTk是一个用于设计和实现高性能且可移植内存管理器的框架

26个重大版本发布

新版本 0.27.0 2024年8月9日
0.26.0 2024年7月1日
0.25.0 2024年5月17日
0.23.0 2024年2月9日
0.1.0 2020年11月4日

55次下载

Download history 23/week @ 2024-04-29 23/week @ 2024-05-06 201/week @ 2024-05-13 75/week @ 2024-05-20 30/week @ 2024-05-27 35/week @ 2024-06-03 37/week @ 2024-06-10 1/week @ 2024-06-17 206/week @ 2024-07-01 99/week @ 2024-08-05

99每月下载量
用于hadron_slang

MIT/Apache

2MB
SLoC 34K

MMTk

crates.io MSRV docs.rs project chat

MMTk是一个用于设计和实现高性能且可移植内存管理器的框架。该仓库包含MMTk的Rust版本。

内容

要求

我们维护了构建MMTk及其绑定所需的前提条件列表在mmtk-dev-env仓库中。

构建

MMTk可以使用稳定的Rust工具链构建。我们使用特定的Rust版本,并指定了最小支持的Rust版本(MSRV)。在Cargo.toml文件中,我们指定了Rust版本和Cargo配置。

$ cargo build

MMTk 还提供了一组可选功能列表,用户可以选择使用。可以通过检查 Cargo.toml 来查看所有可用功能。通过将 --features 标志传递给 Rust 编译器,我们可以条件编译与功能相关的代码。例如,您可以通过将 sanity 添加到您想使用的功能集中来选择性地启用合理性检查。

您可以将 --release 标志传递给 cargo build 命令来使用 Rust 的优化编译器以提高性能。

构建过程中产生的工件可以在 target/debug(或发布构建的 target/release)下找到。

ci-build.sh 展示了 CI 测试的构建。

基于配置文件指导的优化构建

为了获得最佳性能,我们建议使用基于配置文件指导的优化(PGO)构建。Rust 通过挂钩到 LLVM 分析基础设施来支持 PGO 构建。其基本思想是通过运行一个代表性的基准测试来收集分析数据,然后后来使用分析数据作为优化决策的反馈。

建议在分析步骤中选择性能最佳的 GC。例如,我们为我们的 OpenJDK 绑定 使用了 GenImmix。我们建议在压力下运行 GC(使用 MMTK_STRESS_FACTORMMTK_PRECISE_STRESS=false)以调整 GC 的配置样本数据。还建议多次运行基准测试以减少方差。

有关如何进行 PGO 构建的示例,请参阅 OpenJDK 绑定

使用

MMTk 不能独立运行。您需要将 MMTk 与语言实现集成。您可以选择尝试我们已经开发的一个 VM 绑定,或者在自己的 VM 中为 MMTk 实现自己的绑定。您还可以在 MMTk 中实现自己的 GC 算法,并使用支持的 VM 运行它。您可以在 此处 找到 mmtk-core 的最新完整 API 文档。

尝试我们的当前绑定

我们维护了 MMTk 的三个 VM 绑定。这些绑定可在以下存储库中访问

有关这些绑定的更多信息,请访问它们的存储库。

实现您的绑定

MMTk 与语言 VM 提供双向接口。

  1. MMTk 提供了一组 API。语言 VM 可以通过这些 API 调用 MMTk。
  2. MMTk 提供了一个 VMBinding 特性,每个语言 VM 都必须实现。MMTk 使用 VMBinding 来调用 VM。

要将 MMTk 集成到您的语言实现中,您需要提供一个 VMBinding 的实现,并根据需要调用 MMTk 的 API。

如需更多信息,您可以参考我们的迁移指南,面向VM实现者。我们还维护一个迁移指南,以帮助VM实现者将MMTk迁移到新版本。

实现您的GC

MMTk是一系列GC算法的集合(在MMTk中称为计划)。MMTk提供了可重用的组件,使得根据这些组件构建自己的GC变得简单。如需更多信息,您可以参考我们的教程,面向GC实现者。

测试

我们在CI中既使用单元测试也使用VM绑定测试来测试MMTk。

单元测试

MMTk使用Rust的测试框架进行单元测试。例如,您可以使用以下命令运行单元测试。

$ cargo test

我们CI中运行的所有单元测试的完整列表可以在这里找到。

VM绑定测试

MMTk还通过运行VM的标准测试/基准测试套件来测试我们维护的VM绑定。有关详情,请参考每个VM绑定仓库。

支持的Rust版本

MMTk在仓库中使用一个固定的Rust版本(记录在rust-toolchain文件中)。我们使用固定的Rust版本运行我们的测试和基准。我们建议在开发中使用固定的Rust版本。我们会在mmtk-core的发布周期之间更新固定的Rust版本,以保持其接近最新的Rust稳定版。mmtk-core的发布周期为六周,大致与Rust本身相同。

我们的最小支持Rust版本(MSRV)策略是“N-1”(请注意,N不是当前稳定版Rust)。这意味着我们还确保mmtk-core与在rust-toolchain中指定的版本之前的那个小版本的工具链能够正常工作。例如,如果rust-toolchain包含“1.61.2”,则MSRV将保证不会晚于“1.60.0”。当我们需要利用新的Rust功能或需要更新Rust的依赖库时,我们可能会将MSRV提升到“N-1”。换句话说,我们不会急于提升MSRV,实际上MSRV可能落后于“N-1”。然而,用户不应该依赖于这种滞后,并鼓励使用最新的Rust工具链,而不是依赖于过时的Rust版本。

然而,请注意,当MMTk达到稳定状态时,我们可能在将来切换到更保守的MSRV策略。

为MMTk做出贡献

感谢您对为MMTk做出贡献的兴趣。我们感谢所有贡献者。通常,您可以通过报告遇到的MMTk错误或提交您的补丁到MMTk来为MMTk做出贡献。有关详情,您可以参考我们的贡献指南

依赖项

~5–35MB
~533K SLoC