[英]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.