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

0

このスレッド(NIO ソースを参照して引数をサポートする) によると、考えられる原因はメモリ不足の状態です。

于 2009-11-06T16:48:36.500 に答える
0

OK、別のショット: コードをもっと投稿していただけますか? すべての実行可能なものと制御ループの初期化のように。あなたは他の場所でうまくいくと言っていますが、私はいくつかのことについて疑問に思う必要があるので、それを無視しました.

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. remaining変数と変数の両方は必要ありませんsize。どちらかで十分です
  4. maxSizeBytes<= に初期化されますdataFile.length()
  5. startPostransferSize、およびをログに記録できますdataFile.length()か? うっかりしてるのかな
    1. transferSizeより大きい値を渡す dataFile.length()
    2. startPosより大きい値を渡すdataFile.length()
于 2009-11-12T17:37:53.870 に答える