请教emacs占用内存持续增加的原因

在virtualbox上运行的archlinux, 版本是aur的emacs-git,运行的程序只有emacs和终端。

与gc相关的只有这句话:(setq gc-cons-threshold (* 10 1024 1024 1024))

emacs在启动后,内存持续增加,大概一秒增加1Mb,直至上限10G。而后垃圾回收,大概要几分钟,然后可以正常继续运行。随后占据的内存不会返回给操作系统。

排查了以下,不是 pyim 的影响,不是 lsp-bridge 的影响。

emacs -Q 则无此问题。

我查看了相似的帖子和邮件里的讨论,知道emacs得到的内存不会返回给操作系统是特性。但没有找到解决占用持续增长的方法。

以下是memory-usage和memory-report的报告。好像没有不正常的。

我不清楚如何排查原因,因此希望大家指点迷津,或者能听一听大家的经验。提前感谢大家。

顺便之前这个问题在emacs27上也会出现

1 个赞

我明天打算用排除法过一遍配置

Memory leak. Yes, please debug.

经过排查,可能是awesome-tray的更新时间设置太短导致的。

awesome-tray-update-interval 设为0.05时,每秒增加1Mb内存 设置的间隔时间越大,增加越慢;间隔时间越短,增加越快

awesome-tray-update-interval 是一个run-with-timer的重复间隔参数

emacs-nativecomp emacs-native-comp-git 建议使用这两个包

执行 (malloc-trim) 后会缓解吗?

1 个赞

(malloc-trim) 在gc之前运行没有效果;在gc之后运行可以把内存返回给操作系统,从2G降到400M。之后内存占用仍会继续增加。

我之前遇到过严重的内存泄漏,把剩余几十G硬盘空间都占满了,卡死后,我重启了电脑。

尝试了emacs-native-comp-git-enhanced,不能解决问题。不过感谢

有没有可能是用了gcmh,然后把gcmh-high-cons-threshold设的太高了,导致emacs一直没有进行GC操作?

1 个赞

是的,我设置了很高的gc阈值,用的gc-cons-threshold

doom的配置(setq gcmh-high-cons-threshold (* 16 1024 1024)),阈值如果高到GC会导致emacs卡顿就得不偿失了。。。这个设置gchm会在用户没有操作的时候进行GC,一般情况下不会卡手。

1 个赞

感谢!我去试一试

总结:

内存占用增长过快:可能是因为配置里有run-with-timer,而且timer的重复间隔过短,调用的函数复杂。可以增加重复间隔来解决。

内存占用过多,不返回给操作系统:(garbage-collect)后,执行 (malloc-trim)

gc-cons-threshold不要设置过大。可以在idle时执行gc,或者使用gcmh。

(malloc-trim) 是emacs自身的命令吗?

运行htop -F emacs.

daemon 340M内存.

独立的emacs -nw进程400M左右。spellcheck, flymake, emms, pyim都开了。

emacs内存消耗不会太大,否则一般都有优化的空间.

Emacs 28 可以 M-x memory-report检查内存消耗.

2 个赞

可以在 idle timer 中运行 malloc-trim。。。不过我猜根本原因是你的 gc-cons-threshold 太高。

1 个赞

这是 emacs 29 引入的函数

内存泄露和硬盘没关系把

可能是系统把内存缓存到硬盘上了。