emacs28.2在windows10下内存泄露问题

大家有没有遇到emacs28在windows上安装包时内存泄露问题? 我试下emacs28.2和emacs28都存在这个问题。 安装包配置

(require 'package)
(setq package-archives '(("gnu"   . "http://mirrors.cloud.tencent.com/elpa/gnu/")
                         ("melpa" . "http://mirrors.cloud.tencent.com/elpa/melpa/")))
(package-initialize)

操作系统:windows 10 Home版本

操作:M-X package-install use-package

结果:emacs卡死,内存成倍狂飙,直到内存耗尽

在Windows中,已经用回了 27.2版本。
从28.1开始,windows版只要一起动,就弹出编译警告,同时会在.emacs.d配置目录内产生一个log目录,不断的产生错误记录文件。这种现象到了28.2版本依然存在。
用起来有点恐惧感。:cold_sweat:所以换回旧版了。

我在 Windows 上从 27 开始就一直用的 master分支(现在是 29.0.50),挺好用的,速度也快,更重要的是 29 支持双缓冲了,滚动屏幕不会闪烁。从来没遇到过内存泄露。

@blove 你说的 log 目录是 eln-cache

是的。那个目录会自动生成,里面会不断增加类似调试记录的文件。

这个是 native compilation 第一次编译包生成的文件,你看到的警告是编译时的提示信息,没关系的。编译完成后以后就不会显示了。

但如果你的配置用了懒加载,会在你第一次使用的时候进行编译,等一下就好了。

这可是 28.1 的大功能更新,别怕 :joy:

1 个赞

哦哦,是这样啊,原先我特害怕!都不敢在win系统上用。听你这么一说,我就不怕啦!我再用用试试看!:smile:感谢告知! :+1:t2::hugs:

这个功能很是不便,每次更新插件就要重新编译一次。 都没个开关选项的。

刚才试了一下,运行 emacs 后 eln-cache\28.2-5a1d5235 目录产生了 135 个 tmp 或 eln 文件!心想这回再启动 emacs 应该不用再编译了吧!结果重启 emacs 后又重新编译,重复这个过程,又新产生 135 个文件! :rofl:有没有设置可以关闭这个编译呢?!

你是不是把这个目录删了啊? 不要手动删。如果不喜欢那个目录可以自己改。

(when (and (>= emacs-major-version 28) (native-comp-available-p))
  (setq native-comp-eln-load-path YOUR_PREFERRED_PATH
        native-comp-async-report-warnings-errors 'silent))

这个顺便把警告也关了。

关它干嘛呢,习惯就好了。

1 个赞

你要等编译完成,再重启。编译是需要一点时间的。 你可以切到 *Async-native-compile-log* 这个buffer 查看编译的进度,最后看到 finished,就说明目前加载的包都编译完成了。

如果你继续使用的话,遇到第一次使用的包,还会继续执行编译,稍微等一下。

建议不要关闭,因为编译过程使用 Emacs 的话,会感觉卡顿的,关闭提示的话,反而以为是哪里出问题了。你反正用了 28 稳定版,用一段时间后,以后就不会提示了。

如果希望直接就全部编译好内置的包,可以自己手动编译。
下面是我在 windows 上用的编译命令,可以用于编译 29 也可以编译 28. 其中的 NATIVE_FULL_AOT=1 就是在编译 Emacs 时同时编译内置的包为 eln,但是这个会增加编译的时间。

 ./autogen.sh
 ./configure --with-native-compilation --without-dbus
 make -j$(nproc) NATIVE_FULL_AOT=1
 make install prefix=/c/opt/emacs

这是我记录的在 Windows 上的编译步骤,或者直接看Emacs 官方仓库的编译安装说明

我并没有删除那个目录,重启emacs后,会在那个目录继续增加文件!比如原先编译完成后,那个目录产生了 135 个文件,重启后又编译一次,翻了一倍 135 + 135 个文件! :rofl:

好,我看看!

eln-cache 这个目录不用管它的,路径其实也没必要去修改。如果 .emacs.d 是用 Git 管理,直接把它加入 .gitignore 文件忽略就好了。

1 个赞

嗯嗯!好的!!!

目前尝试编译安装,在执行到

./configure --with-native-compilation --without-dbus

提示错误

configure: error: ELisp native compiler was requested, 
but libgccjit was not found.
Please try installing libgccjit or a similar package.

libgccjit 应该如何安装?
执行到

make -j$(nproc) NATIVE_FULL_AOT=1

这一步时,提示缺少 gnutls,即使在 configure 时,加了 --with-gnutls=ifavailable

./configure --with-native-compilation --without-dbus --with-gnutls=ifavailable

也不行!

pacman -S gnutls

后,在 msys 目录能只找到这两个 dll

gnutls

源码是在 Index of /pub/gnu/emacs 这里下载的!不知道是不是与github上的一致!

在启动msys2的 mingw64 环境,执行 pacman -S mingw64/mingw-w64-x86_64-libgccjit 应该可以安装。

但其实不用单独安装,你执行下面这段,应该就自动帮你装好了所有的依赖。

pacman -S --needed base-devel \
  mingw-w64-x86_64-toolchain \
  mingw-w64-x86_64-xpm-nox \
  mingw-w64-x86_64-libtiff \
  mingw-w64-x86_64-giflib \
  mingw-w64-x86_64-libpng \
  mingw-w64-x86_64-libjpeg-turbo \
  mingw-w64-x86_64-librsvg \
  mingw-w64-x86_64-libwebp \
  mingw-w64-x86_64-lcms2 \
  mingw-w64-x86_64-jansson \
  mingw-w64-x86_64-libxml2 \
  mingw-w64-x86_64-gnutls \
  mingw-w64-x86_64-zlib \
  mingw-w64-x86_64-harfbuzz

这个源码是可以的, 这是 28.2。记得要用 mingw64 的环境执行编译。 image

如果想用最新的 emacs-28,可以从github 下载

这个确实有点烦人。

对于内置的包,可以编译安装的时候直接加 NATIVE_FULL_AOT=1,就全部编译好了。
macOS 上如果是使用 macports 安装的话,默认也是开启这个选项的。其他平台的不清楚。

对于第三方包,我目前的做法是,第一次启动 Emacs 时全都加载所有的第三方包,这样就会触发所有的包都编译了。使用过程中就不会有任何提示。

我优先使用 stable melpa 的包,更新插件的数目比较少。这样配置比较稳定。emacs 28 的native compilation特性对我也没什么副作用。

技术细节见 How to manage Emacs packages effectively | Chen's blog