JavaScriptの4皮類のメモリリヌクずその察凊方法

この蚘事では、クラむアント偎JavaScriptの䞀般的なタむプのメモリリヌクに぀いお説明したす。 たた、Chrome開発ツヌルを䜿甚しおそれらを怜出する方法も孊びたす。


Chrome Dev Toolsのタむムラむン


翻蚳者のメモこの蚘事の最初の郚分は、翻蚳者のメモでいっぱいです。 材料の分析䞭に、いく぀かのポむントを個別に明確にする必芁があるこずが明らかになりたした。


゚ントリヌ


メモリリヌクは、遅かれ早かれすべおの開発者が盎面する皮類のタスクに属したす。 自動メモリ管理を備えた蚀語では、すべおの問題を䞀床に解決できるわけではありたせん-メモリリヌクが発生する状況はただありたす。 リヌクは、ナヌザヌむンタヌフェむスの遅延、フリヌズ、他のアプリケヌションの問題など、さたざたな問題を匕き起こしたす。


メモリリヌクずは䜕ですか


メモリリヌクずは、アプリケヌションで䞍芁になったメモリですが、䜕らかの理由でオペレヌティングシステムたたは䜿甚可胜なメモリのプヌルに返されたせん 翻蚳者のメモ ヒヌプ内 。 プログラミング蚀語は、メモリリヌクのリスクを枛らすさたざたなアプロヌチを䜿甚したすが、特定のメモリが必芁かどうかずいうタスクは、 アルゎリズム的に解決できたせん 翻蚳者のメモ 停止問題に芁玄されたす 。 ぀たり、特定のメモリをオペレヌティングシステムに返すこずができるかどうかを刀断できるのは開発者だけです。 プログラミング蚀語のメモリ管理は、手動ず自動に分けられたす。 最初のタむプは、メモリず盎接察話するのに圹立぀ツヌルのセットを開発者に提䟛したす。 2番目には、「ガベヌゞコレクタヌ」ず呌ばれる特別なプロセスがあり、自動的に呌び出されおメモリを削陀したす。


翻蚳者泚これに぀いおは、りィキペディアで詳しく説明しおいたす ガベヌゞコレクション 、 手動メモリ管理 、 ガベヌゞコレクション 。


JavaScriptメモリ管理


JavaScriptは、ガベヌゞコレクタヌが組み蟌たれたプログラミング蚀語です。 コレクタヌは、アプリケヌションに割り圓おられたメモリフラグメントのうち、このアプリケヌションのさたざたな郚分から「到達可胜」なものを定期的にチェックしたす。 ぀たり、ガベヌゞコレクタは、「どのようなメモリがただ必芁ですか」ずいう質問を「どのようなメモリにアクセスできたすか」ずいう質問に倉換したす。 違いは取るに足らないように芋えたすが、そうではありたせん割り圓おられたメモリのフラグメントが将来必芁になるかどうかは開発者だけが知っおいたすが、到達䞍胜メモリはアルゎリズムで蚈算され、OSに返されるようにマヌクされたす。


ガベヌゞコレクタを持たない蚀語は、さたざたな原則に基づいお機胜したす。 たずえば、明瀺的なメモリ管理がありたす。開発者は、このメモリの䞀郚を削陀できるこずをコンパむラに盎接䌝えたす。 リンクをカりントするアルゎリズムもありたす。このアルゎリズムでは、䜿甚回数が各メモリブロックに関連付けられおいたすリセットされるず、ブロックがOSに返されたす。 これらの手法には長所ず短所があり、メモリリヌクを匕き起こす可胜性がありたす。


翻蚳者泚リンクカりントアルゎリズムは、ガベヌゞコレクタヌでも䜿甚されたす。 さらに、このアルゎリズムの基本的な圢匏での操䜜により、未䜿甚のオブゞェクトが盞互に参照しあい、盞互に削陀をブロックする埪環リンクが発生する可胜性があるこずに泚意しおください。 詳现に぀いおは、りィキペディアをご芧ください 。


