OS 如何处理内存泄漏

How OS handles memory leaks

我对这个问题进行了很多搜索,但无法找到我的确切查询,尽管它看起来很笼统,可能已经在某个地方被问到并得到了回答。

我想知道进程导致内存泄漏并终止后会发生什么。在我看来,由于虚拟内存,这没什么大不了的。毕竟所有物理页面仍然可以分配给 other/new 进程,即使它早些时候导致内存泄漏(在旧进程导致内存泄漏之后)

但是我在某处也看到,由于内存泄漏需要重启系统,我似乎不明白为什么???

推荐阅读:Operating Systems: Three Easy Pieces

在普通操作系统上(例如 Linux、Windows、MacOSX、Android)每个 process has its own virtual address space(以及堆内存,例如用于 mallocmmap,在该虚拟地址 space 内),当进程终止时,其 整个 虚拟地址 space 被销毁。

所以内存泄漏不会在进程本身中存在。

可能存在细微的极端情况(例如使用 shm_overview(7) or shmget(2) 时的泄漏)。

阅读(Linux)proc(5), try cat /proc/self/maps, and see also . Learn to use valgrind and the Address Sanitizer.

另请阅读 Garbage Collection。很有关系。

在现代操作系统中,地址 space 分为用户 space 和系统 space。系统space对所有进程都是一样的。

当您终止一个进程时,会破坏该进程的用户 space。如果应用程序存在内存泄漏,则终止进程可以解决泄漏问题。

但是,操作系统也可以在系统中分配内存space。当操作系统分配系统 space 内存时出现内存泄漏,终止进程不会释放它。

这是迫使您重新启动系统的内存泄漏类型。