ホームページ >ウェブフロントエンド >jsチュートリアル >React アプリケーションのメモリ リークをチェックして修正する方法
メモリ リークは React アプリケーションの一般的な問題であり、大幅なパフォーマンスの低下やユーザー エクスペリエンスの低下につながる可能性があります。この記事では、メモリ リークとは何か、React アプリケーションでメモリ リークが発生する理由、およびメモリ リークを特定して修正する方法について説明します。また、メモリ リークが発生する一般的なシナリオの実践的な例を示し、それを防ぐ方法も示します。
メモリ リークは、アプリケーションがメモリを割り当てたものの、不要になったときにメモリの解放に失敗した場合に発生します。 React のような JavaScript アプリケーションでは、オブジェクト、データ、または DOM ノードが適切にクリーンアップされていない場合にメモリ リークが発生し、時間の経過とともにメモリ消費量が増加します。
メモリ リークにより、アプリケーションが遅くなり、応答しなくなる可能性があります。チェックしないままにしておくと、特にメモリの少ないデバイスでは、クラッシュやパフォーマンスの低下につながる可能性があります。 React では、これらのリークは、イベント リスナー、タイマー、API 呼び出し、DOM 要素への参照などのリソースの不適切な管理によって発生することがよくあります。
React は、コンポーネントを DOM にレンダリングする、宣言型のコンポーネントベースの JavaScript ライブラリです。コンポーネントがマウントされると、API 呼び出し、イベント リスナー、タイマーなどのリソースが初期化されます。コンポーネントがアンマウントされると、React はこれらのリソースを自動的にクリーンアップすることを期待します。ただし、開発者がその後のクリーンアップを忘れると、メモリ リークが発生する可能性があります。
React アプリケーションでのメモリ リークの一般的な原因は次のとおりです。
a.コンポーネントがアンマウントされた後、古い状態が更新されます
b.クリーンアップされていないイベント リスナーまたはサブスクリプション
c.大きなオブジェクトまたは配列を状態に保存する
d.コンポーネントの最適化されていないレンダリング
e.リスト内の主要なプロパティが不安定または欠落しています
f.非同期操作が適切に処理されません
メモリ リークの検出には、異常なメモリ使用パターンがないかアプリケーションを監視することが含まれます。以下にいくつかのアプローチを示します:
a. Chrome DevTools の使用
b.ヒープ スナップショット
Chrome DevTools の [メモリ] タブを使用して、ヒープ スナップショットを取得します。
スナップショットを比較して、メモリ内に不必要に残っているオブジェクトを特定します。
c. React Developer Tools のプロファイラー
React Developer Tools Profiler を使用して、正しくアンマウントされていないコンポーネントを特定します。
d.サードパーティツール
a.サブスクリプションとリスナーをクリーンアップする
サブスクリプション、リスナー、またはタイマーを使用する場合は、コンポーネントがアンマウントされたときにそれらがクリーンアップされるようにしてください。機能コンポーネントでは、これは通常 useEffect クリーンアップ関数を使用して行われます。
`useEffect(() => {
const handleResize = () => console.log(window.innerWidth);
window.addEventListener('resize', handleResize);
// クリーンアップ
return() => {
window.removeEventListener('resize', handleResize);
};
}, []);`
b.間隔とタイムアウトをクリア
setInterval または setTimeout 呼び出しがすべてクリアされていることを確認します:
`useEffect(() => {
const intervalId = setInterval(() => {
console.log('インターバル実行中');
}, 1000);
// クリーンアップ
return() => clearInterval(intervalId);
}, []);`
c.グローバル変数を避ける
グローバル変数には、オブジェクトがガベージ コレクションされるのを防ぐ参照を保持できます。使用を制限し、完了したら未使用の変数を null に設定します。
d. React.StrictMode
を使用する
開発時に React.StrictMode を有効にして、メモリ リークを引き起こす可能性のある副作用など、コンポーネント内の潜在的な問題を特定します。
`'react' から React をインポートします;
ReactDOM を 'react-dom' からインポートします;
import App from './App';
ReactDOM.render(
、
document.getElementById('root')
);`
e。インライン関数とクロージャを避ける
プロップまたはクロージャー内のインライン関数は、レンダリングのたびに新しいインスタンスを作成する可能性があり、メモリの問題が発生する可能性があります。 useCallback を使用して関数をメモ化します:
const handleClick = useCallback(() => {
console.log('ボタンがクリックされました');
}, []);
f. React 参照の最適化
データを保存するために参照に過度に依存しないようにします。可能な限り状態またはコンテキストを使用します。
a.コンポーネントのライフサイクル ガイドラインに従ってください
特にクラスコンポーネントの場合、適切なライフサイクル管理を理解して実装します。
b.フック付きの機能コンポーネントを使用する
useEffect のようなフックを備えた機能コンポーネントは、ライフサイクル管理を簡素化し、よくある落とし穴を防ぐのに役立ちます。
c. useEffect
の依存関係を監視する
意図しない動作を防ぐために、useEffect のすべての依存関係が正確であることを確認してください。
useEffect(() => {
console.log('依存関係が変更されました');
}, [依存関係]);
d.エラー境界の実装
エラー境界を使用してエラーを適切にキャッチして処理し、未処理の例外によってメモリ リークが悪化しないようにします。
`class ErrorBoundary extends React.Component {
コンストラクター(小道具) {
スーパー(小道具);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(エラー、情報) {
console.error(エラー, 情報);
}
render() {
if (this.state.hasError) {
戻る
return this.props.children;
}
}`
e。開発中にメモリ リークをテストする
開発中に Chrome DevTools、React Profiler、ヒープ スナップショットなどのツールを使用して、デプロイ前にリークを特定します。
a. Chrome デベロッパーツール
「パフォーマンス」タブと「メモリ」タブを使用して、メモリ使用量をプロファイリングします。
ヒープ スナップショットを取得して比較します。
b. React 開発者ツール
プロファイラーを使用してコンポーネントのレンダリングを分析し、メモリ内にまだマウントされていないコンポーネントを特定します。
c.なぜレンダリングしたのですか
React コンポーネント内の不要な再レンダリングを特定するためのデバッグ ライブラリ。
d.セントリー
実稼働環境でのメモリ使用量を監視し、パフォーマンスのボトルネックを検出します。
e。ヒープ
JavaScript アプリケーション用に設計されたメモリ プロファイリング ツール。
FuturisticGeeks の記事全文を読む:
続きを読む
以上がReact アプリケーションのメモリ リークをチェックして修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。