2009-07-19 2 views
5

Возможно ли реализовать многопоточный загрузчик классов в Java? В мета-управляемой структуре мне нужно загрузить несколько сотен классов заранее, то есть не так лениво, как системный загрузчик классов. Чтобы ускорить это, я хотел бы лучше использовать текущие многоядерные процессоры. Прежде чем я погрузился в это, мне было бы интересно, если кто-то уже имеет некоторый опыт по этому вопросу или, возможно, совершенно ясно, что, возможно, defineClass() является узким местом в этом случае.Возможна многопоточная загрузка классов?

Благодаря Андре

ответ

6

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

Как и прежде, я предлагаю, возможно, сделать некоторые вычисления огибающей конверта, а затем сосать-и-видеть.

+0

Хорошо, я собираюсь проверить JDK 7.0 classloader API. Если вы правы с блокировкой в ​​любом JDK <7.0, тогда может быть, по крайней мере, преимущество параллельной загрузки байтового кода из файловой системы и предварительной обработки. Я сделаю некоторое тестирование, чтобы проверить, достаточно ли это для моих целей. –

+1

Вот ссылка: http://openjdk.java.net/groups/core-libs/ClassLoaderProposal.html. Я не знаю ничего более современного, чем этого. –

+0

Спасибо Том, очень полная ссылка, показывающая направление и текущую ситуацию. –

0

Там нет ничего плохого в том, один или более нить загрузки класса в фоновом режиме, который требует, чтобы все классы, необходимые для предварительной загрузки. Сделайте прототип с помощью Executor и Callables, чтобы вы могли получить некоторую информацию профилирования с помощью jvisualvm.

+1

Да, технически должно быть возможно иметь несколько классов загрузки потоков, что совершенно ясно. Метод defineClass() не синхронизирован, что является своего рода предварительным условием. Но мне интересно, есть ли где-то глубже точка синхронизации в коде JVM, которая предотвращает реальную загрузку класса MT без очевидного? –

+1

defineClass не синхронизирован, так как загрузка класса определяется как однопроцессорная JVM. (По крайней мере, на Java 5 и 6). Несколько сотен классов не занимают столько времени, чтобы загрузить то, что требуется для загрузки времени? –

+0

Я в основном боюсь, что я основываю свою инфраструктуру на архитектуре, которая не очень хорошо масштабируется. 100s классов - это только начало, но поскольку в структуре все больше и больше функций, количество классов может увеличиться до тысяч, что может привести к серьезной задержке при запуске. –

Смежные вопросы