Image work no longer spreads over the default executor's threads, where
glibc kept an image-sized malloc arena per thread.
- Interactive image work (view previews behind their gate, workspace card
facts, both inspector routes) runs on the API's fixed pm-image pool of
3 threads; the on-demand preview pool is merged into it.
- map_parallel (scan metadata, thumbnail and convert jobs, the legacy
gallery generation, capture previews) shares one long-lived pm-worker
pool of Worker threads, reused between jobs. The package teardown stops
it within its bound (part "workers").
- After a scan, thumbnail or convert job, glibc's malloc_trim(0) returns
free pages once; a no-op on Windows, macOS and musl.
- tools/perf/memory_drive.py measures RSS, heap, threads and arenas under
the #523 load on the disposable browser test server (manual only).