Зависшие темы java.lang.ClassLoader.findBootstrapClass - PullRequest
3 голосов
/ 19 января 2011

Мое приложение J2EE работает медленно. Мы взяли Thead Dumps во время этой ситуации и обнаружили, что следующий поток был Runnable в нескольких дампах и взял блокировки на некоторых мониторах, которые заставляют другие потоки (прямо или косвенно) ожидать блокировки.

at java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:891) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:301) 
    - locked [0x9747c360] (a sun.misc.Launcher$ExtClassLoader) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:299) 
    - locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) 
    - locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
.....

Не могли бы вы подсказать, какая нить не перемещается и позволяет другим нитям работать?

Ответы [ 3 ]

1 голос
/ 26 января 2011

Я видел подобные вещи в OSGI, где структура загрузчика классов представляет собой граф, а не дерево, как это обычно делается в J2EE.Загрузчики классов блокируются при загрузке класса, поэтому два потока (a, b), загружающие классы из загрузчиков классов в порядке (x, y) и (y, x) соответственно, могут заблокироваться.Это может произойти, если статические инициализаторы вызывают больше загрузки классов из другого загрузчика классов.Нечасто, что классы начальной загрузки вызывают загрузку классов из загрузчика классов приложения, но любые фабричные классы в стандартных библиотеках, которые используют загрузчик контекста потока, соответствовали бы требованиям.Обычное решение состоит в том, чтобы загружать классы раньше, возможно, во время запуска приложения, тем самым прерывая цикл.

1 голос
/ 25 января 2011

Почему ваше приложение загружает так много классов (блокировки находятся в loadClass)?Ожидается, что ваше приложение загружает выгруженные классы только во время инициализации и прогрева.

Итак, я подозреваю, что происходит одно из следующих событий:

  • Вы создаете многоразличные динамические прокси-классы вместо попыток их повторного использования.
  • Вы создаете много загрузчиков классов без необходимости или, по крайней мере, неправильно используете их.
  • Вы начинаете и заканчиваете несколько параллельных JVM.

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

0 голосов
/ 26 января 2011

Если этот поток приостановлен на неопределенный срок Я бы предположил, что это некая циклическая ссылка (символические ссылки? Прочее?).

Если вы включите ведение журнала для загруженных классов, вы сможете узнать больше.

java -verbose:class your.Class

Это может многое вам показать; Я полагаю, что он пишет в system.out, поэтому вам нужно проверить соответствующий журнал.

...