Сборка мусора Java во время выполнения сгенерированного кода - PullRequest
1 голос
/ 15 июля 2009

Я смотрю на возможность генерирования Java-байтового кода во время выполнения (надеюсь, непосредственно в памяти, а не через файлы классов, хотя я думаю, что это не изменит мой вопрос).

Я понимаю, что это можно сделать, вопрос в том, удаляет ли сборщик мусора ненужный код? Я помню, как несколько лет назад я видел, что он утверждал, что это не так, но сейчас я не могу найти никаких ссылок на эту тему.

Чтобы прояснить цель этого, я, конечно, не стал бы беспокоиться об обычных сценариях обработки данных. Но рассмотрим генетическое программирование: потенциально миллиарды небольших программ генерируются и выполняются для триллионов казней; в этом случае стоит попытаться сделать все как можно быстрее, и важно освободить больше неиспользуемый код. Я пытаюсь сделать что-то более сложное, но оно имеет сходство с генетическим программированием.

Ответы [ 2 ]

4 голосов
/ 15 июля 2009

Классы привязаны к загрузчику ClassLoader, который их загрузил. Чтобы JVM собирала неиспользуемые классы, вы должны очистить все ссылки на загрузчик классов. Вот как серверы приложений работают с «горячим развертыванием», и, возможно, поучительно посмотреть на реализации JBoss или Tomcat, если вы не знакомы с загрузчиками классов (я не смотрел ни на один из них, поэтому не могу указать на них) .

Мне интересно, однако, действительно ли это будет проблемой? Сколько классов вы планируете создать, насколько большими они будут и как долго они будут жить? Если у вас много больших классов (скажем, 50 000 байт-кода или более), и они будут жить недолго, то имеет смысл их очистить. В противном случае, не так много.

Кроме того, почему вы создаете классы? Это то, что вы можете сделать с помощью языка сценариев (например, Rhino) изнутри JVM? Или самодельный переводчик? Если да, то это решило бы ваши проблемы управления классом без кода.

0 голосов
/ 15 июля 2009

Если вы имеете в виду, что класс получает выгружен сборщиком мусора, то нет, это не так.

Однако вы можете достичь этого, написав собственный загрузчик классов.

...