Имеет ли использование require с опцией: reload тенденцию наращивать память в Clojure? - PullRequest
5 голосов
/ 02 сентября 2010

У меня есть приложение, которое для перезагрузки плагинов требует их с опцией: reload всякий раз, когда они должны быть перезагружены. Я заметил, что это накапливает память на 2-3 мегабайта в то время, когда я делаю это. Мне любопытно, что может вызвать подобные вещи. Сохраняются ли данные предыдущих перезагрузок в памяти? Есть ли способ полностью перезагрузить пространство имен?

РЕДАКТИРОВАТЬ: Также важно упомянуть, что каждый из этих плагинов, который загружается повторно, создает новые методы для мультиметода в другом пространстве имен (которое никогда не загружается повторно). Может быть, методы сохраняются в памяти при перезагрузке?

Ответы [ 2 ]

1 голос
/ 24 сентября 2010

Как оказалось, я не проверял это достаточно долго. Память будет только расти до определенного уровня, а затем она остановится и в конце концов немного снизится.

Мальчики и девочки: проверьте свой код, прежде чем скулить об ошибках.

1 голос
/ 24 сентября 2010

Clojure откладывает управление памятью на JVM. Хотя я не знаю глубоко кодовую базу clojure, она, вероятно, просто переназначает переменные с перезагруженным кодом, в результате чего старые объекты остаются, пока JVM не запускает сборщик мусора.

Вы можете намекнуть JVM, что вы хотите, чтобы GC запускался с использованием (System / gc), но обычно это не рекомендуется использовать.

В качестве альтернативы, если вы знаете ограничения вашей системы, вы можете повозиться с флагами памяти JVM, чтобы побудить GC работать чаще (т. Е. Использовать меньший размер кучи).

Но если у вас система, которая на самом деле не ограничена в памяти, экономия нескольких мегабайт не имеет большого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...