前言
文章数量过多, 执行hexo g
渲染时报错, 如下:
1 | <--- Last few GCs ---> |
这是由于node.js
内存限制导致的, 默认堆内存上限为1024MB
解决方法也很简单, 那就是加大堆内存上限, 有四种方案
解决方案
第一种 临时性配置
比如用以下命令来替代hexo g
:
1 | node --max-old-space-size=16384 ./node_modules/hexo/bin/hexo generate |
这里--max-old-space-size
属性的数值可以自定义, 我这里选择的是16G, 你也可以设置为8G, 也就是--max-old-space-size=8192
, 以此类推
第二种 系统级全局配置
修改电脑上的node
配置文件
第一步 打开
launchd.conf
配置文件1
2# 编辑 Node.js 全局启动配置
sudo vim /etc/launchd.conf添加以下内容
1
setenv NODE_OPTIONS "--max-old-space-size=16384"
运行配置
1
2sudo launchctl load /etc/launchd.conf
reboot # 重启生效验证是否生效
1
echo $NODE_OPTIONS # 应显示 --max-old-space-size=8192
系统级配置, 针对所有用户生效
内存大小的设置需要根据自己电脑的实际情况来定, 避免设置过高 从而导致导致系统整体性能下降
关于Mac平台的更新
由于 /etc/launchd.conf
在新版macOS
中已被弃用,推荐使用以下方式:
创建或修改
launchd plist
文件(系统级)1
sudo nano /Library/LaunchDaemons/com.custom.node.env.plist
添加内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.custom.node.env</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>setenv</string>
<string>NODE_OPTIONS</string>
<string>--max-old-space-size=4096</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>加载配置:
1
sudo launchctl load /Library/LaunchDaemons/com.custom.node.env.plist
第三种 用户级配置
通过修改环境变量的方式
编辑
shell
配置文件1
2
3nano ~/.zshrc # macOS Catalina 及以后版本
# 或
nano ~/.bash_profile # macOS Catalina 之前版本添加以下行
1
2# 设置 Node.js 内存限制
export NODE_OPTIONS="--max-old-space-size=4096"使配置生效
1
source ~/.zshrc # 或 source ~/.bash_profile
该配置仅对当前用户生效, 适合用户配置隔离
第四种 项目级配置(更安全)
在 Hexo
项目的 package.json
中修改scripts
:
1 | "scripts": { |
之后始终使用:
1 | npm run build # 代替 hexo generate |
这算是一种一劳永逸的方案, 哪怕更换电脑也不怕, 而且进行了项目隔离, 不会影响到其他nodejs
工程, 缺点是如果多个工程需要配置, 则得挨个添加
注意事项
如果运行后进程被终止, 比如报错:
1 | zsh: killed node --max-old-space-size=16384 ./node_modules/hexo/bin/hexo generate |
主要原因是没有足够的物理内存 + 交换空间(swap)
来满足需求,
首先运行top -o mem
指令检查内存占用:
随着node
编译的进行, 我们会发现它的占用内存指标在不断上升,
此时我们可以考虑通过关闭其他应用来给node
足够的空间
本文为作者原创 转载时请注明出处 谢谢