馃コ娆㈣繋鎰熷叴瓒g殑灏忎紮浼达紝涓€璧锋潵鍋氱偣鏈夋剰涔夌殑浜嬪惂锛佹湰鏂囪瘧鑰咃細oil-oil鎴戞帹鍑轰簡涓€涓瘡鍛ㄧ炕璇戦」鐩紝浠撳簱鍦板潃锛岃闂湴鍧€杩樻槸寰堢己蹇楀悓閬撳悎鐨勬湅鍙嬶紝绾睘涓汉鍏磋叮锛屽綋鐒跺鎻愰珮鑻辫鍜屽墠绔篃鏈夊府鍔╂妧鑳姐€佽姹傦細鑻辫涓嶈姹傚樊鐨勭璋憋紝鐔熺粌浣跨敤github锛屽潥鎸佷笉鎳堬紝璋﹂€婏紝瀵硅嚜宸辨墍鍋氱殑浜嬫儏璐熻矗銆傛兂鍙備笌鐨勬湅鍙嬪彲浠ョ淇x鎴栬€呯粰浠撳簱鍙慽ssue娑堟伅銆傛垜鐨勫崥瀹篃鏈夊叿浣撶殑涓汉鑱旂郴鏂瑰紡锛歞aodaolee.cn鍦ㄨ繖绡囨枃绔犱腑锛屾垜灏嗘帰绱ode涓殑鍫嗗唴瀛樺垎閰嶏紝鐒跺悗灏濊瘯灏嗗唴瀛樺鍔犲埌纭欢鍙互鎵垮彈鐨勬瀬闄愩€傜劧鍚庢垜浠皢鎵惧埌涓€浜涘疄鐢ㄧ殑鏂规硶鏉ョ洃瑙哊ode鐨勮繘绋嬩互璋冭瘯涓庡唴瀛樼浉鍏崇殑闂銆侽K锛屽噯澶囧紑濮嬶紒澶у鍙互浠庝粨搴撴媺鍙栫浉鍏充唬鐮佸埌鎴戠殑GitHub涓奵lone浠g爜銆俈8GarbageCollection浠嬬粛棣栧厛绠€鍗曚粙缁嶄竴涓媀8鍨冨溇鏀堕泦鍣ㄣ€傚唴瀛樺瓨鍌ㄥ垎閰嶆柟寮忔槸鍫嗭紝鍫嗗垎涓鸿嫢骞蹭唬鍖哄煙銆備竴涓璞″湪鍏剁敓鍛藉懆鏈熷唴浼氳€佸寲锛屽苟涓斿畠鎵€灞炵殑涓栦唬鍚勪笉鐩稿悓銆備唬鍒嗕负骞磋交浠e拰鑰佷竴浠o紝骞磋交浠d篃鍒嗕负鏂扮敓浠e拰涓棿浠c€傞殢鐫€瀵硅薄鍦ㄥ瀮鍦炬敹闆嗕腑骞稿瓨涓嬫潵锛屽畠浠篃鍔犲叆浜嗚€佸勾浠c€備笘浠e亣璇寸殑涓€涓熀鏈師鍒欐槸澶у鏁板彈璇曡€呴兘鏄勾杞讳汉銆俈8鍨冨溇鏀堕泦鍣ㄤ互姝や负鍩虹锛屽彧鎻愬崌鍦ㄥ瀮鍦炬敹闆嗕腑骞稿瓨涓嬫潵鐨勫璞°€傚綋瀵硅薄琚鍒跺埌鐩搁偦鍖哄煙鏃讹紝瀹冧滑鏈€缁堜細杩涘叆鑰佸勾浠c€侼ode涓殑鍐呭瓨娑堣€椾富瑕佸垎涓轰笁涓柟闈細浠g爜鈥斺€斾唬鐮佹墽琛岀殑鍦版柟璋冪敤鏍堚€斺€旂敤鏉ュ瓨鍌ㄥ嚱鏁板拰鍘熷绫诲瀷锛堟暟瀛椼€佸瓧绗︿覆鎴栧竷灏斿€硷級鐨勫眬閮ㄥ彉閲忓爢鍐呭瓨鍫嗗唴瀛樻槸鎴戜滑浠婂ぉ涓昏鍏虫敞鐨勬敞鎰忓姏銆傜幇鍦ㄦ偍瀵瑰瀮鍦炬敹闆嗗櫒鏈変簡鏇村鐨勪簡瑙o紝鏄椂鍊欏湪鍫嗕笂鍒嗛厤涓€浜涘唴瀛樹簡锛乫unctionallocateMemory(size){//妯℃嫙瀛楄妭鍒嗛厤constnumbers=size/8;constarr=[];arr.length=鏁板瓧锛沠or(leti=0;i{constallocation=allocateMemory(allocationStep);memoryLeakAllocations.push(allocation);constmu=process.memoryUsage();//#bytes/KB/MB/GBconstgbNow=mu[field]/1024/1024/1024;constgbRounded=Math.round(gbNow*100)/100;console.log(`Heapallocated${gbRounded}GB`);},TIME_INTERVAL_IN_MSEC);闂撮殧鍒嗛厤澶х害10MB锛屼负鍨冨溇鏀堕泦鎻愪緵瓒冲鐨勬椂闂村皢骞稿瓨鐨勫璞℃彁鍗囧埌鑰佸勾浠c€俻rocess.memoryUsage鏄竴涓敤浜庡洖鏀跺叧浜庡爢鍒╃敤鐜囩殑绮楃暐鎸囨爣鐨勫伐鍏枫€傞殢鐫€鍫嗗垎閰嶇殑澧為暱锛宧eapUsed瀛楁璁板綍鍫嗙殑澶у皬銆傝瀛楁璁板綍RAM涓殑瀛楄妭鏁帮紝鍙互鎹㈢畻鎴恗b銆傛偍鐨勭粨鏋滃彲鑳戒細鏈夋墍涓嶅悓銆傚湪鍏锋湁32GBRAM鐨刉indows10绗旇鏈數鑴戜笂锛屾垜寰楀埌浠ヤ笅淇℃伅锛氬爢鍒嗛厤4GB鍫嗗垎閰?.01GB<---鏈€鍚庡嚑娆C--->[18820:000001A45B4680A0]26146姣锛氭爣璁版壂鎻忥紙鍑忓皯锛?103.7(4107.3)->4103.7(4108.3)MB锛?196.5/0.0ms锛堝钩鍧噈u=0.112锛屽綋鍓峬u=0.000锛夎姹傛棫绌洪棿涓殑鏈€鍚庢墜娈礕C<---JSstacktrace--->鑷村懡閿欒锛欳ALL_AND_RETRY_LAST鍒嗛厤澶辫触-JavaScript鍫嗘孩鍑哄唴瀛樺湪杩欓噷锛屽瀮鍦炬敹闆嗗櫒浼氬湪涓囦笉寰楀凡鐨勬儏鍐典笅灏濊瘯鍘嬬缉鍐呭瓨锛屾渶鍚庢斁寮冨苟鎶涘嚭鈥滃爢鍐呭瓨涓嶈冻鈥濈殑寮傚父銆傝繖涓繘绋嬭揪鍒颁簡4.1GB鐨勯檺鍒讹紝鐢ㄤ簡26.6绉掓墠鎰忚瘑鍒版湇鍔″嵆灏嗘浜°€傝繖浜涚粨鏋滅殑涓€浜涘師鍥犱粛鐒舵湭鐭ャ€俈8鍨冨溇鏀堕泦鍣ㄦ渶鍒濊繍琛屽湪鍏锋湁涓ユ牸鍐呭瓨闄愬埗鐨?2浣嶆祻瑙堝櫒杩涚▼涓€傝繖浜涚粨鏋滆〃鏄庡唴瀛橀檺鍒跺彲鑳芥槸浠庨仐鐣欎唬鐮佺户鎵胯€屾潵鐨勩€傚湪鎾板啓鏈枃鏃讹紝涓婅堪浠g爜姝e湪鏈€鏂扮殑LTSNode鐗堟湰涓嬭繍琛岋紝骞朵娇鐢?4浣嶅彲鎵ц鏂囦欢銆傜悊璁轰笂锛屼竴涓?4浣嶈繘绋嬪簲璇ヨ兘澶熷垎閰嶈秴杩?GB鐨勫湴鍧€绌洪棿锛屽苟涓斿緢瀹规槗澧為暱鍒?6TB鐨勫湴鍧€绌洪棿銆傛墿灞曞唴瀛樺垎閰嶉檺鍒秐odeindex.js--max-old-space-size=8000杩欏皢鏈€澶ч檺鍒惰缃负8GB銆傝繖鏍峰仛鏃惰灏忓績銆傛垜鐨勭瑪璁版湰鐢佃剳鏈?2GB鐨勭┖闂淬€傛垜寤鸿灏嗗叾璁剧疆涓篟AM涓疄闄呭彲鐢ㄧ殑绌洪棿銆備竴鏃︾墿鐞嗗唴瀛樿€楀敖锛岃繘绋嬪氨浼氬紑濮嬮€氳繃铏氭嫙鍐呭瓨鍗犵敤纾佺洏绌洪棿銆傚鏋滄偍灏嗛檺鍒惰缃緱澶珮锛屾偍灏嗚幏寰楁洿鎹㈣绠楁満鐨勬柊鐞嗙敱銆傝繖閲屾垜浠敖閲忛伩鍏嶇數鑴戝啋鐑焴8GB闄愬埗鍐嶈窇浠g爜锛欻eapallocated7.8GBHeapallocated7.81GB<--LastfewGCs--->[16976:000001ACB8FEB330]45701ms:Mark-sweep(reduce)8000.2(8005.3)->8000.2(8006.3)MB锛?468.4/0.0ms锛堝钩鍧噈u=0.211锛屽綋鍓峬u000=0銆傝姹傛棫绌洪棿涓殑GC<---JS鍫嗘爤璺熻釜--->鑷村懡閿欒锛欳ALL_AND_RETRY_LAST鍒嗛厤澶辫触-JavaScript鍫嗗唴瀛樹笉瓒宠繖娆″爢澶у皬鍑犱箮杈惧埌8GB锛屼絾涓嶅畬鍏ㄦ槸銆傛垜鎬€鐤慛ode杩涚▼涓湁涓€浜涘紑閿€鏉ュ垎閰嶈繖涔堝鍐呭瓨銆傝繖娆¤繘绋嬬粨鏉熼渶瑕?5.7绉掋€傚湪鐢熶骇鐜涓紝鍐呭瓨鑰楀敖鍙兘涓嶄細灏戜簬涓€鍒嗛挓銆傝繖灏辨槸鐩戞帶鍜屾礊瀵熷唴瀛樻秷鑰楁湁甯姪鐨勫師鍥犱箣涓€銆傚唴瀛樻秷鑰椾細闅忕潃鏃堕棿鐨勬帹绉荤紦鎱㈠闀匡紝鍙兘闇€瑕佸嚑澶╂椂闂存墠鑳界煡閬撴湁涓€涓棶棰樸€傚鏋滆繘绋嬩笉鏂穿婧冨苟鍦ㄦ棩蹇椾腑鏄剧ず鈥滃爢鍐呭瓨涓嶈冻鈥濆紓甯革紝鍒欐偍鐨勪唬鐮佷腑鍙兘瀛樺湪鍐呭瓨娉勬紡銆備竴涓繘绋嬩篃鍙兘浣跨敤鏇村鐨勫唴瀛橈紝鍥犱负瀹冩鍦ㄥ鐞嗘洿澶氱殑鏁版嵁銆傚鏋滆祫婧愭秷鑰楃户缁闀匡紝鍙兘鏄椂鍊欏皢杩欎釜鏁翠綋鍒嗚В涓哄井鏈嶅姟浜嗐€傝繖灏嗗噺灏戝崟涓繘绋嬬殑鍐呭瓨鍘嬪姏锛屽苟鍏佽鑺傜偣姘村钩鎵╁睍銆傚浣曡窡韪狽ode.js鍐呭瓨娉勬紡process.memoryUsage鐨刪eapUsed瀛楁鏈夌偣鐢ㄥ锛岃皟璇曞唴瀛樻硠婕忕殑涓€绉嶆柟娉曟槸灏嗗唴瀛樻寚鏍囨斁鍦ㄥ彟涓€涓伐鍏蜂腑杩涜杩涗竴姝ュ鐞嗐€傜敱浜庤繖涓疄鐜板苟涓嶅鏉傦紝鎵€浠ユ垜浠富瑕佸垎鏋愬浣曡嚜宸卞疄鐜般€俢onstpath=require("path");constfs=require("fs");constos=require("os");conststart=Date.now();constLOG_FILE=path.join(__dirname,"鍐呭瓨-usage.csv");fs.writeFile(LOG_FILE,"TimeAlive(secs),MemoryGB"+os.EOL,()=>{});//request-confirmation涓轰簡閬垮厤灏嗗爢鍒嗛厤鎸囨爣鏀惧湪鍐呭瓨涓紝鎴戜滑閫夋嫨灏嗙粨鏋滃啓鍏SV鏂囦欢浠ヤ究浜庢暟鎹秷璐广€傝繖閲屼娇鐢ㄤ簡甯︽湁鍥炶皟鐨勫紓姝ュ嚱鏁皐riteFile銆傚洖璋冧负绌轰互鍐欏叆鏂囦欢骞剁户缁€屼笉杩涜浠讳綍杩涗竴姝ュ鐞嗐€傝鑾峰彇娓愯繘寮忓唴瀛樻寚鏍囷紝璇峰皢鍏舵坊鍔犲埌console.log锛歝onstelapsedTimeInSecs=(Date.now()-start)/1000;consttimeRounded=Math.round(elapsedTimeInSecs*100)/100;s.appendFile(LOG_FILE,timeRounded+","+gbRounded+os.EOL,()=>{});//璇锋眰-纭涓婇潰鐨勪唬鐮佸彲鐢ㄤ簬璋冭瘯鍫嗛殢鏃堕棿澧為暱鐨勫唴瀛樻硠婕忋€傛偍鍙互浣跨敤涓€浜涘垎鏋愬伐鍏锋潵瑙f瀽鍘熷csv鏁版嵁锛屼互瀹炵幇鏇寸編瑙傜殑鍙鍖栥€傚鏋滃彧鏄€ョ潃鐪嬫暟鎹紝涔熷彲浠ョ洿鎺ョ敤excel锛屽涓嬪浘锛氬湪闄愬埗涓?.1GB鐨勬儏鍐典笅锛屽彲浠ョ湅鍒板唴瀛樺崰鐢ㄥ湪寰堢煭鐨勬椂闂村唴鍛堢嚎鎬у闀挎椂闂淬€傚唴瀛樻秷鑰楃户缁闀胯€屾病鏈夎秼浜庡钩绋筹紝杩欒〃鏄庢煇澶勫瓨鍦ㄥ唴瀛樻硠婕忋€傛垜浠湪debug杩欑被闂鐨勬椂鍊欙紝灏辨槸瀵绘壘鑰佸勾浠f湯灏惧垎閰嶇殑閭i儴鍒嗕唬鐮併€傚湪鍨冨溇鏀堕泦涓垢瀛樹笅鏉ョ殑瀵硅薄鍙兘浼氫竴鐩村瓨鍦紝鐩村埌杩涚▼缁堟銆備娇姝ゅ唴瀛樻硠婕忔娴嬩唬鐮佹洿鍙噸鐢ㄧ殑涓€绉嶆柟娉曟槸灏嗗叾鍖呰鍦ㄨ嚜宸辩殑闂撮殧涓紙鍥犱负瀹冧笉蹇呭瓨鍦ㄤ簬涓诲惊鐜腑锛夈€俿etInterval(()=>{constmu=process.memoryUsage();//#bytes/KB/MB/GBconstgbNow=mu[field]/1024/1024/1024;constgbRounded=Math.round(gbNow*100)/100;constelapsedTimeInSecs=(Date.now()-start)/1000;consttimeRounded=Math.round(elapsedTimeInSecs*100)/100;fs.appendFile(LOG_FILE,timeRounded+","+gbRounded+os.EOL,()=>{});//鍗冲彂鍗冲純},TIME_INTERVAL_IN_MSEC);娉ㄦ剰锛屼互涓婃柟娉曚笉鑳界洿鎺ュ湪鐢熶骇鐜涓娇鐢紝鍙槸鍛婅瘔浣犲浣曞湪鏈湴鐜涓皟璇曞唴瀛樻硠婕忋€傚疄闄呭疄鏂借繕鍖呮嫭鑷姩鏄剧ず銆佽鎶ュ拰杞浆鏃ュ織锛屼互渚挎湇鍔″櫒涓嶄細鑰楀敖纾佺洏绌洪棿銆傚湪鐢熶骇涓窡韪狽ode.js鍐呭瓨娉勬紡灏界涓婇潰鐨勪唬鐮佸湪鐢熶骇涓笉鍙锛屼絾鎴戜滑宸茬粡鐪嬪埌浜嗗浣曡皟璇曞唴瀛樻硠婕忋€傚洜姝わ紝浣滀负鏇夸唬鏂规锛屽皢Node杩涚▼鍖呰鍦ㄥ儚PM2杩欐牱鐨勫畧鎶よ繘绋嬩腑銆傝缃唴瀛樻秷鑰楄揪鍒伴檺鍒舵椂鐨勯噸鍚瓥鐣ワ細pm2startindex.js--max-memory-restart8G鍗曚綅鍙互鏄疜锛堝崈瀛楄妭锛夈€丮锛堝厗瀛楄妭锛夊拰G锛堝崈鍏嗗瓧鑺傦級銆傝繘绋嬮噸鏂板惎鍔ㄥぇ绾﹂渶瑕?0绉掞紝鍥犳璇蜂娇鐢ㄨ礋杞藉钩琛″櫒閰嶇疆澶氫釜鑺傜偣浠ラ伩鍏嶄腑鏂€傚彟涓€涓紓浜殑宸ュ叿鏄法骞冲彴鏈満妯″潡node-memwatch锛屽畠浼氬湪妫€娴嬪埌杩愯浠g爜涓殑鍐呭瓨娉勬紡鏃惰Е鍙戜竴涓簨浠躲€俢onstmemwatch=require("memwatch");memwatch.on("leak",function(info){//浜嬩欢鍙戝嚭console.log(info.reason);});璇ヤ簨浠剁敱娉勬紡瑙﹀彂锛屽叾鍥炶皟瀵硅薄鍫嗛殢鐫€杩炵画鐨勫瀮鍦炬敹闆嗚€屽闀挎槸鏈夊師鍥犵殑銆備娇鐢ˋppSignal鐨凪agicDashboard璇婃柇鍐呭瓨闄愬埗AppSignal鏈変竴涓敤浜庣洃鎺у爢澧為暱鍜屽瀮鍦炬敹闆嗙粺璁℃暟鎹殑绁炲浠〃鏉裤€備笂鍥炬樉绀鸿姹傚湪14:25宸﹀彸鍋滄粸浜?鍒嗛挓锛屽厑璁稿瀮鍦炬敹闆嗕互鍑忓皯鍐呭瓨鍘嬪姏銆傚綋瀵硅薄鍦ㄦ棫绌洪棿涓仠鐣欐椂闂磋繃闀垮苟瀵艰嚧鍐呭瓨娉勬紡鏃讹紝浠〃鏉夸篃浼氭毚闇插嚭鏉ャ€傛憳瑕侊細瑙e喅Node.js鍐呭瓨闄愬埗鍜屾硠婕忓湪杩欑瘒鏂囩珷涓紝鎴戜滑棣栧厛浜嗚В浜哣8鍨冨溇鏀堕泦鍣ㄧ殑浣滅敤锛岀劧鍚庢帰璁ㄤ簡鏄惁瀛樺湪鍫嗗唴瀛橀檺鍒朵互鍙婂浣曟墿灞曞唴瀛樺垎閰嶉檺鍒躲€傛渶鍚庯紝鎴戜滑浣跨敤浜嗕竴浜涙綔鍦ㄧ殑宸ュ叿鏉ュ叧娉∟ode.js涓殑鍐呭瓨娉勬紡銆傛垜浠湅鍒板彲浠ラ€氳繃涓€浜涙瘮杈冪矖绯欑殑宸ュ叿鏉ュ疄鐜板鍐呭瓨鍒嗛厤鐨勭洃鎺э紝姣斿memoryUsage鐨勪竴浜涜皟璇曟柟娉曘€傚湪杩欓噷锛屽垎鏋愪粛鐒舵槸鎵嬪姩瀹炵幇鐨勩€傚彟涓€绉嶉€夋嫨鏄娇鐢ㄥ儚AppSignal杩欐牱鐨勪笓涓氬伐鍏凤紝瀹冩彁渚涚洃鎺с€佽鎶ュ拰婕備寒鐨勫彲瑙嗗寲鏉ュ疄鏃惰瘖鏂唴瀛橀棶棰樸€傚笇鏈涙偍鍠滄杩欑瘒鍏充簬鍐呭瓨闄愬埗鍜岃瘖鏂唴瀛樻硠婕忕殑蹇€熶粙缁嶃€傜浉鍏抽摼鎺ュ師鏂囬摼鎺ョ炕璇戠▼搴忓師鏂?/p>