제리의 배움 기록

[Java] 프로세스와 스레드 - <1> JVM 메모리 관점에서 분석 본문

자바

[Java] 프로세스와 스레드 - <1> JVM 메모리 관점에서 분석

제리92 2021. 12. 15. 11:19

프로세스와 스레드

프로세스는 프로그램이 실행된 상태를 의미 합니다.
스레드는 프로세스보다 작은 최소 실행 단위입니다. 모든 프로세스는 최소 하나의 실행단위 스레드를 가집니다.

JVM에서의 스레드와 메모리 구성

컴파일된 자바 애플리케이션을(프로그램)을 실행하면 새로운 JVM 프로세스가 시작되고 main thread가 생성됩니다.
이 main thread를 통해 코드가 실행되고, 다른 thread들이 생성될 수 있습니다.

JVM은 프로세스를 실행하면서 OS로부터 Runtime Data Area 메모리를 할당받습니다.

Method Area

  • 클래스 정보, 정적 변수 등 JVM 프로세스가 시작될 때 데이터가 할당

Heap

  • 동적으로 데이터가 할당되는 영역
  • 레퍼런스 타입 객체 생성시에 실제 객체가 올라가는 메모리 영역

PC(Program Counter) Register

  • 해당 스레드에서의 명령 흐름을 추적하고 관리
  • 현재 수행중인 JVM 명령의 주소가 저장
  • 연산을 위해 필요한 피연산자를 임시로 저장

Stack (= call stack, execution stack)

  • 메서드 호출시 호출된 메서드를 위한 frame이 생성
  • 메서드 scope 내에서 발생하는 지역변수, 매개변수, 리턴값 등이 frame에 저장됨
  • 메서드 scope이 종료되면(리턴되면) frame에 할당되었던 변수들과 frame은 반환됨
  • 메서드 내에서 메서드를 호출하는 경우, 호출된 메서드 frame이 바로 위에 생기면서 실행흐름이 해당 메서드로 넘어가게됨

Native Method Stack

  • 자바가 아닌 다른 언어를 JNI를 통해 실행하기 위한 코드 공간

JVM 스레드의 종류

데몬 스레드비데몬 스레드로 나눌 수 있습니다.

데몬 스레드

데몬 스레드는 다른 비데몬 스레드가 없다면 동작을 중지합니다.
JVM의 가비지 컬렉션, 모니터링 등  애플리케이션 운용을 위해 사용하다가 주요 스레드가 종료되면 함께 종료되어야 할 경우, 데몬으로 설정하면 유용합니다.

비데몬 스레드

프로그램 실행 진입점인 main thread는(static void main(String[] args) 비데몬 스레드로 생성되어, 이 스레드가 동작을 중지하거나 종료하면 다른 데몬스레드들도 함께 중지하게 됩니다.

HotSpot VM에서는 main thread를 VM thread 라고 부릅니다.

 

JVM 메모리 관점의 멀티프로세싱과 멀티스레딩 차이

멀티 프로세싱

  • 멀티 프로세싱은 완전히 독립된 메모리 공간을 할당받습니다.
  • 프로세스간 통신을 위해서는 IPC(Inter Process Communication) 방법을 별도로 이용해야 하므로 스레드에 비해 비용이 큽니다.
    IPC 방법으로는 파이프라인 전달, shared memory, message queue 등이 있습니다.

멀티 스레딩

  • 멀티 스레딩은 하나의 프로세스 내에서 method area, heap은 공유하고 PC Resiter, JVM Stack, Native Method Stack 공간만 별도로 가집니다.
  • Method area와 heap 영역이 공유되기 때문에 프로그래밍시 동기화 문제가 발생하지 않도록 유의하여야 합니다.
  • 프로세스보다 경량화된 독립공간을 가지기 때문에 공간 절약의 이점이 있습니다.

다음글 : 프로세스와 스레드 - <2> LifeCycle 비교

 

[참고]
oracle docs - jvms-2
overps - jvm architecture

Comments