Ответ 1
Как предложил Карл, вы должны проверить код на утечку пространства. Я предполагаю, что ваша программа действительно требует большой памяти по уважительной причине.
Программа потратила 2820.18s на выполнение основного GC. Вы можете снизить его, уменьшив использование памяти (не по предположению) или количество основных коллекций. У вас много свободной памяти, поэтому вы можете попробовать -Ffactor
option:
-Ffactor
[Default: 2] This option controls the amount of memory reserved for
the older generations (and in the case of a two space collector the size
of the allocation area) as a factor of the amount of live data. For
example, if there was 2M of live data in the oldest generation when we
last collected it, then by default we'll wait until it grows to 4M before
collecting it again.
В вашем случае есть ~ 3G живых данных. По умолчанию основной GC будет срабатывать, когда куча вырастет до 6G. С помощью -F3
он будет срабатывать, когда куча вырастет до 9G, экономя ваше процессорное время ~ 1000.
Если большинство живых данных являются статическими (например, никогда не меняются или меняются медленно), вас будет интересовать стабильная куча. Идея состоит в том, чтобы исключить длительные данные о жизни из основного ГК. Это может быть достигнуто, например, используя компактные нормальные формы, хотя не объединяется в GHC пока.