我们的客户应用程序似乎与以下堆栈跟踪挂起:
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中吗?
答案 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存储库?
它可能正在等待存储库再次被锁定,谁知道它的应用程序。