8 GiB 文件,256 MiB Java heap
LogoRRR 26.8.0 · 性能实测
文件大小不再受限于
Java heap 容量。
打开数 GiB 的日志,跳到中间或末尾,Java heap 仍保持在固定范围内。本次测试的最大文件为 8 GiB,Java heap 上限仅 256 MiB。
$ open production.log
- 文件
- 8 GiB
- Java heap 上限
- 256 MiB
- 首个窗口
- 155 ms
- 保留的 Java heap
- 3.62 MiB
- 进程 PSS
- 159.2 MiB
开头 · 中间 · 末尾均可用
8 GiB 受限内存测试
访问开头、中间和末尾之后
使用 2 GiB 测试文件对比 26.8.0 与 26.2.0
架构变化
从“整个文件装入内存”转为“按需读取”
在 26.8.0 之前,文件越大,内存中保留的行对象就越多,数量可达数百万。out-of-core 引擎只维持固定大小的工作集,并在需要时读取相应的源文件窗口。
2 GiB 测试文件保留了约 3.21 GiB Java heap。测试 4 GiB 文件时,三个已发布版本都耗尽了 4 GiB Java heap。
访问 8 GiB 文件的开头、中间和末尾后,保留的 Java heap 只有 3.62 MiB;测试时 Java heap 上限为 256 MiB。
同一文件 · 同为 4 GiB Java heap
四代 LogoRRR 打开同一个 2 GiB 日志
每个值都是三次成功运行的中位数;每次运行前均清除该测试文件的缓存。下方的小字范围表示实测最快值和最慢值。
| 版本 | 引擎 | 就绪 | 保留的 Java heap | PSS 峰值 | 运行次数 |
|---|---|---|---|---|---|
| 24.4.0 | 全量驻留 | 7.66 s | 3.08 GiB | 4.19 GiB | 3 |
| 25.2.0 | 全量驻留 | 8.41 s | 3.21 GiB | 4.21 GiB | 3 |
| 26.2.0 | 全量驻留 | 9.89 s | 3.21 GiB | 4.21 GiB | 3 |
| 26.8.0 | out-of-core | 144 ms | 3.58 MiB | 159.2 MiB | 3 |
可用数据出现速度提高 69 倍,保留的 Java heap 降至原来的 1/918。 结果来自 2 GiB 测试文件,对比 26.8.0 与本次测试中最新的已发布版本 26.2.0。
过去的内存上限
已发布版本在 4 GiB 文件处耗尽 Java heap,26.8.0 仍可继续
Java heap 设为 4 GiB 时,所有版本都通过了 2 GiB 文件测试。文件增至 4 GiB 后,所有全量驻留引擎都耗尽了 heap。新引擎通过了 4 GiB 和 8 GiB 两项测试。
| 文件 | 24.4.0 | 25.2.0 | 26.2.0 | 26.8.0 |
|---|---|---|---|---|
| 500 MiB | ✓ 通过 | ✓ 通过 | ✓ 通过 | ✓ 通过 |
| 1 GiB | ✓ 通过 | ✓ 通过 | ✓ 通过 | ✓ 通过 |
| 2 GiB | ✓ 通过 | ✓ 通过 | ✓ 通过 | ✓ 通过 |
| 4 GiB | × Java heap 已耗尽 | × Java heap 已耗尽 | × Java heap 已耗尽 | ✓ 通过 |
| 8 GiB | — 未再次运行 | — 未再次运行 | — 未再次运行 | ✓ 通过 |
某版本一旦耗尽 Java heap,更大的测试文件便标为“未再次运行”,不再重复相同的失败。
受限内存测试
文件增大 8 倍,内存占用基本不变
LogoRRR 26.8.0 的 Java heap 上限设为 256 MiB。文件从 1 GiB 增至 8 GiB 时,保留的 Java heap 始终约为 3.6 MiB,进程总 PSS 约为 159 MiB。
- 开头
- 152 ms
- 中间
- 13 ms
- 末尾
- 6 ms
- Java heap
- 3.56 MiB
- PSS
- 157.3 MiB
- 开头
- 146 ms
- 中间
- 13 ms
- 末尾
- 7 ms
- Java heap
- 3.58 MiB
- PSS
- 160.0 MiB
- 开头
- 146 ms
- 中间
- 14 ms
- 末尾
- 9 ms
- Java heap
- 3.59 MiB
- PSS
- 158.9 MiB
- 开头
- 155 ms
- 中间
- 18 ms
- 末尾
- 12 ms
- Java heap
- 3.62 MiB
- PSS
- 159.2 MiB
每个值都是三次运行的中位数。下方方法表列出了各窗口的实测范围。
现在的实际约束
决定速度的是存储吞吐量,而不是与文件大小成正比的内存
返回首个窗口不再需要读取完整源文件。不过,必须检查每个字节的操作仍受硬盘和文件系统速度影响。
另一项使用 500 MiB 测试文件的精确搜索中,3.38 s 后出现首个匹配;完整扫描耗时 34.8 s,吞吐量为 14.4 MiB/s。
方法与数据来源
可复现,并采用保守边界的测量
测试使用各个构建版本的真实加载器代码和确定生成的非稀疏文件。每次运行都启动独立 JVM,进程内存数据来自操作系统测量。
受控输入
使用固定行宽、确定生成的 UTF-8 日志行;非稀疏文件在测量前生成。
冷文件策略
每次运行前清除测试文件对应的操作系统缓存,但不清空全局缓存。
进程内存
垃圾回收后采样保留的 Java heap。比例集大小峰值(PSS)读取自 /proc/<pid>/smaps_rollup.
两组测试
一组使用 4 GiB Java heap,对比每个版本直至其失败点;另一组把 26.8.0 限制在 256 MiB Java heap,测试 1、2、4 和 8 GiB 文件。
| 文件 | 首个窗口 | 中间 | 末尾 | 保留的 Java heap | PSS 峰值 |
|---|---|---|---|---|---|
| 1 GiB | 152 ms 149–159 | 13 ms 12–14 | 6 ms 6–7 | 3.56 MiB | 157.3 MiB |
| 2 GiB | 146 ms 143–146 | 13 ms 12–13 | 7 ms 7–7 | 3.58 MiB | 160.0 MiB |
| 4 GiB | 146 ms 141–153 | 14 ms 13–15 | 9 ms 9–10 | 3.59 MiB | 158.9 MiB |
| 8 GiB | 155 ms 153–157 | 18 ms 15–18 | 12 ms 12–12 | 3.62 MiB | 159.2 MiB |
测试环境
Ubuntu 24.04.4 LTS, aarch64, 8 logical CPUs, openjdk version "25.0.2" 2026-01-20.
构建版本
- 24.4.0 — 发布于 2024-06-06, 构建产物
logorrr_24.4.0_arm64.deb, SHA-25627a4aea231dc78ba4b3838cc57361728bc714926f9270731bd7637eba8dda065 - 25.2.0 — 发布于 2025-12-23, 构建产物
logorrr_25.2.0_arm64.deb, SHA-256f8de52dccb4224a25b0689aaef9d64618e98102d7134e637b249d1830c516fb1 - 26.2.0 — 发布于 2026-03-03, 构建产物
logorrr_26.2.0_arm64.deb, SHA-256cfec5dd09753ba90167199aa5d94f388448fc518f7629bf598b7debb01489cca - 26.8.0 — 发布收尾阶段的源代码快照
f5e31853, 以 26.8.0 构建并测量
证据标识
对比结果 SHA-256: 7de25d018ba40d51504ccd265f03a5ef8167bd9ae52d543e66880444d5223024
压力测试 SHA-256: 7f480db156fd24d6fa3d6946ea24c003ae8dd54abff5a3621c646aff2b58281e
这些结果只适用于本次测试文件、设备和测试流程,并不代表所有硬盘或工作负载。“受存储限制”表示实测的文件大小上限不再与保留的 Java heap 成正比;需要读取完整源文件的操作仍取决于存储吞吐量。最大测试文件:8 GiB。
LogoRRR Pro
打开过去因过大而无法处理的日志
完整文件访问是 LogoRRR Pro 功能。免费预览会保留明确限制,让你先体验工作流程,再解锁大文件处理能力。