Java应用程序在Linux上挂起“java.io.UnixFileSystem.getBooleanAttributes0”

时间:2008-10-22 07:32:57

标签: java

我们的客户应用程序似乎与以下堆栈跟踪挂起:

  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 个答案:

答案 0 :(得分:8)

getBooleanAttributes0来电stat(或stat64,如果有的话)。如果您有OpenJDK源代码,则会在文件jdk/src/solaris/native/java/io/UnixFileSystem_md.c中列出。

所以真正的问题是,为什么stat被冻结了?例如,正在被访问的服务器上的文件是否被关闭?如果这是一个可重现的问题,您可能希望在冻结之前使用strace附加到Java进程。然后在输出中查看对stat的调用,以查看正在访问的内容。

答案 1 :(得分:6)

看起来stat产生的getBooleanAttributes0来电是阻止的。这通常是因为该文件位于已关闭的NFS共享上。

答案 2 :(得分:1)

当我们在NFS automount目录中统计一个不存在的文件时,我们在Eclipse中看到了这个问题。

如果你使用-f -t -T(跟随分支和时间)对你的java进程进行操作,我们看到的是 most ,统计信息会在很短的时间内返回。 automount目录中的那些时间要长两个数量级。

在许多情况下,操作系统将此作为上下文切换线程的机会。结果是执行stat的线程没有运行很长时间。如果您的Java代码(在我们的例子中是一个Eclipse插件)无法以递归方式为每个文件说明树,那么您最终可能会长时间锁定该线程。

解决方案是阻止Java执行此操作。

答案 3 :(得分:0)

不知道,但显而易见的问题是JDK / JRE会浮现在脑海中以及其他人尝试过的......

答案 4 :(得分:0)

也许SVN存储库以某种方式被锁定所有我能做的就是猜测。

应用程序是否访问了subversion存储库?

它可能正在等待存储库再次被锁定,谁知道它的应用程序。