记 VSCode 的一次内存泄漏

起因, 在 VSCode 的某次更新之后 TSserver 会莫名其妙的暴毙, TSserver 是 TypeScript 的语言服务器, 负责语法检查和智能提示等功能, 语言服务器挂了之后 VSCode 就真的算是变成记事本了.

在试了很多次之后找到的原因是 GitHub Copilot Chat 这个插件, 因为这个插件会自动的往语言服务器里插入一些东西, 这也是为什么在定义变量名的时候自动补全里会出现这个插件中提到的那些变量名. 但是, 这个插件是有 bug 的, 至少在我这里是有问题的, 由于这个插件的干扰, tsserver 会在某些情况下内存溢出, 随后被进程被杀死, VSCode 发现进程被杀死之后会无限的重启这个进程, 导致我的 CPU 莫名其妙的高负载, 并且 coredump 记录里全是 VSCode 的崩溃记录. (coredump, 核心转储, 写 c 语言触发段错误的时候经常可以见到)

崩溃原因

coredump 记录

内存溢出导致的高内存占用

那么如何解决呢, 很简单, 关掉他对于 TSserver 的干扰就好了, 把下图的勾选框取消就可以了, 对应的 JSON 格式是 "github.copilot.chat.languageContext.typescript.enabled": false

取消中间那个

GitHub Copilot Chat 差不多也算是 VSCode 的官方插件了, 竟然还会出现这样的严重 bug, 并且是默认启用的. 之前在搜索引擎里翻解决方法的时候看到一个类似的问题, 出现在 1.93 版本上, 但是在我的 1.104 上依旧存在. 并且在这个问题在 TSserver 的日志中是没有任何异常的, 就很离谱.

碎碎念

VSCode 在我的 CLion 被 ban 掉之后一直都是我的主力代码编辑器, 那应该是好几年前的事情了, 当时大家在用的 VSCode 对我而言实在难用, 而我自然也是不愿意去用 Dev-C++ 或是 Code::Blocks 这类的老古董. (CLion 现在非商业免费了来着?)

因为算竟的原因, 我不得不使用 c++ 来写题, 现在的话已经大半年的时间没写过一行 c++ 了, 因为 c/c++ 给我一种很纯粹的感觉, 感觉就像是这"只是一门编程语言" (我在说些什么?). 既没有 Python 的简单 (比如说 if 1 < a < 10: 在 Python 中是合法的, 并且官方也推荐这种写法), 也没有 Rust 的极致内存安全 (c/c++ 也算是内存问题大户了), 感觉上 c/c++ 就相当的中性, 只需要做好编程这一件事就行.

扯远了, 因为但是 VSCode 推荐的 c++ 插件实在难用, 性能差的同时功能还少, 反观 CLion 用的 clangd, 不仅高度可定制, 语言服务的提示也相当全面, 这让我之前被强制使用 VSCode 的时候相当不适应, 很难想象这个"记事本"竟然被人称为 IDE, 并且那个插件也时不时出点小问题. 索性直接禁用了所有的代码提示, 只有在编译的时候才能知道哪里写错了. (说实话我还是相当佩服那时的自己, 现在没了 IDE 的提示感觉已经寸步难行了, 好像写题本来也不容易出 bug 来着)

不过这也并不是什么问题, VSCode 最有名的不就是他的可定制化嘛, 在一阵子仔细的琢磨之后也可以变得既好看也好用的, 比如说我的 VSCode 现在长这样, 还是挺符合我的审美的.

VSCode 代码编辑界面

我使用的颜色主题是 One Monokai Theme, 文件图标是 Material Icon Theme, 产品图标(也就是 UI 图标)是 Fluent Icons, 字体是 Maple Mono 启用连体, 部分地方使用斜体.

甚至还换了一个 kawaii 风格的 logo, 来自 Aikoyori/ProgrammingVTuberLogos

VSCode logo

在前阵子我把主力的代码编辑器从 VSCode 换成了完全开源的 zed, 这是一个由 Rust 开发的高性能代码编辑器, 怎么感觉 Rust 已经变成高性能的代名词了. 他的开发团队曾经开发过 Atom.

当然这些都是不重要的, 最重要的是他的原生 Vim 支持, 相较于 VSCode 和 JB IDEs 的 Vim 插件而言, 是我用过体验最好的, 我还为此专门买了把新的键盘来使用他的 Vim 模式. 是的, 换回之前一直心心念念的 65% 配列了. 整把键盘只有 67 个键, 砍掉了 f 键, 右侧的功能键, 和数字小键盘. 换来的是超级顺手的 ESC 键, 他现在在原来的反引号的位置上, 随便一伸手就可以摁到, 对于 Vim 来说这舒服了可不止一点半点, 用过 Vim 的应该都知道 ESC 键有多重要吧. (当然, 我并不推荐普通人使用 65% 配列, 毕竟真的少了太多的键了)

不过 Vim 的话, 说来实在惭愧, 用了不知道多少年了, 到现在还是没用熟, 那一排的 "hjkl" 到现在都是用方向键代替的, 高中时期就开始学的 Vim, 现在都快大学毕业了...

zed 好像使用的是原生的图形 API 来着, 图形渲染全都是自己写的, 所以到现在都还没有支持平滑滚动(具体见这个 issue), 现在的滚动都是以行为单位的上下滚动, 竟然连这一点都要还原 Vim 嘛 🤔? (Vim 是终端程序, 没有图形化, 只能以行为单位进行滚动)

写到这里我又去看了眼 zed, 发现了一件事情, 他貌似压根就没有动画?

当然, zed 作为新生的编辑器, 还是有很多问题的, 比如说自动补全, 这个可以称为 IDE 灵魂所在的功能, zed 的自动补全总是会从某个奇奇怪怪的角落翻出一个函数名放在自动补全的最上面...影响最深刻的还是用他来写 Python, 一份 800 行的代码, 在 PyCharm 里没有任何问题, 丢 zed 里爆了两个错误, 200 多个警告, 当场吓晕(因为 zed 的 Python 语言服务器默认是 basedpyright)

说起来 PyCharm 写 Python 是真的好用, 只不过真的有点贵, 要 89 一个月.

恩恩, 有这么多的碎碎念肯定不是因为我正文写太少了, 才加上这些来水一篇文章的, 恩恩, 肯定不是的. 以及这么久没更新肯定也不是因为沉迷丝之歌, 嗯, 是这样的. 丝之鸽竟然不鸽了, 那干脆换我来鸽吧, 咕——