Java-приложение зависает в Linux по адресу - PullRequest
8 голосов
/ 22 октября 2008

Кажется, что наше клиентское приложение зависает со следующей трассировкой стека:

  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?

Ответы [ 5 ]

8 голосов
/ 22 октября 2008

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

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

6 голосов
/ 22 октября 2008

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

1 голос
/ 07 мая 2010

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

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

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

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

0 голосов
/ 22 октября 2008

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

Имеет ли приложение доступ к хранилищу Subversion?

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

0 голосов
/ 22 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...