Існує два підходи до обмеження використання вашої пам’яті: Ex post facto та превентивний. Тобто ви можете спробувати вбити свою програму після того, як вона стала занадто великою, або ви можете запрограмувати її, щоб вона не стала занадто великою.
Якщо ви наполягаєте на підході ex post facto, ви можете використовувати наступний сценарій Bash. Цей скрипт спочатку знаходить об'єм пам'яті (як визначено "розміром резидентного набору"), який використовує процес із процедідним pid, фільтрує всі нечислові дані за допомогою grep та зберігає кількість як змінну n. Потім сценарій перевіряє, чи n більший за вказаний х. Якщо це так, процес із процедидом pid вбивається.
Будь ласка, запиши:
- Ви повинні замінити
<pid>
ідентифікатор процесу вашої програми.
- Ви повинні замінити
<x>
на rss = "розмір постійного набору" (тобто реальний розмір пам'яті), який ви не хочете, щоб програма перевищувала.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Якщо ви хочете, щоб це працювало кожні y секунди, просто вкладіть його у цикл і скажіть, щоб він чекав y секунди після кожної ітерації. Ви також можете написати подібну команду, використовуючи top
. Вашою відправною точкою буде top -l 1|grep "<pid>"|awk '{print $10}'
.
@ Kenorb в відповідь допоміг мені з моїм сценарієм
Хоча я вважаю, що це відповідає на це питання, але, зрештою, я вважаю, що краще розробляти програмування, щоб використовувати переважний підхід із використанням ручного розподілу пам'яті.
По-перше, ви впевнені, що використання пам'яті справді є проблемою? У документації Go зазначено:
Розподільник пам'яті Go залишає велику область віртуальної пам'яті як арену для розподілу. Ця віртуальна пам'ять є локальною для конкретного процесу Go; застереження не позбавляє інших процесів пам’яті.
Якщо ви все ще вважаєте, що у вас є проблеми, я рекомендую вам вручну керувати своєю пам'яттю, як це робиться на мові програмування C. Оскільки go написано на C, я підозрював, що знайдуться способи потрапити в управління / розподілу пам'яті C, і справді вони є. Перегляньте це сховище github, яке,
дозволяє здійснювати ручне управління пам’яттю через стандартний розподільник C для вашої системи. Це тонка обгортка зверху мальлока, калька та вільна від неї. Детальну інформацію про ці функції для вашої системи дивіться у manloc. Ця бібліотека використовує cgo.
Випадок використання подається у вигляді:
Чому б ти цього хотів?
Коли програма викликає тиск у пам’яті або в системі не вистачає пам’яті, це може бути корисно вручну керувати розподілом пам’яті та переміщенням. Go може допомогти вам контролювати асигнування, але неможливо чітко розмістити непотрібні дані.
Це здається кращим довгостроковим рішенням.
Якщо ви хочете дізнатися більше про C (включаючи управління пам'яттю),
мова програмування C є стандартною базою.