0

我正在为一个大文件(~30GB)实现一个外部排序,所以在我将这些块写入磁盘之后,我创建了chunks. 但是我得到一个BufferedReader(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"), maxBufferSize)maxBufferSize = Runtime.getRuntime().freeMemory() / chunksOutOfMemory例外。

我猜垃圾收集器没有足够的时间来清理内存(当我停止调试器时它不会抛出异常),但在这种情况下,为什么Runtime.getRuntime().freeMemory()会给出这个结果?

是否可以显式调用垃圾收集,或者唯一的选择是让进程休眠一段时间?

4

2 回答 2

2

是否可以显式调用垃圾收集

对的,这是可能的。但这不会有任何好处。

JVM 只会在执行完整的 GC 后抛出 OOME。显式调用System.gc()(很可能)只会浪费 CPU 时间。


实际上,我认为您真正的问题在这里:

我创造chunks时代BufferedReader(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"), maxBufferSize)maxBufferSize = Runtime.getRuntime().freeMemory() / chunks

当您考虑各种对象开销时,(maxBufferSize + overheads) * chunks可能会比可用内存量大一点。

通常,在 Java 堆接近满的情况下运行是个坏主意。即使您没有完全耗尽空间,您也会发现运行接近满会触发许多(太多)垃圾回收。

在这种情况下,您并没有真正从拥有非常大的 I/O 缓冲区中获得很多好处。8KB 到 64KB 范围内的缓冲区应该没问题……这是我的直觉。另见彼得劳里的评论!

于 2016-01-05T03:56:19.817 回答
0

您可以尝试使用System.gc(),但它不是最有用的。您可以尝试为程序提供更多内存。

于 2016-01-05T03:40:29.880 回答