You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
20260722.3: fix cold-warmup worker collapse caused by the smaller heap
20260722.2 derived the jadx heap from the container (49 GB -> 9.8 GB on
production). computeWarmupWorkers sizes Phase-1 parallelism from that heap, and
its base-footprint constant still assumed the heap-resident trigram index:
base = 1024 + 222779/1000 * 80 = 18784 MB > 9832 MB heap
-> usable < 0 -> byHeap = 1 -> ONE decompile worker for ~220k classes
Production never hit it (it FAST_RESTOREs from the persisted index volume and
skips Phase-1 entirely), but a newly loaded APK, or anyone pulling the published
image, would cold-warm single-threaded.
Recalibrated against measurement instead of the old era's guesswork:
* base 80 MB/1k -> 20 MB/1k. Production /memory-diagnostics reports a clean
post-GC steady state of 4466 MB for 237931 classes (~19 MB/1k); the content
index now lives in an mmap'd shard on disk and Phase-1 writes through to the
CodeStore before unloading.
* per-worker 1536 MB -> 384 MB (MemoryConfig.DEFAULT_PER_WORKER_HEAP_MB). The
1.5 GB figure was paying for in-heap trigram growth during Phase-1, which no
longer happens; a worker now holds one class's decompile working set. Still
hot-updatable via POST /memory-config, with isHighMemoryPressure as the net.
* Added the CPU dimension the formula never had: max(2, cores/4) instead of
cores-2. Warmup runs while the server answers queries, jadx parallelises
internally on top of these workers, and the host is shared -- authorising 46
workers on a 48-core box is what made a cold warmup saturate the machine.
DELAMAIN_WARMUP_DECOMPILE_WORKERS still overrides for a known-idle machine.
Net on the production shape (222779 classes, 9832 MB heap, 48 cores): 1 -> 6
workers, capped at 12 by the CPU term.
computeWarmupWorkers is now a pure function of (classCount, heapMB, cores,
safetyMargin, perWorkerHeapMB) so the sizing is directly testable; 6 new tests
pin the regression, the base against the measured steady state, the CPU cap, and
the small-machine floors.
Tests: 170 Java (only the pre-existing order-dependent
ClassCacheManagerInvalidateCodeStoreTest failure), 82 gateway.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>