メモリ漏洩とメモリオーバーフローの違い


概念と区別
1、メモリ漏れ(memory leak):
プログラムがメモリを申請した後、申請したメモリ領域を解放できず、一度のメモリ漏洩では大きな影響はないようだが、メモリ漏洩が堆積した後の結果はメモリオーバーフローである.
2、メモリオーバーフロー(out of memory):
プログラムがメモリを申請する時、申請者が使用するのに十分なメモリがない、あるいはintタイプのデータを格納する記憶空間を与えたが、longタイプのデータを格納すると、結果的にメモリが足りなくなり、OOM、いわゆるメモリオーバーフローと呼ばれるエラーが報告される.
3、両者の関係 は、システムが実際に割り当てた空間を超えたメモリ領域です.この場合、システムはあなたのニーズを満たすことができず、メモリオーバーフローのエラーを報告します.
  • メモリリークとは、システムにメモリの割り当てを申請して使用する(new)ことですが、使用が完了した後は返さない(delete)ことです.結局あなたが申請したメモリは自分でもアクセスできません(住所をなくしたかもしれませんが)、システムも再び必要なプログラムに割り当てることはできません.鍵付きのロッカーを借りたことに相当します.荷物を預けてロッカーをロックした後、鍵をなくしたり、鍵を返さなかったりすると、このロッカーは誰にも供給できず、ゴミ回収器に回収されません.探しているからです彼の情報は何もありません.
  • メモリオーバーフロー:1つの皿はいろいろな方法で4つの果物しか入れられません.あなたは5つ入れて、結局地面に落ちて食べられません.これがオーバーフローです.例えばスタック、.割り当てられたメモリが不足してデータ・アイテムのシーケンスを置くことをメモリオーバーフローと呼びます.はっきり言って、私はそんなに耐えられないので、私は間違っています.

  • 4、メモリ漏れの分類(発生方式によって分類)
  • 多発性メモリリーク:メモリリークが発生したコードは複数回実行され、実行されるたびにメモリリークが発生します.
  • 偶発メモリ漏洩:メモリ漏洩が発生するコードは、特定の環境または操作中にのみ発生します.常発性と偶発性は相対的である.特定の環境では、偶発的なものが常発的になるかもしれません.そのため、テスト環境とテスト方法はメモリの漏洩を検出するのに重要です.
  • 使い捨てメモリ漏洩:メモリ漏洩が発生したコードは1回のみ実行されるか、アルゴリズム上の欠陥により、いずれも1つのメモリが1つだけ漏洩します.たとえば、クラスのコンストラクション関数にメモリを割り当てても、コンストラクション関数ではメモリが解放されないため、メモリ漏洩は一度だけ発生します.
  • 暗黙メモリ漏洩:プログラムは実行中にメモリを割り当て続けたが、終了するまでメモリを解放しなかった.厳密には、最終プログラムがすべての申請のメモリを解放したため、メモリ漏洩は発生していません.しかし、1つのサーバ・プログラムでは、数日、数週間、数ヶ月実行する必要があり、メモリをタイムリーに解放しないと、最終的にシステムのすべてのメモリが消費される可能性があります.したがって、このようなメモリ漏洩を暗黙的なメモリ漏洩と呼ぶ.

  • 5、メモリオーバーフローの原因と解決方法:
    A.メモリオーバーフローの原因:
    1.             ,             ; 
    2.           ,       ,  JVM    ; 
    3.                      ; 
    4.          BUG; 
    5.            
    

    B.メモリオーバーフローの解決方案:
    まず、JVM起動パラメータを変更し、メモリを直接追加します.(-Xms、-Xmxパラメータは必ず忘れないでください.)
    ステップ2では、エラー・ログを確認し、OutOfMemoryエラーの前に他の例外またはエラーがあるかどうかを確認します.
    第3歩では、コードを調べて分析し、メモリオーバーフローが発生する可能性のある場所を特定します.重点的に以下の点を調べます.
  • 1.データベース・クエリーで、すべてのデータを一度に取得したクエリーがあるかどうかを確認します.一般的に、一度に10万個のレコードをメモリに記録すると、メモリオーバーフローを引き起こす可能性があります.この問題は比較的に隠れていて、オンラインになる前に、データベースの中でデータが少なくて、問題が発生しにくくて、オンラインになった後に、データベースの中でデータが多くなって、1回のクエリーはメモリのオーバーフローを引き起こす可能性があります.したがって、データベース・クエリーについては、できるだけページングでクエリーします.
  • 2.コードにデッドループまたは再帰呼び出しがあるかどうかを確認します.
  • 3.大きなループが重複して新しいオブジェクトエンティティが生成されているかどうかを確認します.
  • 4.データベース・クエリーで、すべてのデータを一度に取得したクエリーがあるかどうかを確認します.一般的に、一度に10万個のレコードをメモリに記録すると、メモリオーバーフローを引き起こす可能性があります.この問題は比較的に隠れていて、オンラインになる前に、データベースの中でデータが少なくて、問題が発生しにくくて、オンラインになった後に、データベースの中でデータが多くなって、1回のクエリーはメモリのオーバーフローを引き起こす可能性があります.したがって、データベース・クエリーについては、できるだけページングでクエリーします.
  • 5.リスト、MAPなどの集合オブジェクトが使用済みか、クリアされていないかをチェックします.List,MAPなどの集合オブジェクトには常にオブジェクトへの参照が存在し,これらのオブジェクトはGCで回収できない.

  • C.ステップ4、メモリ表示ツールを使用してメモリ使用状況を動的に表示する(jvisualvm)