在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。
             
            
              
              
              1 个赞
            
           
          
            
            
              (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 个赞