Поток завис на sun.nio.ch.FileDispatcherImpl.size0 (собственный метод) - PullRequest
0 голосов
/ 21 сентября 2018

В моем Java-приложении мне нужно скопировать содержимое каталога из одного в другой.Но иногда (очень редко) copyDirectory зависает навсегда, и код не выполняется после этого.Что приводит к высокой загрузке процессора.Я проверил 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)

Я попытался скопировать его вручную с помощью команды оболочки, но они успешно скопированы.Также есть еще один поток, который долго находится в рабочем состоянии со следующей трассировкой стека.

"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)

Я не понимаю, почему поток застрял в родном вызове.Есть ли экологические проблемы или связанные с машиной?

1 Ответ

0 голосов
/ 21 сентября 2018

Я только что получил ключ от 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;
}
...