as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

JavaScriptメモリの調査

JavaScriptメモリの調査

JavaScriptのメモリ例外は、アプリのクラッシュを引き起こし、ユーザーエクスペリエンスを低下させます。JavaScriptのヒープ制限(TVプロファイルの場合は200MB)を超えると、Hermesガベージコレクター(HermesGC)のメモリ不足エラーが発生します。一般的な要因として、メモリリーク、大規模なデータ構造、非効率的なリソースクリーンアップなどが挙げられます。

このページでは、メモリの問題を特定、分析、解決する手順について説明します。

手順1: クラッシュの理由を特定する

  1. デバイスから、集約クラッシュレポート(ACR)をダウンロードして開きます。
  2. ACRファイルでCrashReason:SIGSEGVを探します。
  3. アプリログの「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: メモリリークのシナリオを特定する

  1. Visual Studio(VS)Codeを開きます。
  2. Memory Monitorを起動します。
  3. JavaScriptのヒープグラフをトラッキングして、200MBのしきい値に近づいているかどうかを確認します。

    JavaScriptヒープ使用量が200MBのしきい値に近づいていることを示すメモリモニターのグラフ
    JavaScriptヒープメモリが200MBのクリティカルな制限に近づいている
  4. セッションを記録してクラッシュシナリオをキャプチャします。

手順3: JavaScriptヒープスナップショットをキャプチャする

  1. Chrome DevToolsをVega向けReact Nativeアプリにアタッチします。Chrome DevToolsの起動にある手順に従ってください。

    Chrome DevToolsをReact Native Vegaアプリに接続してデバッグするアニメーションデモ
    メモリ分析のためにChromeデベロッパーツールをVegaアプリに接続する
  2. [Memory] タブに移動し、[Heap Snapshot] を選択します。

    Chrome DevToolsの [Memory] タブ([Heap Snapshot] オプションが選択され、[Take snapshot] ボタンが強調表示されている)
    ヒープスナップショットをキャプチャするためのChrome DevToolsの [Memory] タブ
  3. [Take snapshot] をクリックします。

    以下の画像はヒープスナップショットの例です。

    キャプチャされたヒープスナップショットと、スナップショットをローカルコンピューター に保存(ダウンロード)するための矢印ボタンが表示されたChrome DevTools
    キャプチャされたヒープスナップショットとダウンロードオプション
  4. 下矢印をクリックして、スナップショットをホストコンピューターにダウンロードします。

手順4: JavaScriptヒープスナップショットを分析する

MemlabまたはChrome DevToolsを使用して、JavaScriptヒープスナップショットを分析します。

Memlabによる分析

  1. Memlabをインストールします。

    クリップボードにコピーしました。

     npm install -g memlab
    
  2. 解析を実行します。

    クリップボードにコピーしました。

    memlab find-leaks --baseline <初期のスナップショット> --target <リーク後のスナップショット> --final <クリア後のスナップショット> --trace-all-objects
    

    Memlabは次の3つのヒープスナップショットを比較します。

    • ベースライン - 初期状態
    • ターゲット - 潜在的なリークが発生した後の状態
    • ファイナル - クリーンアップ後の状態

    --trace-all-objects引数を指定すると、すべてのターゲットページオブジェクトに潜在的なリークのマークが付けられます。

    memlab find-leaksは3つのヒープスナップショットを比較し、要約をテーブル形式で表示します。

    ベースライン、ターゲット、最終スナップショットのメモリリークを比較したMemlabの分析結果(オブジェクト数とサイズも表示)
    メモリリークのヒープスナップショットを比較したMemlabの分析表
  3. クリアされていないオブジェクトをテーブルから検索します。

  4. 永続オブジェクトの割り当てを解除するためのコードを確認します。

  5. 保持トレースを確認します。

    Memlabは、リークがあったオブジェクトを保持サイズでランク付けします。保持トレースを使用して、オブジェクトツリー内のリークのあるオブジェクトを特定します。

    Memlabの保持トレース:詳細なオブジェクトツリー階層、およびメモリリークパスとその保持サイズを表示
    Memlabの保持トレースからメモリリークオブジェクトパスを特定できる

Memblabの詳細については、以下を参照してください。

Chrome DevToolsによる分析

  1. Chrome DevToolsを開き、[Memory] タブに移動します。

  2. JavaScriptヒープスナップショットをアップロードします。

  3. さまざまなビューを使用してJavaScriptヒープスナップショットを分析します。

    [Shallow Size] 列と [Retained Size] 列でソートされたオブジェクトを含む概要ビューが表示された、Chrome DevToolsのヒープスナップショット分析画面
    Chrome DevToolsのヒープスナップショット分析画面と複数の表示オプション
  • [Shallow Size] で並べ替えて、最も重いオブジェクトを見つけます。
  • [Retained Size] で並べ替えて、最も影響の大きいオブジェクトを特定します。

さまざまな観点から分析するため、複数のビュー([Summary][Comparison][Containment][Statistics])を切り替えます。

スナップショット分析については、以下を参照してください。


Last updated: 2025年9月30日