ホームページ > ウェブフロントエンド > jsチュートリアル > 最新のWebアプリケーションでのメモリリークの理解:サイレントパフォーマンスキラー

最新のWebアプリケーションでのメモリリークの理解:サイレントパフォーマンスキラー

Barbara Streisand
リリース: 2025-01-28 16:35:09
オリジナル
510 人が閲覧しました

Understanding Memory Leaks in Modern Web Applications: The Silent Performance Killers

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>
ログイン後にコピー

2。 Reactの落とし穴:
<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)。

「メモリ」タブに移動します。
  1. 操作が疑われる前後のヒープスナップショットをキャプチャします
  2. スナップショットを比較して、保持されたオブジェクトを識別します
  3. 予防ベストプラクティス
<code class="language-javascript">// Memory usage helper
function debugMemory() {
  console.log('Memory:', performance.memory.usedJSHeapSize / 1024 / 1024, 'MB');
}</code>
ログイン後にコピー

リソースのクリーンアップ:イベントリスナーを常に削除し、間隔/タイムアウトをクリアし、ネットワークリクエストをキャンセルし、接続を閉じる。

    および
  1. :これらを使用して、ゴミ収集を防ぐことなくメタデータを取り付けるために使用します。
  2. React Cleanup: fooks メモリリーク検出のためのWeakMapWeakSetツール
  3. Chrome DevTools Memory Profiler useEffectreact devtools profiler
ヒープスナップショットアナライザー

メモリ監視ツール

  • 結論
  • メモリリークは陰湿ですが、予防可能です。 プロアクティブなコーディングと定期的な監視は、高性能のWebアプリケーションを維持するための鍵です。 予防は常に治療よりも優れています
  • さらなる読み取り:
<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート