计算机进程占用过多内存的时间是什么,操作系统必须终止它?我在想memory leak
,但这意味着没有使用的内存被占用,但实际情况并非如此。我也不会使用术语stack overflow
,因为内存可以在堆上分配。
答案 0 :(得分:1)
"内存泄漏"也不是"堆栈溢出"真的,削减它。内存泄漏是程序中的错误,可能导致长期内存不足。 A"堆栈溢出"是一个用尽调用堆栈。
并非所有系统都会终止耗尽所有内存的进程。通常情况下,进程本身无法分配更多内存(在系统设置的约束范围内),导致内存不足"发生错误(在Unix上的C中,malloc()
返回NULL
指针,errno
变量设置为ENOMEM
)。当单个进程占用所有内存时,这不一定会发生,但当许多其他进程使用大量内存时,可能会发生在任何进程中(使用草率语言,可能存在系统强加的限制)每个用户等。)
我可能会称这个进程占用了系统内存中的大部分内存,但我从来没有见过描述事件运行的术语内存不足。 "内存耗尽"也许,或者只是简单地导致内存不足的情况"。
答案 1 :(得分:1)
当计算机进程使用太多内存时,操作系统必须终止它
你在这里所描述的并不会发生。操作系统与操作系统的行为有所不同,但没有一个像您描述的那样发生。例如,在Windows上,内存分配可能会失败,但这并不意味着操作系统会终止进程。分配内存的调用返回一个错误代码,进程决定它如何处理这种情况。 Linux有这种疯狂的内存分配方案,在没有任何支持的情况下,分配成功,然后对内存的实际引用可能会失败。在这种情况下,Linux运行oom-killer:
这是linux' oom杀手的工作。当一切都失败时,牺牲一个或多个进程以释放系统内存。
请注意,oom-killer是由badness()
函数选择的进程,不一定是实际触及没有支持的页面的进程(即不是请求内存的进程)。在Linux中,区分正在分配的内存也很重要。并且记忆被引用'第一次(即PTE恶作剧)。
因此,严格地说,你描述的内容并不存在。但是,流程的通用名称“内存不足”。是out of memory
,通常缩写为OOM。在大多数现代系统中,OOM条件表现为一个例外,并且是由该过程自愿引发的异常,而不是OS。
OS在现场杀死进程的一种情况是在保护页PTE未命中期间发生OOM(即,OS无法提交虚拟页)。由于操作系统没有空间来实际分配防护页面,因此它没有空间实际为进程编写异常记录,并且它无法引发异常(这会导致堆栈溢出异常,因为我们正在谈论一个警卫页面)。操作系统别无选择,只能消除这个过程(技术上不是杀戮,因为杀戮是一种信号)。
答案 2 :(得分:0)
OutOfMemory-Exceptions是我最好的猜测