面接-ごみ回収の詳細

1386 ワード

Javaごみ回収の詳細
GC(Garbage Collection)の歴史はjavaよりも古く、1960年に誕生したLisp言語は当時3つの問題を考えていた.
  • どのメモリを回収する必要があります
  • いつ回収しますか
  • の回収方法
    この3つの質問にそれぞれ答えます.これもJava面接でよく受ける知識点です
    JVMの概要
    まずJVMの動作時のメモリ分布を簡単に見ると複雑に見えますが、一般的には単純にスタック(新生代と老生代に分けられ、新生代はedenとsurvivorに分けられ、後で説明します)、スタック、メソッドエリア(もちろん他にもありますが、記憶を容易にするためだけ)は1行のコードで表現できます
            Object object = new Object();

    ここで、Object objectはスタックにあり、new Object()はスタックに申請され、いくつかのタイプの情報はメソッド領域に格納されます.これは、次の図にも当てはまります.
    GC 3つの問題
    上の基本名詞を紹介してから、GCの3つの質問に答えることができます.
  • どのメモリを回収する必要があります
  • GCワークフローでは、メモリの無駄を防ぐため、GCではメモリを回収する2つのポリシーがあります
    - PC:        
          +1,    -1,      ,                      ,     JVM        。
    -        
         ,            ,          ,   : , ,     。
  • いつ回収しますか
  • 多くの場合、edenの空間が不足する場合、jdk 1がトリガーされます(edenは上にあります).6以前は戦略が異なりましたが、ここでは古いバージョンは考えません.
  • の回収方法
    新生代も老生代も山の中にいる.-新生代GC:javaオブジェクトの大部分はリサイクル更新が速い-老生代GC:長期にわたって存在するオブジェクトは、老生代に入るので、一般的に大きなオブジェクト(長い文字、長い配列など)は避けられます.
    メモリ漏洩とメモリオーバーフロー
    一般的にJavaメモリの割り当てには、メモリ漏洩とメモリオーバーフローという2つのケースがあります.
  • メモリリーク:1つのオブジェクトにメモリを割り当てた後、オブジェクトが使用されていない間にタイムリーに解放されず、メモリユニットを占有し続け、実際に使用可能なメモリを減少させ、メモリリークのように
  • メモリオーバーフロー:一般的にはメモリが不足しています.たとえば、無限ループで大きなオブジェクトを作成し続けると、すぐにメモリオーバーフローが発生します.
  • 小結
    主にGCの流れと面接でよく見られる3つの問題を紹介し、基本的にメモリの割り当てと各種名詞が紹介されていますが、具体的な詳細の流れはもっと複雑かもしれません.ここでは深く検討しません.