Java MemoryMappedFile资源发布/垃圾收集

时间:2018-08-03 22:43:35

标签: java

我正在处理一个很大的浮点文件(约250GB),需要不断访问和修改它的数据;没有很好的热点来缓存数据。所以我正在考虑使用memorymappedfile。但是我不太确定JVM和OS如何处理去映射和资源释放。
假设我正在从原始250GB文件映射块大小约为100MB的区域。最终,所有250GB的数据都将被映射,并且如果以前的映射都没有从RAM中释放,它是否还会因为内存不足而使JVM或OS崩溃?如果实际上释放了此类映射,那么背后的机制是什么?
谢谢!

1 个答案:

答案 0 :(得分:0)

  

说我正在从原始250GB文件映射块大小约为100MB的区域。最终,所有250GB的数据都将被映射,并且如果以前的映射都没有从RAM中释放,它是否还会因为内存不足而使JVM或OS崩溃?

不。如果最初的映射文件请求成功,则访问映射文件不会直接导致JVM或OS 1 崩溃。

  

如果实际上释放了此类映射,那么背后的机制是什么?

简短的回答:操作系统的虚拟内存系统。

请注意,您实际上在谈论的映射是物理RAM页面和虚拟地址之间的映射。典型OS上的虚拟内存系统可以透明地进行处理。如果物理RAM页用完了,它将把脏内存页刷新到磁盘,然后将它们重新分配给其他虚拟地址。

参考文献:

(关于虚拟内存等问题,还有其他StackOverflow问与答的很多。)


1-实际上,如果用力推动,可能会...。假设您映射的文件实质上大于物理RAM的数量。然后,假设您以随机的方式积极地读写它。这可能会产生大量虚拟内存I / O流量,以至于“颠簸”导致其他应用程序和OS本身变得无法使用。在Linux上,这很可能导致“ OOM killer”进程杀死JVM。