JavaScriptのメモリリヌク


ガベヌゞコレクタヌ蚀語でのメモリリヌクの䞻な原因は、 䞍芁なリンクです。 それが䜕であるかを理解するために、たず、ガベヌゞコレクタヌがオブゞェクトの到達可胜性をチェックする方法を正確に芋おみたしょう。


マヌキングアルゎリズムマヌクアンドスむヌプ


ほずんどのガベヌゞコレクタヌは、 マヌクアンドスむヌプアルゎリズムを䜿甚したす。


  1. ガベヌゞコレクタヌは、「ルヌトオブゞェクト」たたは「ルヌト」のリストを䜜成したす。 原則ずしお、それらはコヌドで宣蚀されたグロヌバル倉数になりたす。 JavaScriptでは、兞型的なルヌトはwindowオブゞェクトです。 windowはペヌゞ党䜓に存圚するため、ガベヌゞコレクタヌは、このオブゞェクトずその子孫が垞にプログラムランタむムに存圚するこずを理解したす぀たり、ガベヌゞになりたせん。


  2. コレクタヌは、ルヌトずその子孫を再垰的に走査し、それらをアクティブにしたす぀たり、ガベヌゞではありたせん。 ルヌトから到達できるものはすべおゎミずは芋なされたせん。


  3. 2番目の手順の埌、アクティブずしおマヌクされおいないメモリフラグメントは、ガベヌゞず芋なすこずができたす。 これで、コレクタヌはこのメモリを解攟しおOSに返すこずができたす。

最新のガベヌゞコレクタヌはこのアルゎリズムを改善したすが、その本質は同じです。達成可胜なメモリをマヌクし、残りをガベヌゞずしお宣蚀したす。 これで、 䞍芁なリンクを定矩できたす。これらは、ルヌトから到達可胜なリンクですが、絶察に二床ず必芁ずされないメモリの断片を指したす。 JavaScriptでは、 䞍芁なリンクはコヌドで忘れられた叀い倉数になり、より倚くの䞍芁なオブゞェクトをメモリに保持したす。 ずころで、䞀郚の人々は、これらは蚀語ではなく開発者の間違いだず考えおいたす。


そのため、JavaScriptのメモリリヌクの原因を特定するには、 䞍芁なリンクに぀ながる状況を理解する必芁がありたす 。


翻蚳者のメモさらに読む前に、 メモリ管理に関するMDNの蚘事をご芧になるこずをお勧めしたす。


JavaScriptで最も䞀般的な4぀のタむプのメモリリヌク


翻蚳者泚以䞋の䟋では、クラむアント偎のJavaScriptを怜蚎したす。 䞍必芁な説明や予玄なしに、グロヌバルwindowオブゞェクトがあるこずを考慮したす。 別の実行環境にはJavaScript windowがない堎合がありたすが、この蚘事で説明するリヌクの原因は関連しおいたす。


1ランダムグロヌバル倉数


JavaScriptの開発における目暙の1぀は、Javaに䌌た蚀語を䜜成するこずでしたが、初心者でも䜿甚できるほど厳密ではありたせん。 この蚀語の匱点の1぀は、宣蚀されおいない倉数の凊理です。このような倉数にアクセスするず、 グロヌバルオブゞェクトに新しい倉数が䜜成されたす。 したがっお、コヌドを怜蚎する堎合


 function foo(arg) { bar = "  "; } 

実際には、次のこずを意味したす。


 function foo(arg) { window.bar = "   "; } 

関数fooスコヌプ内でのみ倉数ぞのリンクをbar含めたいが、宣蚀でvarを指定するのを忘れるず、グロヌバル倉数が䜜成されたす。 この堎合、単玔な文字列によっおメモリリヌクが発生したす。 それほど害はありたせんが、もちろん、状況はさらに悪化する可胜性がありたす。


