프로세스 와 스레드
자바의 메모리 구조를 이해하기위해선, 우선 프로세스와 스레드의 차이를 알아야한다.
프로세스
프로세스는 운영체제에서 할당받는 하나의 공간으로 각각의 프로세스는 독립적인 자원을 갖고있다. (하나의 응용프로그램이라고 생각해도 된다.)
각 프로세스는 운영체제로 부터 아래의 독립적인 공간을 제공받는다.
- CPU시간
- 메모리 주소
- Stack, Heap, Code, Data...
스레드
스레드는 프로세스의 실행단위이다. 모든 프로세스는 하나의 메인 스레드를 갖고있으며, 프로세스내의 동작은 스레드를 통해서 이루어진다.
하나의 프로세스는 여러개의 스레드를 만들수 있으며, 아래와 같은 특징을 갖고있다.
- 스레드는 독립적인 Stack 영역을 갖고있다.
- 스레드는 Stack영역을 제외한 프로세스의 자원을 다른 스레드와 공유한다.
위 그림은 .java파일이 실행되는 jvm의 Runtime Data Area구조다.
- Static Area
자바의 전역변수, static으로 생성된 변수들이 저장되는 영역이다. 코드가 처음 컴파일될때 메모리에 올라가며, 프로그램 종료시까지 사라지지않는다. 어디서든 접근할수있어 편리하지만, 잘못사용할 경우, 심각한 메모리 낭비가 될수있다.
- Heap
Java 기본형 int, long, boolean ... 을 제외한, 인스턴스화되는 객체들이 저장되는 영역이며, 가비지 콜렉터가 더 이상 참조되지 않는 객체를 확인하고 제거한다.
-Method Area
클래스의 멤버변수 이름, return값 접근제어자와 같은 코드의 정보가 저장되는 영역이다.
- Stack
자바의 지역변수, return값, Java기본형 등 임시로 사용되는 값들이 저장되는 영역이다.
- 개별 호출 메소드는 스택영역에 저장된다
- ClassA classA = new ClassA()와 같은 인스턴스를 생성했다면, 힙 영역에 new ClassA()로 생성된 인스턴스가 저장되며, ClassA는 스택 영역에 저장되어 힙영역의 인스턴스를 참조한다.
- 생명주기는 메소드의 호출, 종료 시기와 같다
아래 코드를 보자.
public class Main{
private int num;
public static void main(String[] args){
Main m = new Main().threadTest();
}
public Main threadTest(){
Thread t1 = new Thread(()->{
for(int i = 0; i < 2; i++){
System.out.println("t1");
print();
}
});
Thread t2 = new Thread(()->{
for(int i = 0; i < 2; i++){
System.out.println("t2");
print();
}
});
t1.start();
t2.start();
return this;
}
public void print(){
System.out.println(this.num);
num++;
}
}
위 프로그램은 2개의 스레드가 스태틱영역에 저장된 num변수를 동시에 참조하는 상황이다.
최종 출력값은 4가 된다.
- Pc register
스레드가 생성될때마다 생성되며, 스레드에 대한 정보(스레드가 실행되는 주소 등)를 갖고있는 영역이다.
- Native Method Stack
바이트코드로 변환된 자바코드가 아닌, 자바 외 코드를 실행하는 영역이다. (외부의 .py코드를 실행하는등)
'Java > Java' 카테고리의 다른 글
[Java] Future.cancel() vs CompletableFuture.cancel() (0) | 2023.02.15 |
---|---|
[Java] 스레드와 Synchronized (0) | 2021.10.25 |
[Java] compareTo (0) | 2021.05.05 |
[Java] Wrapper Class (0) | 2021.05.02 |
[Java] ArrayList (0) | 2021.05.02 |