Webアプリケーションは時間の経過とともに減速しますか? ユーザーは、パフォーマンスの低下とメモリの消費量の鈍化について不平を言っていますか? Webパフォーマンスのサイレントキラー:メモリリークに直面している可能性があります。この記事では、この頻繁に見過ごされている問題を調査します
メモリリークは何ですか?Webアプリケーションでは、アプリケーションが不要なオブジェクトへの参照を保持するとメモリリークが発生します。これにより、JavaScriptのゴミコレクターがメモリを取り戻すことができなくなり、パフォーマンスの劣化につながります。
メモリ漏れの一般的な原因
1。 永続的なイベントリスナー:
イベントリスナーを削除するのを忘れることは、頻繁な犯人です。 次の例はこれを示しています:
ソリューションには適切なクリーンアップが含まれます:
<code class="language-javascript">function setupHandler() { const button = document.getElementById('myButton'); const heavyObject = { data: new Array(10000).fill('?') }; button.addEventListener('click', () => { console.log(heavyObject.data); }); } // Adds a new listener every 2 seconds – a leak! setInterval(setupHandler, 2000);</code>
<code class="language-javascript">function setupHandler() { const button = document.getElementById('myButton'); const heavyObject = { data: new Array(10000).fill('?') }; const handler = () => { console.log(heavyObject.data); }; button.addEventListener('click', handler); return () => button.removeEventListener('click', handler); } let cleanup = setupHandler(); setInterval(() => { cleanup(); cleanup = setupHandler(); }, 2000);</code>
反応では、useEffect
内でクリーンアップ機能を無視すると、漏れが発生する可能性があります:
修正された実装:useEffect
<code class="language-javascript">function DataFetcher() { const [data, setData] = useState(null); useEffect(() => { const fetchData = async () => { const response = await api.getData(); setData(response); // Leak: updates state after unmount }; fetchData(); }, []); }</code>
3。 大きなオブジェクトを保持するクロージャー:
<code class="language-javascript">function DataFetcher() { const [data, setData] = useState(null); useEffect(() => { let isSubscribed = true; const fetchData = async () => { const response = await api.getData(); if (isSubscribed) setData(response); }; fetchData(); return () => { isSubscribed = false; }; }, []); }</code>
閉鎖は、意図せずに大きなオブジェクトを保持できます:
メモリ漏れの検出
<code class="language-javascript">function createLargeObject() { return new Array(1000000).fill('?'); } function setupHandler() { const largeObject = createLargeObject(); return () => { console.log(largeObject.length); }; } const handler = setupHandler(); // largeObject persists</code>
Chrome devtools:
open devtools(f12)。
「メモリ」タブに移動します。<code class="language-javascript">// Memory usage helper function debugMemory() { console.log('Memory:', performance.memory.usedJSHeapSize / 1024 / 1024, 'MB'); }</code>
リソースのクリーンアップ:イベントリスナーを常に削除し、間隔/タイムアウトをクリアし、ネットワークリクエストをキャンセルし、接続を閉じる。
WeakMap
WeakSet
ツールuseEffect
react devtools profilerメモリ監視ツール
<code class="language-javascript">// Simple memory monitoring function monitorMemory(fn) { const start = performance.memory.usedJSHeapSize; fn(); const end = performance.memory.usedJSHeapSize; console.log('Memory diff:', (end - start) / 1024 / 1024, 'MB'); }</code>
mdn web docs:メモリ管理 Chrome DevTools Memory Profilerドキュメント
反応メモリ管理のベストプラクティス
以上が最新のWebアプリケーションでのメモリリークの理解:サイレントパフォーマンスキラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。