Дескрипторы Java (мьютекс?) Утекают и не освобождаются (не дескрипторы файлов)
У меня есть сложное приложение Java, которое работает в течение длительного времени. приложение выполняет одну и ту же операцию, с небольшими нюансами, снова и снова. Моя проблема заключается в том, что диспетчер задач Windows показывает много утечек дескрипторов для процесса Java (не дескрипторы файлов).
после некоторого времени работы приложения в стрессовой ситуации я получаю странные сбои, такие как застревание приложения, его исчезновение, или я получаю FileNotFoundException при попытке открыть файл ("Недостаточно системных ресурсов для завершения запрошенной службы").
Я использовал диспетчер задач Windows, чтобы увидеть, в чем проблема, и обнаружил, что для процесса java.exe - число дескрипторов увеличивается очень быстро. количество потоков не увеличивается, а объем используемой оперативной памяти также не увеличивается.
Затем я использовал Process Explorer SysInternal, чтобы понять, что это за дескрипторы. Я вижу, что это не дескрипторы файлов, а тысячи дескрипторов типа 'Mutant' с именем \BaseNamedObjects\??????n. Согласно некоторым сайтам в Интернете, Mutant in Process explorer означает Mutex. Мое приложение Java не создает намеренно мьютексы.
Следующим шагом было использование инструментов профилирования, чтобы сузить источник утечек. Я использовал "J Optimizer" и "Java VirtualVM". с обоими приложениями я не могу обнаружить протекающие ручки. у них есть детекторы утечки памяти, но я не могу найти способ обнаружить утечки ручек.
Мой вопрос: как я могу отладить эту проблему? Как я могу узнать, что вызывает утечки ручек?
Спасибо
1 ответ
Если вам интересно, как распределяются ссылки, утечки, смотрите это: Как просмотреть трассировку стека выделения памяти в Java VisualVM
Я не уверен, как вы проследите, как ссылки не удалось освободить.