gpt4 book ai didi

Java FileChannel 缺少取消映射(RAM 后果?)

转载 作者:太空狗 更新时间:2023-10-29 12:28:32 29 4
gpt4 key购买 nike

我在我的应用程序中以 FileChannel.MapMode.READ_WRITE 模式创建/使用内存映射文件。这些文件在应用程序的整个生命周期中创建和删除。

由于 GC 不一定释放直接缓冲区以_取消映射_底层操作系统缓冲区,我想知道操作系统的后果是什么,更具体地说是关于 RAM 使用情况。

我了解进程的“虚拟内存”仍然被不必要的映射污染,但对实际 RAM 使用的影响是什么(我猜“常驻内存”中的缓冲区会随着时间的推移而被刷新)。

进程似乎可以在操作系统级别(使 JVM 崩溃)出现 OOM(内存不足),而不是 Java OOM(内存不足)(堆中仍有大量空间)。

我在 Linux 64 位(3.13.0-68-generic/Ubuntu)机器上使用 Oracle JRE 1.8.0_66-b17。

最佳答案

地址空间是一种资源,您可以独立(某种程度上)耗尽可用内存。

使用磁盘支持的文件映射,您只消耗与页面缓存(缓存读取和等待写入的脏页)一样多的内存。但是保留的地址空间是整个映射的大小。

您还会消耗文件句柄,并且很可能首先用完这些文件句柄。

Java 在 GC 时执行 munmap 映射——然而,这意味着它发生在 GC 的时间表上,而不是你的。这通常是可以的,只要它释放地址空间的速度比您分配它的速度快。但就像文件描述符或任何其他有限资源一样,您肯定会用完。

对于 64 位,这需要一段时间。这在 32 位系统上更重要。

有很多人呼吁改进对映射的控制,因为依赖终结器并不是很好。但是在不影响性能或安全性的情况下很难做得更好。 To quote Sun's evaluation of the problem

There is no unmap() method on mapped byte buffers because there is no known technique for providing one without running into insurmountable security and performance issues.

关于Java FileChannel 缺少取消映射(RAM 后果?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113991/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com