さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

JVMのプロセス、メモリ、スレッドについて

ざっくばらんにまとめました。
 

1.プロセスについて

実行するアプリケーション単位。
JVMは起動時に1つのプロセスを起ち上げて、そのプロセス上でJavaを動かす。
メモリ管理などをすべて行うため、1つのプロセス上でないといけない。
 
プロセスを複数立ち上げる場合は、元のプロセス(親プロセス)からforkしてプロセス(子プロセス)を作成する。
メモリ空間は別で割り当てられるため、データは共有されない。
※使用されるプログラムは同じだけど、プログラム内の状態をもつ変数はプロセスごとに異なるから、互いで同じプログラムを処理していても干渉しない。
 

2.メモリについて

A.) Javaヒープ
 
     Javaプログラム内で使用されるオブジェクトが格納される領域。
 
Object obj = new Object();
String[] strArry = new String[5];
などを行うと、Javaヒープに格納される。
 
New領域とOld領域と言うものが存在する。
 
B.) Cヒープ
 
     JVMがJNIで呼び出したネイティブライブラリに使用されるメモリ領域。
     
     JavaからCやC++のプログラムを呼び出した場合に、そのプログラムがこのCヒープという領域に割り当てられる。
 
C.) スレッドスタック
 
     JVMが持っているスレッド情報を格納する領域。
     1スレッドにつき1処理。
     処理がたくさん実行されているとスレッドスタックの数は多くなる。
 

3.スレッドについて

プロセスの中で起ち上がり、メモリ空間を共有する。
つまり複数のスレッドが実行されている場合は、1つプログラムが複数のスレッドで使用されるのでスレッドセーフな状態でないといけない。
 

3-1.スレッドセーフとは

複数のスレッドが1つのプログラムを実行しても問題が発生しない状態。
 
以上