S E P H ' S

[JAVA] 메모리와 멀티 스레드 / 멀티 프로세스 본문

Programing & Coding/JAVA

[JAVA] 메모리와 멀티 스레드 / 멀티 프로세스

yoseph0310 2023. 2. 10. 18:03

사실 이 포스팅의 내용은 Java 뿐만이 아닌 거의 모든 프로그래밍 언어가 메모리를 사용하는 방식이라고 봐도 무방하다. 이후 지속적으로 포스팅할 Java의 메모리 사용 방식에 대해 정리하기 전에 다루는 포스팅이라고 생각하고 정리해볼 것이다.

 

지역 변수와 메모리

변수는 스태틱 영역, 스택 영역, 힙 영역 세군데 모두에 존재한다. 하지만 각기 다른 목적을 가진다. 그래서 지역 변수, 클래스 멤버 변수, 객체 멤버 변수로 다르다.

  1. 지역 변수 : 스택 영역에 존재. 스택 프레임이 사라지면 마찬가지로 사라진다.
  2. 클래스 멤버 변수 : 스태틱 영역에 존재. 스태틱 영역에 한 번 자리 잡으면 JVM이 종료될때 까지 고정(static)된 상태로 존재.
  3. 객체 멤버 변수 : 힙 영역에 존재. 객체 멤버 변수들은 객체와 함께 GC(가비지 컬렉터)라고 하는 힙 메모리 회수기에 의해 주기가 결정된다.
❗ 외부 스택 프레임에서 내부 스택 프레임 변수에 접근은 불가능하지만 그 역은 가능하다.

메소드 호출과 메모리

두 개의 메소드가 있다고 가정해보자. 스택 영역에는 두 개의 스택 프레임이 생성된다. 각자 메소드의 스택 프레임 내부에서의 변수는 접근이 가능하지만 서로 각각 프레임 내부의 변수에는 접근이 불가능하다.

또한 메소드가 호출 될 때마다 스택 프레임이 새로 생성된다. square() 메소드가 있고 main() 메소드에서 square() 메소드를 두 번 호출 했다고 가정하자. 그러면 T 메모리에는 square() 메소드 스택 프레임이 두 개가 생기고 그 둘은 각자 다른 존재이다.

메소드를 호출하면서 인자로 전달 되는 것은 변수 자체가 아닌, 변수가 저장한 값만을 복제해서 전달한다. 이것을 값에 의한 전달이라고 해서 Call By Value라고 한다.

 

전역 변수와 메모리

전역 변수는 스태틱 영역에 존재한다. 그래서 어떤 스택 영역의 스택 프레임이라도 접근 가능하다. 여기서 지역 변수와 전역 변수에 대한 차이점이 드러난다.

  • 스택 프레임에 종속적인 지역 변수
  • 스택 프레임에 독립적인 전역 변수

코드가 길어지고 구조가 복잡해진다면 전역 변수의 대한 값과 값에 대한 변경 이유를 추적하기가 힘들어진다. 되도록 전역 변수는 읽기 전용으로 값을 공유할 전역 상수로 쓰는 것외에는 사용을 피하는 것이 좋다.

 

멀티 스레드 / 멀티 프로세스의 이해

멀티 스레드

  • 멀티 스레드의 T 메모리 모델은 스택 영역을 스레드 개수만큼 분할해서 쓰는 것.
  • 멀티 스레드는 하나의 T 메모리를 사용하는데 스택 영역만 분할해서 사용한다.
  • 하나의 T 메모리 안에서 스택 영역만 분할한 것이기 때문에 하나의 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없으나 스태틱 영역과 힙 영역은 공유해서 사용한다. 따라서 멀티 프로세스 대비 메모리를 적게 사용할 수 있다.
  • 쓰기 가능한 전역 변수를 사용하면 스레드 안전성이 깨진다.

멀티 프로세스

  • 멀티 프로세스는 다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조다.
  • 멀티 프로세스는 각 프로세스마다 각자의 T 메모리가 있고 각자 고유의 공간이므로 서로 참조할 수 없다.
  • 하나의 프로세스가 다른 프로세스 T 메모리 영역을 절대 침범할 수 없는 안전한 구조이지만 메모리 사용량은 그만큼 크다.