Jetpack Compose自体は本質的にリークしやすいわけではありません。開発者が直面するメモリ保持の問題の大部分は、**標準的なKotlinの参照問題**に起因しています—長寿命のコンポーネント(ViewModels、シングルトン、オブジェクトレジストリ、静的フィールド、アプリケーションスコープのコルーチン)が、意図せず短寿命のUI要素(Activityのコンテキスト、Composable関数、CoroutineScopes、rememberされた値)を保持してしまうことです。効果的にデバッグするために、この原則を理解してください。## 基礎:Composeのライフサイクルモデル- **コンポジション** = 実行時にインターフェースを駆動するComposableノードのライブツリー- **remember** = そのComposableインスタンスがアクティブである限り、オブジェクトをコンポジション内に保持- **コンポジションの終了** = composableがツリー/ブランチから削除される / 非アクティブ化 / ComposeViewが切り離される → Composeがクリーンアップを実行し、エフェクトコルーチンを終了- **保持** = 元々コンポジションのスコープにあったオブジェクトへの外部参照が持続 → ガベージコレクターはそれを回収できない## コルーチンのライフサイクル:良い例、安心な例、そして問題のある例### コルーチンが適切にクリーンアップされる場合**ループを伴うLaunchedEffect**このエフェクトのコルーチンは、Composableがコンポジションから削除されると終了します:
Jetpack Composeのメモリ保持を理解する:リファレンスグラフの解説
Jetpack Compose自体は本質的にリークしやすいわけではありません。開発者が直面するメモリ保持の問題の大部分は、標準的なKotlinの参照問題に起因しています—長寿命のコンポーネント(ViewModels、シングルトン、オブジェクトレジストリ、静的フィールド、アプリケーションスコープのコルーチン)が、意図せず短寿命のUI要素(Activityのコンテキスト、Composable関数、CoroutineScopes、rememberされた値)を保持してしまうことです。効果的にデバッグするために、この原則を理解してください。
基礎:Composeのライフサイクルモデル
コルーチンのライフサイクル:良い例、安心な例、そして問題のある例
コルーチンが適切にクリーンアップされる場合
ループを伴うLaunchedEffect
このエフェクトのコルーチンは、Composableがコンポジションから削除されると終了します: