Concept#
ローカルメモリ = ダイレクトメモリ + メタスペース
ダイレクトメモリ#
- 概念:ダイレクトメモリは、仮想マシンの実行時データ領域の一部ではなく、Java ヒープの外部でシステムから直接割り当てられたメモリ領域です。ダイレクトメモリは NIO を使用し、ヒープ内に存在する DirectByteBuffer を使用してネイティブメモリを操作するため、読み書き性能が高いです。
- 理由:ダイレクトメモリは JVM と IO デバイスとのやり取りに特化した物理メモリです。JVM は自動ガベージコレクションメカニズムに基づいて動作するため、すべてのデータは GC 時に移動されます。もしもシステム API を呼び出して、ある位置のメモリをディスクに書き込むように操作システムに指示した場合、そのデータが GC によって移動された場合、GC が終了した後に操作システムは誤ったデータを書き込んでしまう可能性があります。
メタスペース#
- 概念:JDK1.8 からメタスペースの概念が導入され、以前はメソッド領域 / 永続代と呼ばれていました。ロードされたクラス情報、定数、静的変数、定数プール、ジャストインタイムコンパイル後のコードなどのデータを保存します。
ワーキングメモリとローカルメモリ#
JMM では、各スレッドには共有変数を格納するための独自のワーキングメモリがあり、各スレッドは自分のワーキングメモリ内の変数にのみアクセスできます。ワーキングメモリは抽象的な概念であり、実際のメモリではなく、CPU レジスタとキャッシュです。