繁体   English   中英

线程挂在sun.nio.ch.FileDispatcherImpl.size0(本机方法)上

[英]Thread hung at sun.nio.ch.FileDispatcherImpl.size0(Native Method)

在我的Java应用程序中,我需要将目录的内容从一个复制到另一个。 但是有时(非常罕见)copyDirectory会永久卡住,此后代码将无法执行。 这导致高CPU使用率。 我多次检查了应用程序的jstack,发现同一线程长时间处于可运行状态。 下面是线程的堆栈跟踪。

"pool-2-thread-3" #17 prio=5 os_prio=0 tid=0x00007fab5585c000 nid=0xa81 runnable [0x00007fab0af6f000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.FileDispatcherImpl.size0(Native Method)
        at sun.nio.ch.FileDispatcherImpl.size(FileDispatcherImpl.java:84)
        at sun.nio.ch.FileChannelImpl.size(FileChannelImpl.java:310)
        - locked <0x00000000c5f59728> (a java.lang.Object)
        at sun.nio.ch.FileChannelImpl.transferFrom(FileChannelImpl.java:705)
        at org.apache.commons.io.FileUtils.doCopyFile(FileUtils.java:1147)
        at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1428)
        at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1389)
        at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1261)
        at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1230)

我尝试使用shell命令手动复制相同内容,但复制成功。 同样,在接下来的堆栈跟踪中,还有一个线程长时间处于运行状态。

"pool-2-thread-52" #81581 prio=5 os_prio=0 tid=0x00007fab55951800 nid=0x5db runnable [0x00007faafb2f0000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.FileChannelImpl.position0(Native Method)
        at sun.nio.ch.FileChannelImpl.position(FileChannelImpl.java:288)
        - locked <0x00000000c5ffde60> (a java.lang.Object)
        at sun.nio.ch.FileChannelImpl.transferFromFileChannel(FileChannelImpl.java:651)
        - locked <0x00000000c5ffde60> (a java.lang.Object)
        at sun.nio.ch.FileChannelImpl.transferFrom(FileChannelImpl.java:708)
        at org.apache.commons.io.FileUtils.doCopyFile(FileUtils.java:1147)
        at org.apache.commons.io.FileUtils.doCopyDirectory(FileUtils.java:1428)
        at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1389)
        at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1261)
        at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1230)

我没有任何线索为什么线程卡在该本地调用中。 是否有环境问题或与机器有关?

我刚刚从IO-385那里得到了线索

由于我使用的是Apache commons-io 2.4版。 上面有一个错误,其中FileUtils.doCopyFile可能导致无限循环。

for(long count = 0L; pos < size; pos += output.transferFrom(input, pos, count)) 
{
     count = size - pos > 31457280L ? 31457280L : size - pos;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM