Приложение Java зависает в Linux на "java.io.UnixFileSystem.getBooleanAttributes0"

Приложение наших клиентов зависает со следующей трассировкой стека:

  java.lang.Thread.State: RUNNABLE
    at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
    at java.io.UnixFileSystem.getBooleanAttributes(Unknown Source)
    at java.io.File.isFile(Unknown Source)
    at org.tmatesoft.svn.core.internal.wc.SVNFileType.getType(SVNFileType.java:118)
    at org.tmatesoft.svn.core.internal.wc.SVNFileUtil.createUniqueFile(SVNFileUtil.java:299)
    - locked <0x92ebb2a0> (a java.lang.Class for org.tmatesoft.svn.core.internal.wc.SVNFileUtil)
    at org.tmatesoft.svn.core.internal.wc.SVNRemoteDiffEditor.createTempFile(SVNRemoteDiffEditor.java:415)
    at org.tmatesoft.svn.core.internal.wc.SVNRemoteDiffEditor.applyTextDelta(SVNRemoteDiffEditor.java:255)

Кто-нибудь знает, что могло привести к зависанию в isFile?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
14 387
5

Ответы 5

Понятия не имею, но очевидный вопрос, какой JDK / JRE приходит на ум и какие другие вы пробовали ...

Заказчик использует Sun JRE 1.6.0.07. Других я еще не пробовал. Я обнаружил, что [ruby-forum.com/topic/165608] и [jetbrains.net/jira/browse/IDEADEV-23062]] сообщают о чем-то похожем, но без каких-либо решений.

Kev 22.10.2008 12:06

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

Имеет ли приложение доступ к репозиторию Subversion?

Возможно, он ждет, пока репозиторий не будет снова заблокирован, кто знает ваше приложение.

Из приведенной выше трассировки стека похоже, что код tmatesoft пытается создать временный файл. Это не наш код, а java-клиент svn, который мы используем для общения с svn.

Kev 22.10.2008 12:07

getBooleanAttributes0 вызывает stat (или stat64, если таковой имеется). Если у вас есть исходный код OpenJDK, он указан в файле jdk/src/solaris/native/java/io/UnixFileSystem_md.c.

Итак, реальный вопрос: почему stat заморожен? Например, является ли файл, к которому осуществляется доступ, сетевым файлом на неработающем сервере? Если это воспроизводимая проблема, вы можете использовать strace для подключения к процессу Java непосредственно перед замораживанием. Затем посмотрите в выходных данных вызовы stat, чтобы узнать, к чему осуществляется доступ.

Я получаю это без монтирования nfs ... вероятно, плохие блоки диска grrrr

Partly Cloudy 15.03.2012 04:58

Похоже, вызов stat, вызванный getBooleanAttributes0, блокируется. Обычно это происходит из-за того, что файл находится на неработающем ресурсе NFS.

Мы видели это при большой нагрузке на файловые системы NFS.

ReneS 13.05.2009 20:14

Мы видим эту проблему в Eclipse, когда он регистрирует несуществующий файл в каталоге автоматического монтирования NFS.

Если вы ограничите свой java-процесс с помощью -f -t -T (отслеживание вилок и времени), мы увидим, что самый статистика возвращается за очень короткое время. Те, что находятся в каталоге automount, занимают на два порядка больше времени.

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

Решение состоит в том, чтобы остановить это на Java.

Другие вопросы по теме