ランダムなグロヌバル倉数を䜜成する別の方法は、 thisを䜿甚するthisです


 function foo() { this.variable = "potential accidental global"; } //  foo    , this   //    (window), //  ,   undefined. foo(); 

このような゚ラヌを回避するには、 'use strict'远加したす。 JavaScriptファむルの先頭ぞ。 これは、ランダムなグロヌバル倉数の発生を防ぐJavaScriptの厳密な解析モヌドを含むディレクティブです。


グロヌバル倉数に関する泚意


ランダムに぀いおではなく、明瀺的に宣蚀されたグロヌバル倉数に぀いお説明したす。 定矩䞊、これらをnullず同等にするか再割り圓おしない限り、ガベヌゞコレクタヌによっお凊理されたせん。 特に、これは䞀時的なストレヌゞず倧きなデヌタブロックの凊理に䜿甚されるグロヌバル倉数に適甚されたす。 倧量の情報を曞き蟌むためにグロヌバル倉数が必芁な堎合は、デヌタの操䜜の最埌にその倀がnullに蚭定されるか再定矩されるこずを確認しおください。


グロヌバル倉数に関連するメモリ䜿甚量の増加の䟋は、 キャッシュ -再利甚可胜なデヌタを保存するオブゞェクトです。 効果的な運甚のためには、サむズを制限する必芁がありたす。 キャッシュが制限なしで倧きくなるず、ガベヌゞコレクタヌによっおキャッシュの内容をクリアできないため、メモリが倧量に消費される可胜性がありたす。


2忘れられたタむマヌずコヌルバック


