JavaScriptメモリの調査
JavaScriptのメモリ例外は、アプリのクラッシュを引き起こし、ユーザーエクスペリエンスを低下させます。JavaScriptのヒープ制限(TVプロファイルの場合は200MB)を超えると、Hermesガベージコレクター(HermesGC)のメモリ不足エラーが発生します。一般的な要因として、メモリリーク、大規模なデータ構造、非効率的なリソースクリーンアップなどが挙げられます。
このページでは、メモリの問題を特定、分析、解決する手順について説明します。
手順1: クラッシュの理由を特定する
- デバイスから、集約クラッシュレポート(ACR)をダウンロードして開きます。
- ACRファイルで
CrashReason:SIGSEGVを探します。 - アプリログの「
HermesGC OOM」をチェックして、JavaScriptヒープメモリオーバーフローが発生していることを確認します。
ACRの例:
CrashDescriptor:1b26a2ab4b104aa474b84218e69d2780
CrashLang:Native
Process:com.org.keplerApp
LibraryName:keplerscript-runtime-loader-2.so
CrashReason:SIGSEGV
ログの例:
Nov 21 20:10:13.389612 firestick-010bc8cead0041f0 local0.info keplerscript-ru[7087]: 27 I KeplerScript:[Logging.cpp:40] HermesGC OOM: [] reason = Max heap size was exceeded (1 from category: vm_allocate_category), numCollections = 177, heapSize = 205520896, allocated = 201732128, va = 205520896, external = 88.
HermesGC OOMログエラーを含むSIGSEGVは、実行時にJavaScriptヒープメモリの問題が発生していることを示しています。
手順2: メモリリークのシナリオを特定する
- Visual Studio(VS)Codeを開きます。
- Memory Monitorを起動します。
- アプリのメモリ消費量の検査にある手順に従ってください。
-
JavaScriptのヒープグラフをトラッキングして、200MBのしきい値に近づいているかどうかを確認します。
JavaScriptヒープメモリが200MBのクリティカルな制限に近づいている - セッションを記録してクラッシュシナリオをキャプチャします。
- アプリのメモリ内訳の記録にある手順に従ってください。
手順3: JavaScriptヒープスナップショットをキャプチャする
-
Chrome DevToolsをVega向けReact Nativeアプリにアタッチします。Chrome DevToolsの起動にある手順に従ってください。
メモリ分析のためにChromeデベロッパーツールをVegaアプリに接続する -
[Memory] タブに移動し、[Heap Snapshot] を選択します。
ヒープスナップショットをキャプチャするためのChrome DevToolsの [Memory] タブ -
[Take snapshot] をクリックします。
以下の画像はヒープスナップショットの例です。
キャプチャされたヒープスナップショットとダウンロードオプション -
下矢印をクリックして、スナップショットをホストコンピューターにダウンロードします。
手順4: JavaScriptヒープスナップショットを分析する
MemlabまたはChrome DevToolsを使用して、JavaScriptヒープスナップショットを分析します。
Memlabによる分析
-
Memlabをインストールします。
npm install -g memlab -
解析を実行します。
memlab find-leaks --baseline <初期のスナップショット> --target <リーク後のスナップショット> --final <クリア後のスナップショット> --trace-all-objectsMemlabは次の3つのヒープスナップショットを比較します。
- ベースライン - 初期状態
- ターゲット - 潜在的なリークが発生した後の状態
- ファイナル - クリーンアップ後の状態
--trace-all-objects引数を指定すると、すべてのターゲットページオブジェクトに潜在的なリークのマークが付けられます。memlab find-leaksは3つのヒープスナップショットを比較し、要約をテーブル形式で表示します。
メモリリークのヒープスナップショットを比較したMemlabの分析表 -
クリアされていないオブジェクトをテーブルから検索します。
-
永続オブジェクトの割り当てを解除するためのコードを確認します。
-
保持トレースを確認します。
Memlabは、リークがあったオブジェクトを保持サイズでランク付けします。保持トレースを使用して、オブジェクトツリー内のリークのあるオブジェクトを特定します。
Memlabの保持トレースからメモリリークオブジェクトパスを特定できる
Memblabの詳細については、以下を参照してください。
Chrome DevToolsによる分析
-
Chrome DevToolsを開き、[Memory] タブに移動します。
-
JavaScriptヒープスナップショットをアップロードします。
-
さまざまなビューを使用してJavaScriptヒープスナップショットを分析します。
Chrome DevToolsのヒープスナップショット分析画面と複数の表示オプション
- [Shallow Size] で並べ替えて、最も重いオブジェクトを見つけます。
- [Retained Size] で並べ替えて、最も影響の大きいオブジェクトを特定します。
さまざまな観点から分析するため、複数のビュー([Summary]、[Comparison]、[Containment]、[Statistics])を切り替えます。
スナップショット分析については、以下を参照してください。
関連トピック
- CPU使用率のモニタリング
- Chrome DevToolsを使用してパフォーマンスを測定する方法
- 💬 コミュニティ: アプリのメモリが不足しているかどうか、どうすれば確認できますか?
- 💬 コミュニティ: バグレポートのログスクリプト
Last updated: 2025年9月30日

