1

我有一个程序在重新启动之前运行了 12 个多小时。该程序是一个我的世界服务器,所以它不能经常重新启动。

无论如何,大约每 25-35 分钟读取一个大小为 42-67mb 的文件。我使用 RandomAccessFile 和 MappedByteBuffer 将文件读入 ObjectInputStream。

问题是每次读取文件时,内存使用量都会增加 100-300mb,这最终会导致 OOM,因为它永远不会被垃圾收集。我目前正在使用 VisualVM 对其进行调试,并且仅在读取文件时看到内存使用量增加。

我已经添加了

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

但它似乎并没有让虚拟机进行垃圾收集。

4

1 回答 1

3

当我在 2003 年左右测量时,映射缓冲区相对于随机访问文件的速度优势约为 20%。如果它从那以后有所增加,我会感到惊讶,如果它对于顺序访问同样高,我也会感到惊讶。考虑到 OOME 的风险,这是不值得的。在 FileInputStream 周围的 BufferedInputStream 周围使用 ObjectInputStream。

于 2012-09-24T22:46:25.187 回答