What's new
Memory hardening — three-layer protection against OOM
Low-RAM hosts (≤ 4 GB heap) used to accumulate residual garbage between tests and eventually crash with
OutOfMemoryError. Three layered guards now make that virtually impossible:
- Post-cleanup GC — every test triggers an aggressive 3-cycle GC at the end of cleanup. Recovers the 10-15 % of peak heap each test would otherwise leak.
- Pre-flight memory budget — before starting a test, heap usage is checked: under 75 % proceeds; 75-85 % warns and runs a pre-emptive GC; 85 %+ refuses the test as Skipped with reason memoryPressure.
- Runtime OOM watchdog — async poller aborts the active test if heap stays at 92 % for 3+ consecutive seconds, before the JVM crashes hard.
All three are togglable via
config.yml under
benchmark.post-cleanup-gc,
benchmark.memory-budget.*,
benchmark.memory-watchdog.*.
Hosting environment detection — know what host you're on
Five probes (filesystem, plugins, env vars, JVM resources, cgroups) classify the host into one of five tiers:
DEDICATED_OR_VPS →
LIKELY_PAID_HOSTED →
SUSPECTED_FREE →
LIKELY_FREE →
CONFIRMED_FREE. Vendor-specific markers identify Aternos, Minehut, FalixNodes, Server.pro and the MSH hibernation wrapper. Surfaces as a chat warning at
/bench start when free-tier is detected, and as a new
hostingEnvironment block in benchmark reports so the leaderboards can filter unreliable runs out automatically.
Hardware introspection — disk type + DDR modules
Reports now carry primary-disk classification (
NVMe / SSD / HDD / RAMDISK, plus model, size and mount point) and per-module memory detail (DDR3/4/5 type, MHz, capacity, manufacturer). Both visible in the disk and memory info GUIs as dedicated tiles. When the underlying platform doesn't expose this (e.g. memory modules on a Linux container without SMBIOS access), fields land as stable
UNKNOWN /
-1 sentinels rather than being silently dropped.
Preflight confirmation GUI — replaces the double-/bench start text confirm
A new inventory GUI opens when
/bench start detects risks. Each risk is a coloured tile ( critical, warning, info) with full details on click. Detected risks include: non-
voxelbench_* world targeted (critical), world not flat, other players online, server already laggy, hosting tier free, plugin interference (WorldGuard / GriefPrevention / Spark / etc.).
Critical findings disable the green Start button — only an orange Force button (visible with
voxelbench.start.force) can launch through them. Clean reports skip the GUI entirely and start directly.
/bench info — full rewrite with 15 sub-sections
- Existing sections enriched (cpu, ram, disk, network, spigot, java, system) — previously most showed just a title and one line.
- Brand new: performance (live TPS/MSPT/CPU), plugins (list with enabled state), worlds (per-world chunks/entities/players/seed), sensors (CPU temp/voltage/fans), auth (mode/server ID/rate limit), bench (last run summary), build (version/profile/JVM args), hosting (tier/signals).
- Pixel-perfect column alignment via a new chat-font width calculator (mixes regular and bold spaces for 1-pixel padding precision).
- Tab completion suggests all 15 sections.
- /bench info auth masks the server ID by default (shows abcd…wxyz (64 chars)); /bench info auth hash reveals it.
Tri-state outcomes now actually visible in chat
Until this release every test ended with
✓ Test complete regardless of whether the watchdog killed it or the memory budget refused to start it. The chat now branches on the real status:
✓ Test complete (green) /
⊘ Test skipped — reason (yellow) /
✗ Test failed — reason (red).
Backend errors surfaced in chat
A HTTP 400 from the backend now reads as
Invalid report data: HTTP 400 — missing required field 'X' at /tests[2]/status instead of just
HTTP 400.
New bundled custom profiles
- free-host.yml — divided by ~10 vs standard, designed to stay under Aternos / MSH / similar free-tier killers (TPS killer, RAM cap, CPU throttle). Documented as non-comparable with /bench start.
- low-memory.yml — divided by ~3, for paid VPS / small dedicated hosts with 2-4 GB heap. Comparable across runs of itself.
The three preset profiles from v1.2.0 (
standard,
showcase,
example) are still there.
Standard chunkLoading reduced
The standard benchmark's
chunkLoading test went from 5000 chunks/zone × 8 zones = 40 000 chunks down to 2000 × 8 = 16 000. The previous value routinely tripped the new OOM watchdog at ~92 % heap on 6 GB hosts; 16 000 stays comfortably under the budget.
Critical fixes
- /bench stop was lying — three coupled bugs meant the test kept running for minutes after stop, the scoreboard stayed visible, and a fake ✓ Test complete could appear long after. All three fixed: the active test is force-cancelled synchronously, the scoreboard is removed immediately, late callbacks are suppressed.
- Successful tests reported as failed — an internal status field wasn't being synced with the success boolean, so every test that succeeded was internally flagged FAILURE. Silent until the new chat outcome logic started reading it, then every success appeared as ✗ Test failed. Fixed.
- /bench info tab-completion stale — was suggesting 4 obsolete categories. Now lists every actual sub-section.
Smaller fixes
Anonymisation extended to cover the new hardware blocks (mount-point masked in PARTIAL, disk model generalised in FULL, RAM part numbers hashed in PARTIAL / redacted in FULL) · Server ID masked by default in
/bench info auth · Preflight GUI treats Esc as cancel · Every new behaviour has a
config.yml toggle with sensible defaults.
Coming soon
- Extension API (preview) — still on track. Same surface as v1.2.x with new typed parameter / metric / completion / structured-version-comparison primitives. Not officially announced for third-party use yet — expect changes until the public release.
Upgrade
Drop the new jar in
plugins/, restart. No config or database migration required — new options are added with sensible defaults. The first run after upgrading may show one or two
Skipped outcomes on a low-RAM host: that's the new memory budget check refusing tests that would have crashed the JVM — inspect heap with
/bench info ram or raise
-Xmx. The two new preset profiles (
free-host.yml,
low-memory.yml) will appear in
plugins/VoxelBench/custom_benchmarks/ alongside the existing ones — delete the ones you don't need.
Java + compatibility
Java 16+ for MC 1.17 → 1.21.x. Java 21 recommended for MC 1.20.5+. Java 25 LTS for MC 26.1.x.
Tested on Paper / Purpur / Pufferfish / Folia / Spigot / Mohist 1.20.1 + 1.20.2 / Arclight 1.20.1 + 1.20.4.