iSeries上的NIO文件通道传输问题

时间:2009-11-06 16:18:55

标签: java nio ibm-midrange

我遇到了在iSeries盒子(JDK 1.5)上运行的一些Java NIO代码的问题。基本上,代码将文件拆分为文件的块部分到另一个较小的文件。一段时间以来,相同的代码一直在其他iSeries盒子上运行,没有任何问题。这是代码片段:

//copy original data file content to temp file
long startPos = dataFile.length() - remaining;
long transferSize = maxSizeBytes - size;
size += inChannel.transferTo(startPos, transferSize, outChannel); //exception here
remaining -= size;

这是堆栈跟踪:

Caused by: java.io.IOException: Operation not supported. Map failed
 at java.lang.Throwable.<init>(Throwable.java:196)
 at java.lang.Exception.<init>(Exception.java:41)
 at java.io.IOException.<init>(IOException.java:40)
 at sun.nio.ch.FileChannelImpl.map0(Native Method)
 at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:742)
at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:448)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:521)

... 11更多

我做了一些调查,到目前为止的原因(父目录的文件权限,内存不足,共享内存控制QSHRMEMCTL关闭,使用SAN)都被证明是不成功的。

任何人都有过这个特殊问题的经历吗?

谢谢, 布拉德。

3 个答案:

答案 0 :(得分:1)

在我看来,达到文件句柄限制可能会导致JVM引发非明显异常。

检查您是否有足够的文件句柄可用。 ulimit会告诉您有多少人可以使用。 (当然,如果它是一个守护进程,你会想知道运行JVM的用户的这个数字。)这个问题也是系统/用户特定的,这有点适合你的描述这在其他地方运行的事实很好。

答案 1 :(得分:0)

根据this thread(支持参考NIO源的参数),可能的原因是内存不足。

答案 2 :(得分:0)

好的,另一个镜头:你能发布更多代码吗?就像所有易通品和控制回路的初始化一样。即使你说其他地方的作品,我也不得不对一些事情感到疑惑,因此忽略了这一点。

1: long startPos = dataFile.length() - remaining;
2: long transferSize = maxSizeBytes - size;
3: size += inChannel.transferTo(startPos, transferSize, outChannel); //exception here
4: remaining -= size;
  1. remaining是否在您的循环之外初始化为dataFile.length()?如果没有,那么这将一直从一开始就爆发。
  2. size可能更好地命名为bytesTransfered。我发现自己有点混淆了。
  3. 您不需要remainingsize个变量。一个或另一个应该足够了
  4. maxSizeBytes初始化为值&lt; = dataFile.length()
  5. 您可以记录startPostransferSizedataFile.length()吗?我想知道你是不是在意外
    1. 传递大于transferSize
    2. dataFile.length()
    3. 传递大于startPos
    4. dataFile.length()