在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)
在gc之前运行没有效果;在gc之后运行可以把内存返回给操作系统,从2G降到400M。之后内存占用仍会继续增加。
我之前遇到过严重的内存泄漏,把剩余几十G硬盘空间都占满了,卡死后,我重启了电脑。
尝试了emacs-native-comp-git-enhanced,不能解决问题。不过感谢
SPQR
11
有没有可能是用了gcmh,然后把gcmh-high-cons-threshold
设的太高了,导致emacs一直没有进行GC操作?
1 个赞
是的,我设置了很高的gc阈值,用的gc-cons-threshold
。
SPQR
13
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 个赞