Clojure закрытия и GC - PullRequest
       4

Clojure закрытия и GC

12 голосов
/ 04 января 2011

Насколько я понимаю, используемый по умолчанию ClassLoader, используемый в Java (и, следовательно, Clojure), поддерживает указатели на любые созданные анонимные классы и, следовательно, на лямбды и замыкания. Это никогда мусора, и поэтому представляет собой «утечку памяти». В Java 7 или 8 проводится некоторое исследование (https://blogs.oracle.com/jrose/entry/anonymous_classes_in_the_vm) по добавлению анонимного ClassLoader, который не будет сохранять ссылки на эти функции. В то же время, как люди занимаются написанием долго работающих приложений в языки, такие как Clojure и Scala, которые поощряют использование этих конструкций?

Есть ли вероятность, что Clojure сможет предоставить свой собственный анонимный ClassLoader, расширяющий системный, но не сохраняющий созданные классы?

1 Ответ

14 голосов
/ 04 января 2011

Из комментария bendin выше и информации от Радость Clojure Майкла Фогуса и Криса Хаузера, в разделе «Время компиляции и время выполнения» (Глава 7, Раздел 7.2), Fogus и Houser объясняют, что замыкания и анонимные функции компилируются в байт-код в время компиляции , и каждый вызов функции высшего порядка, которая возвращает замыкание, просто возвращает новый экземпляр класса замыкания, а не новый класс. Эти случаи, конечно, будут собирать мусор. Поскольку существует очевидная верхняя граница количества анонимных функций и замыканий во время компиляции, проблема с памятью будет редко, если вообще когда-либо существовать.

Мои опасения были беспочвенными.

...