Javaメモリの割り当てとゴミ回収メカニズム

3788 ワード

Javaメモリ領域
1、メモリ領域
  • jvmランタイムデータ領域
  • プログラムカウンタ
  • Java仮想マシンスタック
  • ローカルメソッドスタック
  • メソッド領域
  • Javaスタック
  • 大図
  • 2、概念解釈
  • プログラムカウンタバイトコード解釈器が動作する場合は、このカウンタの値を変更して次の実行するバイトコード命令を選択し、ブランチ、ループ、ジャンプ、異常処理、スレッド復元などの基礎機能はこのカウンタに依存して完了する必要があります.各スレッドは独立したプログラムカウンタに対応し、スレッド実行命令を記録し、スレッド間の切り替え後に正しい実行位置に戻ることを保障し、Java仮想マシンのマルチスレッドが秩序正しく順番に切り替えて実行できることを保障している.
  • Java仮想マシンスタックスレッドはプライベートで、そのライフサイクルはスレッドと同じです.仮想マシンスタックは、Javaメソッドが実行するメモリモデルを記述します.各メソッドが実行されると、ローカル変数テーブル、オペレーションスタック、ダイナミックリンク、メソッド出口などの情報を格納するスタックフレームが同時に作成されます.各メソッドは、実行が完了するまで呼び出され、スタックフレームが仮想マシンスタック内でスタックからスタックを出るプロセスに対応する.
  • ローカルメソッドスタックは、Java仮想マシンスタックと同様の役割を果たす仮想マシンがJavaメソッド(すなわちバイトコード)サービスを実行するために使用するnativeメソッドサービスである.
  • メソッド領域メソッド領域は、パラメータ-XX:PermSize、-XX:MaxPermSizeによって
  • に設定できる通常の永続領域でもあります.
  • JavaヒープJavaヒープはJava仮想マシンが管理するメモリの中で最大のブロックであり、すべてのスレッドで共有されるメモリ領域であり、仮想マシンの起動時に作成され、Javaオブジェクトインスタンスを格納する場所である.Javaスタックは、新生代と旧年代に細分化され、新生代はEden空間、from survivor空間、to survivor空間などに細分化される.JVM仕様に従って、Javaスタックは物理的に不連続なメモリ領域に存在することができます.論理的に連続していればいい.最大Javaスタックのサイズは-Xmx、初期化時のJavaスタックのサイズは-Xmsで設定できます.

  • 3、堆、桟、方法区をよりよく理解するために、以下に栗を挙げる
    では、次のコードを見てみましょう.
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * mvp
     * @author yuanmeng
     * @create 2017-06-18   8:44
     **/
    public class MVP {
    
        private static Logger LOG = LoggerFactory.getLogger(MVP.class);
    
        public void winMVP(String name) {
    
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String today = sdf.format(new Date());
    
            LOG.info("    mvp");
        }
    }

    このプログラムのデータ情報は、次の図のようにメモリに格納されます.
    ごみ収集器
    1)クラス情報やインスタンスオブジェクト情報などのゴミメカニズムJavaの実行時にロードされたデータを検出するとシステムメモリが占有され,幸いJavaには強力なゴミ収集器があり,メモリがオブジェクトを割り当てられていないときにGCがトリガーされる.  ごみを検出する方法によく見られるのは2種類ある:1.引用カウント法;2.達成性分析アルゴリズム.
  • 参照カウント法参照が無効になると1を減らします.いずれの時点でもカウンタが0のオブジェクトは再利用不可能であり,これを回収可能なオブジェクトと判定する.この検出メカニズムの利点は簡単であるが,オブジェクト間の循環参照問題を解決できない致命的な欠点がある.hashMapが高同時性の場合、ループチェーンテーブルの問題が発生します.
  • 可達性分析アルゴリズム  主流のJVMは基本的に可達性分析アルゴリズムを使用してオブジェクトが生存しているかどうかを判断し、一連の「GC Roots」のオブジェクトを起点として下へ検索することによって、探索した経路は参照チェーンであり、1つのオブジェクトがGC Rootsに接続されていない場合、そのオブジェクトが使用されなくなることを表す.これを回収可能な対象と判定する.

  • 下図を見ると、Object 5、Object 6、Object 7はノードから到達できない対象であり、回収対象と判定できる.
    2)ゴミ回収メカニズム
  • タグ-パージアルゴリズムこのアルゴリズムの欠点を説明します.
  • タグとクリアの2つのプロセスで、効率は高くありません.
  • タグをクリアすると大量の不連続メモリフラグメントが発生し、タグを複数回クリアして回収すると、後でプログラムが実行中に大きなオブジェクトを割り当てる必要がある場合、十分な連続メモリが見つからず、早めにGCを出発せざるを得なくなり、GCに時間がかかる可能性があります.

  • レプリケーションアルゴリズムストレージオブジェクトのメモリ領域が切れた場合、この領域で生存しているオブジェクトを別の空き領域にコピーし、使用したメモリ領域を一度にクリーンアップします.

  • レプリケーション・アルゴリズムは、シンプルで効率的です.しかし、コストは少し大きくなり、使用可能なメモリは元の半分に縮小され、「スペーススワップ時間」となります.
  • タグ-整理アルゴリズム
  • 分生代アルゴリズム
  • 前にも紹介したように、Javaスタックメモリは新世代、旧世代に細分化できます.新生代生存のライフサイクルは比較的短く、GCを通過するたびに生存する対象年齢は1を加え、何度もGCを通過しても生存する対象は直接古い年代に昇進する.古い年代のライフサイクルは長い.言い換えれば、毎回GC後に新生代が生き残る対象は少なく、古い世代が生き残る対象が多い.前に分析したように,生存対象の少ない新生代は複製アルゴリズムが適しており,生存対象の多い旧年代はマーキング−クリアまたはマーキング−アレンジアルゴリズムが適している
    参考文献
    『Java仮想マシンの理解』