Сначала я подозревал, что объект Lock
наконец не разблокируется. Но потом я посмотрел на предоставленные вами дампы двух потоков.
Действительно 3 потока заблокированы на одной и той же блокировке, а именно это Log4J, Категория класс. Согласно дампу потока, это код, на котором они все заблокированы:
for(Category c = this; c != null; c=c.parent) {
synchronized(c) { // LOCKED HERE
if(c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
if(!c.additive) {
break;
}
}
}
TDA подтверждает, что ни один другой поток не имеет этой блокировки, но также предоставляет очень полезный совет:
Этот монитор не имеет потока, блокирующего его. Это означает, что поток VM удерживает его.
Если вы видите, что на многих мониторах нет блокирующих потоков, это обычно означает, что сборщик мусора работает. В этом случае вы должны рассмотреть анализ вывода сборщика мусора. Если в дампе много мониторов без блокирующего потока, щелчок по узлу дампа даст вам дополнительную информацию.
и далее:
Этот дамп потока содержит мониторы без информации о потоке блокировки. Это означает, что монитор удерживается системным потоком или каким-либо внешним ресурсом.
Вы должны проверить мониторы без блокировки потоков для получения дополнительной информации.
Заключение : вы должны включить ведение журнала сбора мусора и посмотреть, не является ли это основной причиной. Также проверьте, не делаете ли вы или какая-либо библиотека что-то странное с Log4J (круговые категории?) - просто дикая догадка. Полезные опции:
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:gc.log