繁体   English   中英

JVM内存不足

[英]JVM out of memory

我正在为一个大文件(〜30GB)实现一个外部排序,因此在将大块写入磁盘后,我创建了chunks时间BufferedReader(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"), maxBufferSize) maxBufferSize = Runtime.getRuntime().freeMemory() / chunks 但是我收到了OutOfMemory异常。

我猜垃圾回收器没有足够的时间来清理内存(当我停止使用调试器时,它不会引发异常),但是在那种情况下,为什么要给Runtime.getRuntime().freeMemory()结果?

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

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

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

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范围内的缓冲区应该没问题。 另请参阅Peter Lawrey的评论!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM