是否可以强制应用程序释放一些分配的内存?

是否可以强制应用程序释放一些分配的内存?

自从大约一年前我重新使用 Firefox 以来,我一次又一次地面临着同样的问题 - 浏览器一直在消耗我的内存。问题的根源在于(也许是错误的假设),一旦用户关闭选项卡,浏览器就会释放为该选项卡分配的内存。当然,Firefox 和许多其他浏览器一样在后台运行一些缓存。重新打开最近关闭的标签似乎也与此有关。因此,内存释放的速度不会像用户希望的那样快。

我在许多论坛(包括 Mozilla 的)上读到,如果另一个进程需要 Firefox 现在不需要的已分配内存,操作系统(在我的例子中是 Debian Jessie)将从浏览器中获取一些内存并将其提供给其他进程。是的,这确实应该发生,但事实并非如此。 Firefox 不断消耗常驻内存,一旦内存几乎耗尽(例如 3.8GB 中的 3.6GB 左右),交换就会开始。所有这些都会导致极其痛苦的浏览体验。关闭选项卡没有任何好处。即使我关闭 Firefox,分配的内存仍然存在相当长的一段时间。

我想知道是否可以强制操作系统重新分配进程已使用的所有内存(包括交换)(即使现在没有其他进程需要该内存)但现在已关闭。

编辑:

这里要求的是Firefox 关闭前后的调用结果free(为了可读性而使用了参数):-h

前:

               total       used       free         shared       buffers        cached

Mem:           3.7G        3.6G       134M         6.8M         5.0M           166M

+/- buffers/cache:         3.4G       306M

Swap           3.7G        2.8G       916M

后:

               total       used       free         shared       buffers        cached

Mem:           3.7G        2.9G       856M         4.8M         12.0M          179M

+/- buffers/cache:         2.7G       1.0G

Swap           3.7G        2.7G       998M

正如您所看到的,一些轻微的下降是明显的,但与浏览器关闭后 20-30 分钟的总体内存使用(驻留内存和交换内存)相比,这根本不算什么。除了 Firefox 之外,我没有启动任何其他程序,除了通常的 Debian 进程和几个面板小程序(天气、CPU+HDD+Mem 监控、网络监控等),它们不需要大量内存,我几乎无法注意到它们的值htop。我所做的基本上就是让浏览器整天打开并关闭/打开选项卡。我必须承认我的会话中有很多选项卡,但是我在开始(以及稍后)时只加载其中的一些选项卡。我的猜测是,即使没有加载内容,选项卡也可能会占用大量内存。然而,这并不能解释为什么关闭浏览器后我有如此高的内存分配。事实上,它是如此之高,以至于有时我无法正确关闭系统,而不得不进行冷关闭。

答案1

简而言之,答案是否定的:一旦应用程序分配了内存并使用了它,它就“属于”该应用程序,除非该应用程序释放它,否则没有其他任何东西可以回收它。 (这并不像调用free()while 那样简单,因为它只是将内存返回到单个应用程序的池,而不是系统。)

交换应该有助于解决这个问题:一旦物理内存已满,操作系统可以将很少使用的内存页面移至交换。如果实际工作集大于物理内存,这只会导致系统崩溃:内存总是在交换区中移动并返回,系统无法执行任何有用的操作。

在 Linux 上,作为最后的手段,OOM 杀手将介入并终止进程以回收其内存。

奇怪的是,当 Firefox 停止时,你并没有看到内存被恢复。也许 Firefox 进程在窗口消失后需要一段时间才能真正退出(请检查ps或您的任务管理器)。当进程停止时,其分配的所有内存都将被释放并可供其他进程使用。

相关内容