一、问题原因
当 SillyTavern 运行时,可能会遇到应用突然报错并在后台自动重启的情况。检查后台日志,会发现类似下面的错误信息:
- FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
这个错误的原因是,SillyTavern 运行时所需要的内存,超过了 Node.js 程序的默认内存上限,导致了 “JavaScript 堆内存溢出”。
本文通过修改启动配置,将这个内存上限值调整到更适合设备的值,从而解决此问题。如果 没有 遇到这个报错,不建议进行任何修改。
二、解决方案
Termux (安卓)
第 1 步:计算内存上限值
首先,需要计算出一个合适的内存上限值,通常建议设置为 当前可用内存的 75% 。
- 打开 Termux 应用。如果正在运行一键脚本,先退出。
如何退出脚本?
如果使用的是我的一键脚本,按下
0键再按回车即可。对于其他脚本,可以点击屏幕上的CTRL键,然后用英文输入法按下c键(相当于CTRL + C)。 - 在 Termux 中执行以下命令:
free -m | awk 'NR==2{print int($7 * 0.75)}' - 命令执行后会返回一个数字。 务必记下 这个数字,下一步会用到。
第 2 步:修改启动配置
-
使用 MT 管理器,打开 SillyTavern 根目录下的
start.sh文件。 -
找到文件末尾的
node "server.js" "$@"这一行。 -
在
node和"server.js"之间,加入--max-old-space-size=<数值>。# 修改前 - node "server.js" "$@" # 修改后 (将 2888 替换为上一步计算出的数字!) + node --max-old-space-size=2888 "server.js" "$@" -
保存文件,然后重新启动 SillyTavern 即可。
第 3 步:检查配置是否生效
- 在酒馆运行的状态下,切换到 Termux。从屏幕左上边缘向右滑动(需要一点位置和技巧...),点击 NEW SESSION 打开一个新窗口。
- 执行以下命令:
ps aux | grep node - 如果在输出结果中,看到了包含了
--max-old-space-size参数的进程信息,这说明 配置已成功生效。
Windows
第 1 步:计算内存上限值
需要计算出当前可用物理内存的 75% 作为内存上限值。
- 打开 PowerShell。可以按
Win+R键打开“运行”窗口,输入powershell并回车。 - 在 PowerShell 窗口中执行以下命令:
[int]((Get-CimInstance -ClassName Win32_OperatingSystem).FreePhysicalMemory / 1024 * 0.75) - 命令执行后会返回一个数字。 务必记下 这个数字,下一步会用到。
第 2 步:修改启动配置
-
在 SillyTavern 根目录下,找到
Start.bat文件,右键选择“编辑”。 -
找到文件中的
node server.js %*这一行。 -
在
node和server.js之间,加入--max-old-space-size=<数值>。@echo off # 修改前 - node server.js %* # 修改后 (将 2888 替换为上一步计算出的数字!) + node --max-old-space-size=2888 server.js %* pause -
保存文件。如果之前有正在运行的酒馆黑窗口,先关掉,然后重新双击
Start.bat启动。
第 3 步:检查配置是否生效
- 打开 任务管理器 (快捷键
Ctrl+Shift+Esc),切换到 “详细信息” 选项卡。 - 在表头(如“名称”、“PID”等)上 右键,选择 “选择列”。
- 在弹出的窗口中,勾选 “命令行” 并确定。
- 找到名为
node.exe的进程,查看它的“命令行”列。如果其中包含了--max-old-space-size参数,就说明 配置已成功生效。
Linux (Docker 部署)
如果是跟着 我的教程 部署的,那么部署方式就是 Docker 部署。 如果做完还是会报错,那么尝试尽量轻量化预设、聊天记录。
第 1 步:计算内存上限值
- 方案 A:高内存服务器 (可用物理内存 > 4GB) 在 SSH 终端中执行:
free -m | awk 'NR==2{print int($7 * 0.75)}'
- 方案 B:低内存服务器 (可用物理内存 < 4GB 且已配置 Swap) 在 SSH 终端中执行:
free -m | awk 'NR==2{mem_avail=$7} NR==3{swap_total=$2; if(swap_total < 100){print "错误:未检测到有效的 Swap 空间。先配置 Swap 或使用高内存服务器的计算方案。" > "/dev/stderr"; exit 1} else{print int((mem_avail + swap_total) * 0.75)}}'
如果此命令报错提示未检测到 Swap, 跳转文末的附录 进行配置。
命令执行后会返回一个数字, 务必记下 这个数字。
-
执行成功 会返回一个数字,如下图所示:

