亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        關(guān)于Node的內(nèi)存泄漏簡析

        2017-12-14 23:32:44邵晨龍江雪
        中國科技博覽 2017年46期
        關(guān)鍵詞:調(diào)用隊列日志

        邵晨龍++江雪

        [摘 要]Node對內(nèi)存泄漏十分敏感,一旦線上應用有成千上萬的流量,哪怕是一個字節(jié)的內(nèi)存泄漏也會造成堆積,垃圾回收過程中將耗費更多時間進行對象掃描,應用響應緩慢,直到進程內(nèi)存溢出,應用崩潰。本文不僅分析了造成內(nèi)存泄漏的原因,并介紹了幾種主流的排查方案。

        [關(guān)鍵詞]Node 內(nèi)存泄漏

        中圖分類號:TG294 文獻標識碼:A 文章編號:1009-914X(2017)46-0046-01

        1 引言

        內(nèi)存泄漏通常產(chǎn)生于無意間,較難排查。盡管內(nèi)存泄漏的情況不盡相同,但其實質(zhì)只有一個,那就是應當回收的對象出現(xiàn)意外而沒有被回收,變成了常駐在老生代中的對象。

        2 引發(fā)內(nèi)存泄漏的原因

        通常,造成內(nèi)存泄漏的原因主要有兩個:緩存,隊列消費不及時。

        2.1 緩存

        緩存在應用中的作用舉足輕重,可以十分有效地節(jié)省資源。因為它的訪問效率要比I/O的效率高,一旦命中緩存,就可以節(jié)省一次I/O的時間。

        但是在Node中,緩存并非物美價廉。一旦一個對象被當作緩存來使用,那就意味著它將會常駐在老生代中。緩存中存儲的鍵越多,長期存活的對象也就越多,這將導致垃圾回收在進行掃描和整理時,對這些對象做無用功。

        另一個問題在于,JavaScript開發(fā)者通常喜歡用對象的鍵值對來緩存東西,但這與嚴格意義上的緩存又有著區(qū)別,嚴格意義的緩存有著完善的過期策略,而普通對象的鍵值對并沒有。所以,在Node中,任何試圖拿內(nèi)存當緩存的行為都應當被限制。當然,這種限制并不是不允許使用的意思,而是要小心為之。

        為了解決緩存中的對象永遠無法釋放的問題,需要加入一種策略來限制緩存的無限增長,例如將記錄鍵記錄在數(shù)組中,一旦超過數(shù)量,就以先進先出的方式進行淘汰,這種策略適合于小場景的案例中使用,在比較大型的應用場景一般使用的是基于LRU(最近最少使用)算法的策略。

        除了限制緩存的大小外,還需要考慮到進程間是無法共享內(nèi)存的。如果在進程內(nèi)使用緩存,這些緩存不可避免地有重復,對物理內(nèi)存的使用是一種浪費。目前較好的解決方案是采用進程外的緩存,進程自身不存儲狀態(tài)。外部的緩存軟件有著良好的緩存過期淘汰策略以及自身的內(nèi)存管理,不影響Node進程的性能。市面是較好的緩存有Redis和Memcached。

        2.2 隊列

        在解決了緩存帶來的內(nèi)存泄漏問題后,另一個不經(jīng)意產(chǎn)生的內(nèi)存泄漏則是隊列。在JavaScript中可以通過隊列(數(shù)組對象)來完成許多特殊的需求,比如Bagpipe。隊列在消費者-生產(chǎn)者模型中經(jīng)常充當中間產(chǎn)物。這是一個容易忽略的情況,因為在大多數(shù)應用場景下,消費的速度遠遠大于生產(chǎn)的速度,內(nèi)存泄漏不易產(chǎn)生。但是一旦消費速度低于生產(chǎn)速度,將會形成堆積。

        舉個例子,有的應用會收集日志。如果欠缺考慮,也許會采用數(shù)據(jù)庫來記錄日志。日志通常會是海量的,數(shù)據(jù)庫構(gòu)建在文件系統(tǒng)之上,寫入效率遠遠低于文件直接寫入,于是會形成數(shù)據(jù)庫寫入操作的堆積,而JavaScript中相關(guān)的作用域也不會得到釋放,內(nèi)存占用不會回落,從而出現(xiàn)內(nèi)存泄漏。

        遇到這種場景,表層的解決方案是換用消費速度更高的技術(shù)。在日志收集的案例中,換用文件寫入日志的方式會更高效。但是,如果生產(chǎn)速度因為某些原因突然激增,或者消費速度因為突然的系統(tǒng)故障而降低,內(nèi)存泄漏還是可能會出現(xiàn)。

        深度的解決方案應該是監(jiān)控隊列的長度,一旦堆積,應當通過監(jiān)控系統(tǒng)產(chǎn)生報警并通知相關(guān)人員。另一個解決方案是任意異步調(diào)用都應該包含超時機制,一旦在限定的時間內(nèi)未完成響應,通過回調(diào)函數(shù)傳遞超時異常,使得任意異步調(diào)用的回調(diào)都具備可控的響應時間,給消費速度一個下限值。

        對于Bagpipe而言,它提供了超時模式和拒絕模式。啟用超時模式時,調(diào)用加入到隊列中就開始計時,超時就直接響應一個超時錯誤。啟用拒絕模式,當隊列擁塞時,新到來的調(diào)用會直接響應擁塞錯誤。這兩種模式都能夠有效地防止隊列擁塞導致的內(nèi)存泄漏問題。

        3 內(nèi)存泄漏的排查方案

        在Node中,由于V8的堆內(nèi)存大小的限制,它對內(nèi)存泄漏非常敏感。當在線服務的請求量變大時,哪怕是一個字節(jié)的泄露都會導致內(nèi)存占用過高。

        常見的用于排查Node應用內(nèi)存泄露的有以下幾個工具:

        *v8-profiler,用于對V8堆內(nèi)存抓取快照和對CPU進行分析;

        *node-heapdump,允許對V8堆內(nèi)存抓取快照,用于事后分析,這是Node核心貢獻者編寫的模塊;

        *node-mtrace,它使用了GCC的mtrace工具來分析堆的使用;

        *node-memwatch,來自Mozilla的LloydHilaiel貢獻的模塊,采用WTFP許可發(fā)布。

        4 總結(jié)

        所謂知己知彼,百戰(zhàn)不殆,只有深入了解了造成內(nèi)存泄漏的主要原因,才能對癥下藥,盡可能地規(guī)避造成內(nèi)存泄漏的行為,并采用主流的工具予以排查消除隱患。endprint

        猜你喜歡
        調(diào)用隊列日志
        一名老黨員的工作日志
        華人時刊(2021年13期)2021-11-27 09:19:02
        扶貧日志
        心聲歌刊(2020年4期)2020-09-07 06:37:14
        隊列里的小秘密
        基于多隊列切換的SDN擁塞控制*
        軟件(2020年3期)2020-04-20 00:58:44
        核電項目物項調(diào)用管理的應用研究
        在隊列里
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        游學日志
        豐田加速駛?cè)胱詣玉{駛隊列
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        久久精品国产99国产精品澳门| 色婷婷一区二区三区四区| 在线播放偷拍一区二区| 99久久婷婷国产亚洲终合精品| 久久精品人妻无码一区二区三区| 国产喷水福利在线视频| 亚洲一区二区免费日韩| 中文字幕精品亚洲字幕| 欧美人妻少妇精品久久黑人| 日韩高清亚洲日韩精品一区| 亚洲福利第一页在线观看| 亚洲av熟女一区二区三区站| 久久综合九色综合97欧美| 国产在线观看入口| 成人在线视频自拍偷拍| 午夜被窝精品国产亚洲av香蕉 | 中文字幕丰满人妻av| 天天做天天爱天天综合网2021| 日本免费人成视频播放| 精品国产97av一区二区三区| 日韩中文字幕版区一区二区三区| 精品免费看国产一区二区| 欧美xxxx新一区二区三区| 人妻被公上司喝醉在线中文字幕| 国产欧美精品一区二区三区四区| 国产精品麻豆aⅴ人妻| 开心激情站开心激情网六月婷婷 | 在线看不卡的国产视频| 国产乱人伦偷精品视频免观看| 免费国产黄网站在线观看| 偷拍网日本一区二区三区| 国产一品二品三区在线观看| 久久精品国产亚洲7777| 青青操国产在线| 大红酸枝极品老料颜色| 亚洲av无码一区二区三区天堂 | 亚洲国产日韩欧美综合a| 国产精品美女久久久久久2018| 久久精品中文字幕免费| 久久久久高潮综合影院| 最近中文字幕在线mv视频在线 |