原因:TypeScript和javaScript混合开发,完美升级老项目,这个老项目是个大项目,非常大,而且是核心项目集团公司的遇到的问题:打包webpack的时候遇到了熟悉的味道,对于开发过C++和addon的我来说。下面有一些v8的字符,感觉应该是v8层面的问题。错误在上。问题定位:JSstacktrace,javaScriptheapoutofmemory,内存不足依稀记得,v8的内存限制,64位系统是1.4G,32位系统是0.7G,Buffer属于C++级别,不会受限制的。但是长度会受到限制。Buffer创建时会判断长度https://github.com/nodejs/node/blob/master/lib/buffer.js#L90-L101node.js官网文档描述长度:我不会详细说明这个简单的问题。之前继续项目,纯js开发,现在连上ts,为什么同样一台电脑,之前还能跑,现在内存不够了?答:首先,让我们从记忆恢复开始。为什么要限制内存使用,因为一般1.4G就够了。还有就是内存回收会阻塞主线程。300MB大约是0.5s。我在开发桌面即时通讯应用时经常遇到这个问题。一群20万人一直在以每秒1000条的速度将消息推送到桌面。时间一长,Node访问主进程级别就不行了。CPU和内存使用率会飙升,需要做很多专门的优化。我在ts中配置js允许使用js,也就是增加一个ts编译成js的过程。这个编译过程肯定会占用大部分内存。所以之前纯js项目不会出现这个问题。大部分的webpack源码文件都是手动改的,达到修改v8内存限制的目的。但是作为跨平台的产品,必须支持两点:工程化+自动化,只能在跨平台和非感知的情况下受到v8内存回收机制的影响,这与上面的第二点相吻合。当然,这一套东西被面试官问得很烂(就像考试让你背古诗一样),我面试不问这些无聊的问题。作为Node.js的深度使用者,我觉得C++出身的人可能在Node.js上走得更远。它更像是一个库,一个前端生产工具库。如果想深入后端,走得更远,建议学习java和c++*解决方法:Node.js8.0以上版本可以调整exportNODE_OPTIONS=--max_old_space_size=4096或者使用自动化和工程配置插件-在increase-memory-limit由于部分部署服务器上的配置不详,经过测试,我选择了后者,并新写了一条构建命令来实现效果。成为API工程师是不可能的吗?我的原则是使用第三方库。框架一定要看它的源码实现,包括Node.jsincrease-memory-limit源码只有几十行代码#!/usr/bin/envnodeconstpath=require('path');constglob=require('glob');constfs=require('fs');常量maxOldSpaceSize=process.env.LIMIT||10240;constcwd=process.cwd()+path.sep;glob(path.join(cwd,"node_modules",".bin","*"),function(err,files){files.forEach(file=>{//readFileSync将在非文件上崩溃。跳过这些memory-limit')>=0){return;}//构建脚本将通过cross-env提交LIMIT//避免在运行时更新它if(file.indexOf('cross-env')>=0){return;}letcontents=fs.readFileSync(file).toString();letlines=contents.split('\n')letpatchedContents="";for(varindex=0;index
