JavaScriptのメモリリークを発見してくれるツール「Leak Finder」をグーグルが公開
ガベージコレクションの機能を備えるJavaScriptのような言語で開発されたアプリケーションでは、基本的にメモリリークは生じないはずですが、それでも回収されないメモリ領域がどんどん増えていくというメモリリーク的な状況は起こりえます。
メモリリークは最終的にはそのソフトウェアの動作を遅くしたり不安定にしますが、短期的には問題なく動作しているように見え、単純なテストでは症状が表れにくいため、発見は難しいものです。
グーグルはこうしたJavaScriptのメモリリークを検出してくれるツール「Leak Finder」を公開したことを、ブログ「Leak Finder: a new tool for JavaScript」で紹介しています。
Chromeのリモートプロトコル経由で検出
Leak FinderのWebサイトでは、このツールを以下のように説明しています。
In JavaScript you cannot have "memory leaks" in the traditional sense, but you can have objects which are unintentionally kept alive and which in turn keep alive other objects, e.g., large parts of DOM.
JavaScriptでは、伝統的な意味での“メモリリーク”は起きない。けれども、意図せずに保持されたままのオブジェクト、例えば大きなDOMなどを持ち続けてしまうことはありえる。
Leak Finder for JavaScript works against the Developer tools remote inspecting protocol of Chrome, retrieves heap snapshots, and detects objects which are "memory leaks" according to a given leak definition.
Leak Finder for JavaScriptは、Chromeが備えているデベロッパーツールのリモートインスペクションプロトコルで動作し、ヒープのスナップショットを取得、前述のようなメモリリークを起こしているオブジェクトを検出する。
また、動作条件として以下の3つが指定されています。
- ちゃんと分かるコード(注:難読化されていないことを指すのでは)
- 7月10日以後の、新しいClosureライブラリ(注:グーグルのJavaScriptライブラリ)
- Chromeのバージョン21以降
検出内容はClosureライブラリで定義された独自の配列に保存されるようです。
Leak Finder relies on goog.Disposable monitoring mode. The mode gathers all created but not yet disposed instances of goog.Disposable (and its subclasses) into an array goog.Disposable.instances_.
Leak Finderは、goog.Disposableモニタリングモードに依存している。このモードでは、生成後に破棄されていないインスタンスをgoog.Disposable.instances_配列に格納する。
この配列には、メモリリーク解消のための有用な情報なども格納されており、また情報はマシンリーダブルになっているため自動化テストにも適用できるとのことです。
Chromeのリモートプロトコルを使うなど、それほど手軽にインストールして試せるツールではなさそうですが、JavaScriptの大規模アプリケーションでテストの自動化など品質検査工程にそれなりの工数を割ける環境であれば、試してみる価値がありそうです。
JavaScriptで大規模なアプリケーションを開発するケースはこれから増えていくはずで、今後こうしたツールの充実が進んでいくことでしょう。
関連記事
JavaScriptのメモリリーク対策については、以下の記事でも紹介されています。
あわせて読みたい
IT業界の平均給与ランキングで、Publickeyと日経コンピュータの結果が食い違っている件について
≪前の記事
2012年7月の人気記事「IT系上場企業の給与を比べた」「富士通の旗艦データセンターがダウン」「WebMatrix2はiPhone/iPadエミュレータ搭載」