倚くの堎合、 setInterval関数の同様の䜿甚法がありsetInterval 。


 var someResource = getData(); setInterval(function() { var node = document.getElementById('Node'); if(node) { //  -  node  someResource. node.innerHTML = JSON.stringify(someResource)); } }, 1000); 

この䟋は、デッドタむマヌがどのように有害であるかを瀺しおいたす叀いノヌドたたはデヌタぞのアクセス。 ノヌドを削陀するず、ハンドラヌ関数内のブロック党䜓が䞍芁になりたす。 ただし、 setIntervalアクティブである限り、ハンドラヌもアクティブであり、ガベヌゞコレクタヌによっおクリアできたせんこのため、最初にむンタヌバルを停止する必芁がありたす。 そのため、その䟝存関係もメモリから削陀できたせん。 おそらく倧量のデヌタを栌玍するsomeResourceは、ガベヌゞコレクタヌによっおクリアできないこずがsomeResourceたす。


コヌルバックに぀いお話したす。 ほずんどの堎合、むベントハンドラヌおよびサヌドパヌティラむブラリで䜿甚されたす。 ラむブラリは通垞、コヌルバックを凊理する独自のむベントハンドラヌおよびその他のサポヌトツヌルを䜜成したす。 通垞、オブゞェクトが到達䞍胜になった埌に倖郚ハンドラヌを削陀する方法も提䟛したす。


次に、むベントハンドラヌの状況を怜蚎したす。 ハンドラヌは、䞍芁になった堎合、たたは関連付けられたオブゞェクトが䜿甚できなくなった堎合に削陀する必芁がありたす。 これは、䞀郚のブラりザInternet Explorer 6が埪環リンクを正しく凊理する方法を知らなかったため、過去に重芁でした䞋蚘の泚を参照。 最新のブラりザのほずんどは、オブゞェクトに到達できなくなるずすぐにむベントハンドラヌを削陀したす。 ただし、オブゞェクト自䜓を削陀する前に、むベントハンドラヌを明瀺的に削陀するのが、やはり奜みのルヌルです。 䟋


 var element = document.getElementById('button'); function onClick(event) { element.innerHtml = 'text'; } element.addEventListener('click', onClick); // - . element.removeEventListener('click', onClick); element.parentNode.removeChild(element); // ,      , //      ,  onClick. //       , //      . 

むベントハンドラヌず埪環参照に関する泚意


JavaScriptの開発者は、むベントハンドラヌず埪環参照を長い間問題ず芋なしおきたした。 これは、Internet Explorerのガベヌゞコレクタヌのバグたたは蚭蚈䞊の決定によるものです。 Internet Explorerの叀いバヌゞョンでは、DOM芁玠ずJavaScriptコヌド間の埪環リンクを怜出できたせんでした。 これに加えお、通垞、むベントハンドラにはむベントオブゞェクトぞの参照が含たれたす䞊蚘の䟋のように。 これは、Internet ExplorerのリスナヌがDOMノヌドに远加されるたびに、メモリリヌクが発生したこずを意味したす。 そのため、Web開発者は、DOMノヌドを削陀する前にむベントハンドラヌを明瀺的に削陀するか、ハンドラヌ内のリンクを無効にし始めたした。 最新のブラりザInternet ExplorerおよびMicrosoft Edgeを含むは、埪環リンクを芋぀けお正しく凊理するアルゎリズムを䜿甚したす。 これで、ノヌドを削陀する前にremoveEventListenerを呌び出す必芁がremoveEventListener 。


jQueryなどのフレヌムワヌクずラむブラリは、ラむブラリAPIを䜿甚しお䜜成された堎合、ノヌド自䜓を削陀する前にハンドラヌを削陀したす。 これはラむブラリ自䜓によっお行われ、叀いInternet Explorerのような問題のあるブラりザで䜜業しおいる堎合でも、リヌクがないこずを保蚌したす。


3DOMから削陀された芁玠ぞのリンク


デヌタ構造内にDOMノヌドを保存するず䟿利な堎合がありたす。 テヌブル内の耇数の行の内容をポむントごずに曎新するずしたす。 蟞曞たたは配列に各DOMシリヌズぞのリンクを保存するこずは理にかなっおいたす。 この堎合、2぀のリンクは同じDOM芁玠を指したす。1぀はDOMツリヌにあり、もう1぀は蟞曞にありたす。 将来これらの行を削陀するこずにした堎合は、䞡方のリンクを到達䞍胜にする必芁がありたす。


 var elements = { button: document.getElementById('button'), image: document.getElementById('image'), text: document.getElementById('text') }; function doStuff() { elements.image.src = 'http://some.url/image'; elements.button.click(); console.log(elements.text.innerHTML); //  . } function removeButton() { //     body. document.body.removeChild(document.getElementById('button')); //         #button //    elements. // ..        //       . } 

これに加えお、DOMツリヌの内郚ノヌドぞのリンクで䜕かする必芁がありたす。  <td> テヌブル内の特定のセルぞのリンクをコヌドに保存するずしたす。 将来、DOMからテヌブルを削陀するこずにしたしたが、このセルぞのリンクは保持したす。 盎感的に、ガベヌゞコレクタヌはこのセル以倖のすべおをクリアするこずを期埅しおいたす。 ただし、実際には異なりたす。セルはテヌブルの子孫ノヌドであるため、芪ぞのリンクが栌玍されたす。 テヌブルセルぞのリンクは、テヌブル党䜓をメモリに保存するこずを匷制したす。 DOM芁玠ぞのリンクを保存するずきは、このこずに留意しおください。


4短絡


JavaScriptはクロヌゞャヌの基本です。芪スコヌプから倉数を取埗する関数です。 Meteor開発者は、JavaScriptランタむムの実装の特性により、同様のトリッキヌな方法でメモリリヌクを䜜成できる状況を発芋したした 。


 var theThing = null; var replaceThing = function () { var originalThing = theThing; var unused = function () { if (originalThing) console.log("hi"); }; theThing = { longStr: new Array(1000000).join('*'), someMethod: function () { console.log(someMessage); } }; }; setInterval(replaceThing, 1000); 

この䟋では、 theThingがreplaceThingたびに、 theThingは倧きな文字列ず新しいクロヌゞャヌ someMethod を含む新しいオブゞェクトを取埗したす。 この堎合、 unused倉数には、 originalThing 以前のreplaceThing呌び出しのreplaceThing を参照するクロヌゞャヌが含たれおいたす。 既に䜕か恥ずかしいですよね


スコヌプはただ同じ芪スコヌプにあるクロヌゞャヌに察しお䜜成されるため、このスコヌプは共有されるこずに泚意するこずが重芁です。 この堎合、 someMethodのクロヌズのために䜜成されたスコヌプは、 someMethodず共有されたす。 unusedはoriginalThingぞのリンクを保存したす。 unusedおよび未䜿甚ですが、 someMethodはsomeMethodで䜿甚できたす。 someMethodはスコヌプをunusedず共有するため、 unused䜿甚されない堎合でもoriginalThingを呌び出すず、垞にアクティブのたたになりたす぀たり、ガベヌゞコレクタヌから保護されたす。


このコヌドを䜿甚するず、䜿甚メモリが垞に増加するのを芳察できたす。 メモリの量は、ガベヌゞコレクタが入っおも枛少したせん。 実際、関連するクロヌゞャヌのリスト theThing倉数の圢匏のルヌトを持぀を䜜成したす。これらのクロヌゞャヌの各スコヌプには、倧きなメモリリヌクを衚す倧きな文字列ぞの盎接リンクが含たれおいたす。 これは実装成果物です。 クロヌゞャヌの異なる実装を䜿甚するず、この状況を朜圚的に凊理できたす。これに぀いおは、Meteorブログで説明されおいたす。


ガベヌゞコレクタヌの明らかな動䜜


ガベヌゞコレクタヌは䟿利ですが、欠点があり、その1぀は非決定性です。 これは、ガベヌゞコレクタが予枬䞍胜であるこずを意味したす。通垞、ガベヌゞコレクションがい぀行われるかを刀断するこずはできたせん。 その結果、プログラムが必芁以䞊のメモリを消費する堎合がありたす。 短い䞀時停止も芳察できたす。これは、アクションにすばやく応答するプログラムで特に顕著になりたす。


非決定論ずは、ガベヌゞコレクションがい぀行われるかを正確に蚀えないこずを意味したすが、ガベヌゞコレクタのほずんどの実装は同様の動䜜をしたす。 メモリが割り圓おられおいない堎合、ガベヌゞコレクタは珟れたせん。 次のシナリオを怜蚎しおください。


  1. かなりの数のメモリ割り圓おが発生したした。
  2. ほずんどの芁玠おそらくすべおは到達䞍胜ずしおマヌクされたしたたずえば、䞍芁なキャッシュぞのリンクをnull蚭定しnull 。
  3. 埌続のメモリ割り圓おは行われたせん。

この堎合、ほずんどのガベヌゞコレクタヌはそれ以䞊のアクションを実行したせん。 ぀たり、凊理可胜な到達䞍胜リンクがありたすが、ガベヌゞコレクタヌはそれらに圱響したせん。 このような小さなリヌクにより、アプリケヌションは必芁以䞊のメモリを消費したす。 Googleはこの動䜜の優れた䟋を提䟛したした-JavaScriptメモリプロファむリングドキュメント、䟋2 。


Chromeのプロファむリングツヌルの抂芁


Chromeは、JavaScriptでメモリ消費をプロファむリングするためのツヌルセットを提䟛したす。 メモリを操䜜するための2぀の重芁なツヌルは、タむムラむンタブずプロファむルタブです。


タむムラむンタブ


タむムラむンタブ


タむムラむンタブは、異垞なメモリ動䜜を怜出するのに非垞に圹立ちたす。 倧きなリヌクを怜玢する堎合は、ガベヌゞコレクション埌にわずかに枛少する定期的なゞャンプに泚意しおください。 スクリヌンショットは、メモリリヌクオブゞェクトの継続的な増加を瀺しおいたす。 最埌に倧きなスむヌプを行った埌でも、占有メモリの総量は最初よりも倧きくなりたす。 DOMノヌドの数も増加しおいたす。 すべおは、DOMノヌドに関連付けられたコヌドにリヌクがあるこずを瀺しおいたす。


[プロファむル]タブ


[プロフアむル]タブ


ほずんどの時間をこのタブで䜜業したす。 プロファむルを䜿甚するず、メモリのスナップショットを䜜成し、それらを盞互に比范できたす。 メモリ配垃プロセスを蚘録するこずもできたす。 どのモヌドでも、さたざたなタむプの出力を䜿甚できたすが、最も重芁なのは䞀般リストず比范リストです。


䞀般的なリストは、さたざたなタむプの関連オブゞェクトの抂芁ずそれらのサむズの組み合わせを提䟛したす 浅いサむズ 衚面サむズ、特定のタむプのすべおのオブゞェクトの合蚈および保持サむズ 保持サむズ、衚面サむズ、およびこれに関連する他のオブゞェクトのサむズ。 たた、オブゞェクトがそのルヌト 距離フィヌルドからどれだけ離れおいるかを知るこずもできたす。


比范リストは同じ情報を提䟛し、異なるスナップショットを比范するこずを可胜にしたす。 これは、メモリリヌクを芋぀けるために特に重芁です。


䟋Chromeを䜿甚しお゚ラヌを怜玢する


メモリリヌクには䞻に2぀のタむプがありたす。メモリ䜿甚量の定期的な増加を匕き起こすリヌクず、それ以䞊メモリを増加させない単䞀のリヌクです。 明らかに、定期的なリヌクを远跡する最も簡単な方法。 さらに、それらは最も危険です消費されるメモリが絶えず増加しおいる堎合、最終的にそのようなリヌクはブラりザを遅くするか、スクリプトの実行を停止したす。 非呚期的な挏れは、他の人の間で認識されるのに十分な倧きさであれば簡単に芋぀けるこずができたす。 通垞、深刻な問題を匕き起こすこずはないため、倚くの堎合怜出されたせん。 䞀床だけ発生するリヌクは、最適化の問題ずしおのみ考慮するこずができたす。 ただし、定期的なリヌクは修正が必芁な完党なバグです。


Chromeドキュメントの䟋のコヌドを怜蚎しおください。


 var x = []; function createSomeNodes() { var div, i = 100, frag = document.createDocumentFragment(); for (;i > 0; i--) { div = document.createElement("div"); div.appendChild(document.createTextNode(i + " - "+ new Date().toTimeString())); frag.appendChild(div); } document.getElementById("nodes").appendChild(frag); } function grow() { x.push(new Array(1000000).join('x')); createSomeNodes(); setTimeout(grow,1000); } 

grow関数が呌び出されるず、 <div>ノヌドの䜜成ずDOMぞの远加が開始されたす。 たた、倧きな文字列を関連付けお、グロヌバルスコヌプで䜜成された配列にアタッチしたす。 これにより、メモリが着実に増加し、調査したツヌルを䜿甚しお怜出できたす。


ガベヌゞコレクタヌを持぀蚀語は、メモリスケゞュヌルの倉動によっお特城付けられたす。 これは、通垞のように、メモリの䌝播が呚期的である堎合に予想されたす。 ガベヌゞコレクタヌを実行した埌、元の状態に戻らないメモリの定期的な増加を怜蚎したす。


定期的なメモリ増加を怜出する方法


これを行うには、 タむムラむンタブが必芁です。 Chromeで䟋を開き、開発ツヌルを開き、 タむムラむンを遞択し、 メモリを遞択しお、゚ントリをクリックしたす。 次に、ペヌゞに移動しお[ The Button ]をクリックしたす。 メモリリヌクが始たりたす。 しばらくしお、蚘録を停止し、結果を確認したす。


テヌブルの䟋


この䟋では、メモリリヌクが毎秒䜜成され続けたす。 蚘録を停止した埌、スクリプトが停止しおChromeがペヌゞを閉じないように、 grow関数にブレヌクポむントを蚭定したす。 このスクリヌンショットには、メモリリヌクの2぀の倧きな兆候がありたす。ノヌドのグラフノヌド、緑色の線ずJavaScriptコヌドのグラフ青色の線です。 DOMノヌドは垞に成長し、瞮小するこずはありたせん。 これは考える理由です。


JavaScriptコヌドグラフは、メモリ消費量の着実な増加も瀺しおいたす。 ガベヌゞコレクタヌのため、認識が困難です。 最初にメモリがどのように増加し、次に枛少し、再び増加しおゞャンプし、続いおメモリがさらに枛少するかなどを確認できたす。 この状況で重芁なのは、メモリをクリヌニングするたびに、その合蚈サむズが以前のものよりも倧きくなるこずです。 ぀たり、ガベヌゞコレクタヌはかなりの量のメモリを解攟したすが、それでも䞀郚は定期的にリヌクしたす。


これで、リヌクがあるこずが明らかになりたした。 圌女を芋぀けたしょう。


2぀のスナップショットを撮る


リヌクを芋぀けるには、 プロファむルセクションに移動したす 。 メモリの量を制埡するには、ペヌゞをリロヌドしたす。 ヒヌプスナップショットの取埗機胜が必芁になりたす。


ペヌゞを再読み蟌みし、読み蟌みが完了したらすぐに写真を撮りたす。 この写真を基瀎ずしお撮圱したす。 その埌、 The Buttonもう䞀床抌しお、数秒埅っおから2番目のショットを撮りたす。 写真を撮った埌は、スクリプトにブレヌクポむントを远加しお、メモリの消費を停止するこずをお勧めしたす。


スナップショットの䟋1


2぀のスナップショット間のメモリの広がりを远跡するには、2぀の方法がありたす。 [ サマリヌ ]を遞択しおから、スナップショット1ずスナップショット2の間に割り圓おられたオブゞェクトを右クリックするか、[ サマリヌ ]ではなく[ 比范]を遞択できたす。 どちらの堎合も、2぀のショットの間に生じたオブゞェクトのリストが衚瀺されたす。


この䟋では、リヌクを怜出するのは非垞に簡単です。リヌクは倧きいです。 Size Deltaコンストラクタヌ(string)泚意しおください。 8 MBおよび58の新しいプロパティ。 : , , 8 MB.


(string) , . . - , - retainers .


スナップショット2の䟋


, . , x . , — , . . 玠晎らしい。 — . DOM-, . , . Chrome , — Record Heap Allocations .


Record Heap Allocations


, , . . Record Allocation Timeline . , . . , ( , Chrome ).


レコヌドヒヌプ割り圓おの確認


, : , . . : ( (string) ), — DOM-, — Text ( DOM-).


HTMLDivElement Allocation stack .


ヒヌプ割り圓おの蚘録-遞択したアむテム


! , ( grow -> createSomeNodes ). , , HTMLDivElement . , , , . , , . . , , ( createSomeNodes ). .



: , Dev Tools -> Settings "record heap allocation stack traces" .


Allocation Summary :


メモリ割り圓おリスト


. grow createSomeNodes . grow , . (string) , HTMLDivElement Text , , , .


. それらを䜿甚したす。 ( ). , , , , ( ).


远加資料


Memory Management — Mozilla Developer Network
JScript Memory Leaks — Douglas Crockford (old, in relation to Internet Explorer 6 leaks)
JavaScript Memory Profiling — Chrome Developer Docs
Memory Diagnosis — Google Developers
An Interesting Kind of JavaScript Memory Leak — Meteor blog
Grokking V8 closures


おわりに


, , JavaScript, . , . , . . , . , .




: 4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them , : Sebastián Peyrott .


: aalexeev , : iamo0 , jabher , spearance , zeckson , , .



Source: https://habr.com/ru/post/J309318/


All Articles