Память не освобождается - PullRequest
1 голос
/ 10 июля 2020

Это простая программа для распаковки строки, я просто запустил al oop, чтобы показать, что использование памяти увеличивается, а используемая память никогда не освобождается.

Память не освобождается даже после 8 часов

Пакет для распаковки строки: https://github.com/Albinzr/lzGo - (простой алгоритм lz-строки)

Я добавляю главную ссылку, так как строка, используемая для распаковки, большая

Исходный код: Код

enter image description here

Activity Monitor введите описание изображения здесь

Я совершенно новичок в go. Может ли кто-нибудь сказать мне, как я могу решить проблему с памятью?

ОБНОВЛЕНИЕ 15 июля 20 г. Приложение все еще вылетает при достижении предела памяти, так как он использует только 12 МБ - 15 МБ, этого не должно происходить !!

1 Ответ

4 голосов
/ 19 июля 2020

Здесь много чего происходит.

Во-первых, использование Go версии 1.14.2 вашей программы мне подходит. Похоже, утечки памяти нет.

Во-вторых, даже когда я намеренно создал утечку памяти, увеличив размер l oop до 100 и сохранив результаты в массиве, я использовал только около 100 МБ память.

Что подводит нас к третьему, вам не следует использовать Activity Monitor или какие-либо другие инструменты уровня операционной системы для проверки утечек памяти в программе Go. Управление памятью операционной системы - очень сложная задача c, и инструменты ОС предназначены для того, чтобы помочь вам определить, как программа влияет на всю систему, а не на то, что происходит внутри программы.

В частности, macOS " Real Memory »(аналог RSS, Resident Set Size) включает память, которую программа больше не использует, но ОС еще не вернула обратно. Когда сборщик мусора освобождает память и сообщает ОС, что эта память больше не нужна, ОС не сразу возвращает ее. (Почему это работает, выходит за рамки этого ответа.) Кроме того, если ОС находится под давлением памяти, она может вернуть не только память, освобожденную программой, но также может вернуть (временно) память программы. все еще использует, но не обращался "в последнее время", чтобы другая программа, которой срочно требуется память, могла использовать его. В этом случае «Реальная память» будет уменьшена, даже если процесс фактически не использует меньше памяти. Операционная система не сообщает статистики c, которая может вам помочь.

Вам необходимо использовать собственные Go настройки, такие как GODEBUG=gctrace=1, или инструменты, такие как expvar и expvarmon , чтобы узнать, что делает сборщик мусора.

Что касается того, почему вашей программе не хватает памяти, когда вы ее ограничили, имейте в виду, что по умолчанию Go создает динамически связанный исполняемый файл и просто чтение во всех общих библиотеках может занимать много памяти. Попробуйте создать свое приложение с использованием stati c связывания с использованием CGO_ENABLED=0 и посмотрите, поможет ли это. Посмотрите, сколько памяти он использует, когда вы запускаете только 1 итерацию l oop.

...