Per-world view and simulation distance, adjusted automatically from MSPT and chunk load.
First stable since 2.10.8. If you skipped the 2.11.0 alpha and the 2.11.1 beta, everything from both is in here.
The memory safeguard was reading the wrong number
If your start script sets -Xms equal to -Xmx, this one affects you. That is what Aikar's flags and essentially every hosting panel recommend, so it is most servers.
The free-heap figure was unused space in the current heap plus whatever the JVM was still allowed to grow by. Commit the heap in full at startup and that second term is zero forever, leaving raw occupancy. Occupancy counts garbage that has not been collected yet, and every modern collector deliberately lets the heap fill before reclaiming it. So the number described where the GC cycle happened to be, not how much memory your server needed.
That alone would be an occasional wrong reading. What made it permanent is that an increase needs passed-checks-for-increase clean checks in a row, and any veto resets that counter, so a minority of false readings is enough to pin a server at its minimum distance indefinitely.
It now measures the lowest heap usage seen in the last minute. Right after a collection, usage is the live set, so that figure is a real measurement of what the server needs.
On a 1GB ZGC heap the old build logged five vetoes, made zero distance changes in six minutes and finished where it started. The new build logged none, made eleven, and climbed from simulation distance 4 to 12. On a heap with room to spare, where the old reading happened to be right, both behave identically.
ZGC is affected from the start. G1 with Aikar's flags holds out longer, but goes the same way once live data passes roughly half the heap. If you lowered min-free-percent to work around this, you can put it back to 15.
Per-world MSPT
The server reports one MSPT figure for everything, so a single struggling world used to drag every other world's distance down with it. Turn on per-world-mspt and the tick is split between worlds, each judged by the share it actually causes. Off by default.
/vdt analyze
Reads the server's own change history and MSPT-versus-chunk-count samples, then suggests config values that fit what this specific server has shown. It only suggests, nothing is applied.
Ping throttling
The same idea as AFK throttling, triggered by a bad connection instead of an idle player. A player whose ping stays above the threshold for a few checks running gets reduced personal distances. A single spike does not trigger it and recovery is immediate. If a player is both AFK and on a bad connection the more restrictive value applies, and an explicit viewdistancetweaks.fixed.<n> permission still beats both. Off by default.
Pre-generation: world border and scheduling
Idle pre-generation clamps its radius to the world border by default, so a radius entered too large costs a log line instead of generating chunks nobody can reach. /vdt pregen schedule <world> <radius> <HH:mm> starts a run at a clock time rather than waiting for an empty server; every existing safety net still applies once it is running.
Faster climb defaults
passed-checks-for-increase 10 to 3, max-increase-step 1 to 2, max-decrease-step 1 to 4. Climbing from 4 to 16 now takes about nine minutes of uninterrupted good health instead of an hour. These apply to new installs only. An existing config.yml already contains those keys, so your values are kept.
Upgrading from 2.10.8
Close to a pure bugfix. The only block added to your config.yml is ping-throttling, and it ships disabled. Every other feature above is off by default as well, and your tuned values are preserved. /vdt status now labels the heap figure live, because that is what it measures.