본문 바로가기

Java/Java

[Java] Java Heap Stack Static

프로세스 와 스레드

자바의 메모리 구조를 이해하기위해선, 우선 프로세스와 스레드의 차이를 알아야한다.

프로세스

프로세스는 운영체제에서 할당받는 하나의 공간으로 각각의 프로세스는 독립적인 자원을 갖고있다. (하나의 응용프로그램이라고 생각해도 된다.)

각 프로세스는 운영체제로 부터 아래의 독립적인 공간을 제공받는다.

- 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