3

我在 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)都被证明是不成功的。

有人对这个特殊问题有任何经验吗?

谢谢,布拉德。

4

3 回答 3

1

我一直记得,达到文件句柄限制可能会导致 JVM 引发不明显的异常。

检查您是否有足够的文件句柄可用。 ulimit将告诉您有多少可供您使用。 (当然,如果 JVM 是守护进程,您需要知道运行 JVM 的用户的这个数字。) 这个问题也将是系统/用户特定的,这有点符合您对在其他地方运行的事实的描述就好了.

于 2009-11-07T14:37:39.467 回答
0

根据这个线程(它支持参考 NIO 源的参数),可能的原因是内存不足。

于 2009-11-06T16:48:36.500 回答
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初始化为一个值 <=dataFile.length()
  5. 你能记录startPos,transferSizedataFile.length()吗?我想知道你是否不经意间
    1. 通过 transferSize大于dataFile.length()
    2. 通过startPos大于dataFile.length()
于 2009-11-12T17:37:53.870 回答