本人前端,主要用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配置
https://github.com/zedhugh/creature/blob/refactor/lisp/init-lsp.el
分别启用 lsp-mode
和 eglot
,执行 M-x list-processes
看是否有大量未结束的进程。
最好去 lsp-mode 项目提 issue,提 issue 就得做好充分的验证了,证明确实存在相关性。
1 个赞
并不是进程的问题,进程不会增多。
而且我也用 Emacs 28 内置的 memory-report
和 memory-usage
这个包看过了,都没发现内存消耗到哪里去了,所以才上来问问有没有发现相同现象的坛友。要是能精准定位哪里消耗内存早就直接去提issue了啊
因为eglot是和flymake配合的,而lsp是和flycheck配合的,之前怀疑过是不是flycheck的问题,试过在使用lsp时禁用flycheck,结果还是内存持续增加。所以完全不能确定到底是在哪里消耗掉内存了。
上述过程中唯一的变量就是eglot和lsp,所以怀疑是lsp的问题。
1 个赞
按照lsp-mode的模板进行测试,提供更多信息。如果是真的问题解决很快的,这样模糊的描述无助于解决问题。
1 个赞
Lenic
7
@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
这个命令找出来的
后续贴一个详细的结果上来请大神看看
yyjjl
11
似乎有人找到了 lsp-mode 的一个 memory leak 问题的原因: response-handlers 一直没有清理
3 个赞