操作系统如何处理内存泄漏

时间:2018-09-09 20:09:46

标签: memory memory-leaks virtual-memory

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

我想知道某个过程导致内存泄漏并终止后会发生什么。在我看来,由于虚拟内存,这并不重要。在所有物理页面仍然可以分配给其他/新进程之后,即使它导致较早的内存泄漏(在旧进程导致内存泄漏之后)

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

2 个答案:

答案 0 :(得分:1)

推荐阅读:Operating Systems: Three Easy Pieces

在常见的操作系统(例如Linux,Windows,MacOSX,Android)上,每个process都有自己的virtual address space(以及堆存储器,例如用于mallocmmap ,位于该虚拟地址空间内),并且当进程终止时,其整个虚拟地址空间将被破坏。

因此内存泄漏不会在进程本身中幸存下来。

可能会有一些微妙的情况(例如,使用shm_overview(7)shmget(2)时出现泄漏)。

阅读(对于Linux)proc(5),尝试使用cat /proc/self/maps,另请参阅this。学习使用valgrindAddress Sanitizer

还请阅读有关Garbage Collection的信息。这很相关。

答案 1 :(得分:1)

在现代操作系统中,地址空间分为用户空间和系统空间。所有进程的系统空间都是相同的。

杀死进程时,将破坏该进程的用户空间。如果应用程序存在内存泄漏,则可以通过终止进程来弥补该泄漏。

但是,操作系统也可以在系统空间中分配内存。如果操作系统的系统空间内存分配出现内存泄漏,则终止进程不会释放它。

那是迫使您重新引导系统的内存泄漏类型。