NodeJS堆溢出?原因是默认设限了内存上限。解除封印!
2022-2-12 10:52:20 Author: www.freebuf.com(查看原文) 阅读量:6 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

使用NodeJS开发的应用,如果需要处理大量数据,可能导致堆溢出。错误提示中,会有“JavaScript heap out of memory”,如下图:

v2-ed6fbfc72630d6db8a735b3d602efb38_1440w.jpg

通过调试分析,会发现:在出错之前,其使用的内存量是一直增大的:

如本例测试时,起初:

v2-d9ce957478257c70fe632881f2ccc6b3_1440w.jpg

中途,内存用量一直增长:

v2-fd2aad7528aa3cc464e95aecc41dd8bc_1440w.jpg

当内存使用量超过约2048MB后,即会出错。

v2-965bfafc9ecfbf5efca0a287d3f0377d_1440w.jpg

这个问题的原因,是由于NodeJS在启用时,默认使用的内存量是受限的,大约是2GB。

v2-b202e11d22b14c6f4a8edb1fbe7daaf9_1440w.jpg

在代码中,通过v8的getHeapStatistics方法,可以取得此值。

v2-c9aa437afcd66802e13ded5d1c4a86b3_1440w.jpg

如果想要获得更大的内存,则需解除此封印。方法是:在Node启动程序时,使用max-old-space-size参数,设定一直更大的值。

如,设定可用内存是8GB:

v2-70919ab8755036fdc0be3620fd1b24c0_1440w.jpg

本测试,使用的是用于JS代码加密的JShaman平台本地版。未设定内存值之前 ,在加密某个大型JS文件时,会出现本文最前面的错误。在设定为8GB内存用量后,则运行正常。效果如下图:

v2-691217e617c8f5babde81c2f4c1c8559_1440w.jpg

本方法,在node12下测试通过:

v2-278cbb83de4ea91f8372864ebccaf6e5_1440w.jpg


文章来源: https://www.freebuf.com/articles/web/321749.html
如有侵权请联系:admin#unsafe.sh