Профіль купи показує активну пам’ять, пам’ять, яку виконує програма, використовується програмою go (тобто: не зібрана збирачем сміття). Коли GC збирає пам'ять, профіль стискається, але пам'ять в систему не повертається . Ваші майбутні розподіли намагатимуться використовувати пам’ять із пулу раніше зібраних об’єктів, перш ніж запитувати у системи більше.
Зовні це означає, що використання пам'яті вашої програми буде або збільшуватися, або залишатись на рівні. Те, що зовнішня система представляє як "постійний розмір" вашої програми, - це кількість байтів оперативної пам'яті, призначеної вашій програмі, незалежно від того, чи містять вона значення використання go або зібрані.
Причина, чому ці два числа часто досить різні, полягає в тому, що:
- Збір пам'яті GC не впливає на зовнішній вигляд програми
- Фрагментація пам'яті
- GC працює лише тоді, коли використовувана пам'ять подвоює пам'ять, що використовується після попередньої GC (за замовчуванням див .: http://golang.org/pkg/runtime/#pkg-overview )
Якщо ви хочете отримати точну інформацію про те, як Go бачить пам'ять, ви можете використовувати час виконання. ВикликReadMemStats: http://golang.org/pkg/runtime/#ReadMemStats
Крім того, оскільки ви використовуєте веб-профілювання, якщо ви можете отримати доступ до даних профілювання через ваш браузер за адресою:, http://10.10.58.118:8601/debug/pprof/
клацнувши посилання купи, ви побачите налагоджувальний вигляд профілю купи, який має роздруковану структуру середовища виконання. знизу.
Документація runtime.MemStats ( http://golang.org/pkg/runtime/#MemStats ) містить пояснення всіх полів, але цікавими для цього обговорення є:
- HeapAlloc: по суті те, що дає вам профайлер (активна пам'ять купи)
- Alloc: схожий на HeapAlloc, але для всіх використовується керована пам'ять
- Sys: загальний обсяг пам’яті (адресного простору), що вимагається від ОС
Все ще існуватимуть розбіжності між системою Sys, і те, про що повідомляє ОС, оскільки те, що Go просить про систему, і те, що ОС дає їй, не завжди однакові. Також пам'ять CGO / syscall (наприклад: malloc / mmap) не відстежується за допомогою go.