执行成功示例 -
执行报错 则会提示没有 Swap,如下图所示:

执行报错示例
第 2 步:修改容器配置
这里以 1Panel 面板为例,其他 Docker 管理工具操作类似。
-
进入 1Panel,在 容器 -> 编排 页面找到 SillyTavern 项目,点击 “编辑”。
-
在
environment部分,新增一行NODE_OPTIONS配置。services: sillytavern: # ... 其他已有配置 ... environment: # 下面这一行是新增的行 (将 1888 替换为上一步计算出的数字!) - NODE_OPTIONS=--max-old-space-size=1888 - NODE_ENV=production - FORCE_COLOR=1 # ... 其他已有配置 ... -
点击 确认,容器会自动重新部署。
第 3 步:检查配置是否生效
- 在 SSH 终端中执行以下命令(将
sillytavern替换为容器名):docker exec sillytavern node -e 'console.log(v8.getHeapStatistics().heap_size_limit / 1024 / 1024 + " MB")' - 如果配置成功,会看到一个比设置的数值 稍微大一点 的数字。这是因为 Node.js 引擎自带了一些固定开销,属于 正常现象。
Linux (Git / 非 Docker 部署)
如果做完还是会报错,那么尝试尽量轻量化预设、聊天记录。
第 1 步:计算内存上限值
- 方案 A:高内存服务器 (可用物理内存 > 4GB) 在 SSH 终端中执行:
free -m | awk 'NR==2{print int($7 * 0.75)}'
- 方案 B:低内存服务器 (可用物理内存 < 4GB 且已配置 Swap) 在 SSH 终端中执行:
free -m | awk 'NR==2{mem_avail=$7} NR==3{swap_total=$2; if(swap_total < 100){print "错误:未检测到有效的 Swap 空间。先配置 Swap 或使用高内存服务器的计算方案。" > "/dev/stderr"; exit 1} else{print int((mem_avail + swap_total) * 0.75)}}'
如果此命令报错提示未检测到 Swap, 跳转文末的附录 进行配置。
命令执行后会返回一个数字, 务必记下 这个数字。
第 2 步:修改启动配置
-
分支 1:使用进程守护部署
如果是通过面板来启动酒馆的,直接修改面板中的启动命令,可以忽略
start.sh文件。-
在面板中,找到 SillyTavern 的进程管理或应用管理页面。
-
定位到“启动命令”(Startup Command) 或类似的输入框。
-
在
node和server.js之间,加入--max-old-space-size=<数值>。修改前:
node server.js修改后 (将
2888替换为上一步计算出的数字!):node --max-old-space-size=2888 server.js -
保存配置,然后通过面板重启应用。
-
-
分支 2:使用 systemd 服务或手动执行
./start.sh脚本只有当通过
systemd服务(该服务配置为执行start.sh)或在命令行中手动执行./start.sh来启动应用时,才需要修改此文件。-
打开 SillyTavern 根目录下的
start.sh文件。 -
找到文件末尾类似
node "server.js" "$@"的一行。 -
在
node和"server.js"之间,加入--max-old-space-size=<数值>。# 修改前 - node "server.js" "$@" # 修改后 (将 2888 替换为上一步计算出的数字!) + node --max-old-space-size=2888 "server.js" "$@" -
保存文件。如果使用
systemd,重启服务 (sudo systemctl restart your-service-name);如果手动运行,则重新执行脚本。
-
第 3 步:检查配置是否生效
- 在酒馆运行的状态下,执行以下命令:
ps aux | grep node - 如果在输出结果中,看到了包含了
--max-old-space-size参数的进程信息,这说明 配置已成功生效。
附录:为低内存 Linux 服务器配置 Swap
如果是完整跟着我的教程部署,并使用了我提供的一键脚本,那么 Swap 已经设置好,无需额外配置。
如果服务器内存较小,并且在计算内存时收到了“未检测到 Swap”的错误,可以先用下面的命令配置一个自己内存大小 1-2 倍的大小的 Swap 交换空间。
以配置一个 2G 大小的 swap 为例。此操作会占用 2GB 的硬盘空间作为虚拟内存。注意自己的硬盘空间是否充足!
将以下命令完整复制并粘贴到 SSH 终端中执行:
sudo fallocate -l 2G /swapfile \
&& sudo chmod 600 /swapfile \
&& sudo mkswap /swapfile \
&& sudo swapon /swapfile \
&& echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
配置完成后,可以执行 free -m 来确认 Swap 所在行的 total 值是否为 2047 左右。确认无误后,再回到相应系统的章节,重新执行第一步的计算命令即可。
喜欢的话,留下你的评论吧~