lsp-mode内存占用问题

本人前端,主要用TypeScript写React。tsx使用的web-mode。

lsp server使用的是 typescript-language-server。 但在使用lsp-mode的时候,内存一直在持续增长。

大半天就会达到1G+。但是使用eglot的时候就会稳定在 300M~400M 之间,不会像 lsp-mode那样一直持续增长。

当然,lsp-mode虽然内存占用多,但是体验还是很顺滑的。我主要在用emacs-28,但是27也有相同的现象。

由于种种原因native-compile功能我是关闭了的,但是我能确定native-compile对内存方面没啥影响。

这是我的lsp配置

能把前面讨论的帖子迁移过来吗?

不知道咋迁移 :rofl:

1 个赞

分别启用 lsp-modeeglot,执行 M-x list-processes 看是否有大量未结束的进程。

最好去 lsp-mode 项目提 issue,提 issue 就得做好充分的验证了,证明确实存在相关性。

1 个赞

并不是进程的问题,进程不会增多。

而且我也用 Emacs 28 内置的 memory-reportmemory-usage这个包看过了,都没发现内存消耗到哪里去了,所以才上来问问有没有发现相同现象的坛友。要是能精准定位哪里消耗内存早就直接去提issue了啊 :rofl:

因为eglot是和flymake配合的,而lsp是和flycheck配合的,之前怀疑过是不是flycheck的问题,试过在使用lsp时禁用flycheck,结果还是内存持续增加。所以完全不能确定到底是在哪里消耗掉内存了。

上述过程中唯一的变量就是eglot和lsp,所以怀疑是lsp的问题。

1 个赞

按照lsp-mode的模板进行测试,提供更多信息。如果是真的问题解决很快的,这样模糊的描述无助于解决问题。

1 个赞

@zedhugh 求一个 eglot 的配置,我的 LSP 配置有点儿特殊,我看能不能平移过去

就上面那个链接里面就是,lsp和eglot的配置我放到一起的

抽空看看,之前粗略的排查了一下,好像lsp--buffer-workspaces这个变量挺大的有几十M,而且是buffer-local,而且每个server相同的buffer都有一份相同的。

比如我写tsx和ts都是用的typescript-language-server,用到这个server的buffer对应的lsp--buffer-workspaces这个变量都是一样的。

以上结果是用memory-usage-find-large-variables 这个命令找出来的

后续贴一个详细的结果上来请大神看看

建议你先看看wiki: https://emacs-lsp.github.io/lsp-mode/page/performance

似乎有人找到了 lsp-mode 的一个 memory leak 问题的原因: response-handlers 一直没有清理 :rofl:

3 个赞

终于可以回到 daemon 的方式上了 :tada: