1

再起動するまでに 12 時間以上実行されるプログラムがあります。プログラムはMinecraftサーバーであるため、実際にはそれほど頻繁に再起動することはできません.

とにかく、約 25 ~ 35 分ごとに、サイズが 42 ~ 67 MB のファイルが読み取られます。RandomAccessFile と MappedByteBuffer を使用して、ファイルを ObjectInputStream に読み込みます。

問題は、ファイルが読み取られるたびにメモリ使用量が 100 ~ 300 MB 増加し、ガベージ コレクションが行われないため、最終的に OOM が発生することです。現在 VisualVM を使用してデバッグしていますが、ファイルの読み取り時にのみ RAM の使用量が増加しています。

私が追加しました

((DirectBuffer) buffer).cleaner().clean();

しかし、VM をガベージ コレクションするようには見えません。

4

1 に答える 1

3

ランダムアクセスファイルに対するマップされたバッファの速度の利点は、2003年頃に測定したとき、約20%でした。それ以降、増加した場合は驚きます。また、シーケンシャルアクセスの場合と同じくらい高い場合も驚きます。OOMEのリスクを考えると、それだけの価値はありません。FileInputStreamの周りのBufferedInputStreamの周りにObjectInputStreamを使用します。

于 2012-09-24T22:46:25.187 に答える