Emacs 的垃圾回收功能,可不可以手动做?

https://www.gnu.org/software/emacs/manual/html_node/elisp/Garbage-Collection.html#Garbage-Collection

Emacs和外部进程互相交互的时候(比如用Eshell跑一个视频播放器,或者多个Aria2),垃圾回收会导致卡卡的。

我想直接禁用垃圾回收,然后手动判断并回收,反正我的内存大,也不怕消耗。

唯一的问题在于,我如何得知什么时候占用内存过大,需要回收呢

memory-use-counts 这个方法返回的数量基本上加起来一直在 2.3G 左右 memory-info 这个方法在Mac上一直返回nil (源码里也确实没加其他系统的支持)

我期望的是可以找到一个指标,代表了Emacs内存占用高低,它在调用 garbage-collect 之后会显著减少,会有这个东西吗

1 个赞

直接调大 gc-cons-threshold

然後我不认为和外部进程交互会有頻繁 GC。

调到最大后就没有GC了,我怕人不在的时候会出问题(比如系统突然炸了)。。。

就是不知道手动GC的触发时机和频率多久合适。。。。

---

外部进程交互有GC是肉眼可见的,比如在 shell 里编译,或者那种日志特别特别多的情况下,gc-post-hook 疯狂调用的

在会造成大量 GC 的行为前设置,用完调回來啊。(比如用个 hook, unwind-protect)

因為向 buffer 里倒太多东西的原因。这種情況就 redirect 输出到临时文件或者 /dev/null 去。

那要是找不到这个行为呢,缓慢增长的那种。。。比如平时写一点脚本什么的

那用正常的 GC 有什麼问題么?

正常的会在不经意间突然顿一下。。。很讨厌。

我希望可以自己控制,虽然也是顿一下。但是至少是自己要求的顿一下

明白了。那你可以在一开始把 gc-cons-threshold 调大。然后用 run-with-idle-timer 设置 idle 一定时间后临时调小做 GC。

嗯,好像也不需要临时调小,直接调用 garbage-collect 方法应该是一样的效果

为何我没有感觉到过gc?

难道是因为神经比较大条?

2 个赞