This is a major gotcha with mimalloc: https://pwy.io/posts/mimalloc-cigarette/. I'd go so far as to say this behavior (relying solely on periodic calls to malloc/free on _every_ thread to tick the thread-local upkeep) could disqualify it as a libc malloc replacement. In a language with safepoints you could have the runtime insert periodic calls to mi_collect() for every thread, but that shouldn't be required to drive a libc malloc.