В нашем приложении основной ценой нескольких арен была «темная» память. Память, выделенная ОС, к которой у нас нет ссылок.
Рисунок, который вы видите
Thread X goes goes to alloc, hits a collision, creates a new arena.
Thread X makes some large allocations.
Thread X makes some small allocation(s).
Thread X stops allocating.
Большие ассигнования освобождаются. Но вся арена на высшей отметке последнего в настоящее время активного распределения по-прежнему использует VMEM, и другие потоки не будут использовать эту арену, если не столкнутся с конфликтом на главной арене.
По сути, это вклад в «фрагментацию памяти», поскольку память может быть доступна в нескольких местах, но необходимость в расширении арены не является причиной для поиска в других аренах. По крайней мере, я думаю, что причина кроется в том, что ваше приложение может иметь больший объем виртуальной машины, чем вы думаете. Это чаще всего поражает вас, если у вас ограниченный своп, так как, как вы говорите, большая часть этого оказывается выгруженной.
Наше (голодное до памяти) приложение может таким образом «тратить» 10% процентов памяти, и в некоторых ситуациях оно действительно может укусить.
Я не уверен, почему вы захотите создать пустые арены. Если выделения и освобождения находятся в одном потоке друг с другом, то я думаю, что со временем вы будете склонны к тому, чтобы все они находились на одной и той же поточной арене без каких-либо разногласий. Пока вы туда добираетесь, у вас могут быть небольшие всплески, так что, возможно, в этом причина.