DEV/Java

[java] java 메모리 구조와 공유 메모리의 이해

Bi3a 2023. 8. 4. 00:54

728x90

0. 이전 포스팅 : "멀티 스레드의 이해와 구현"에서 이어지는 내용입니다.

 

[java 기초] 멀티 스레드(Multi thread)의 이해 / 구현

1. 스레드(Thread) : 프로그램 / 프로세스 의 명령문을 위 → 아래로 차례대로 실행하는 한개의 흐름의 단위이다. 싱글스레드 : 한 개의 프로세스 / 프로그램에 한개의 스레드만 사용하는 것 멀티스

doinitright.tistory.com

 

 

 

java 기초 깨부수기


 

     

    공유 메모리 설명 이전 프로세스의 메모리 구조부터 학습해보자.

     

    1. 프로세스 / 프로그램의 메모리 구조

    일반적인 프로그램은 크게 CODE부터 STACK까지 총 4가지로 나누어 구성되어 있으며,

    CODE → STACK까지 메모리 낮은 주소 → 높은 주소 순이다.

     

     

    메모리 구조
    Photo link :: https://hackmd.io/@KangMoo/Bk5Z1c_en

     

     

    ※ 메모리 주소란?

    메모리주소는 메모리 위치에 대한 식별자로, 메모리에 저장된 데이터를 가져올 수 있는 주소값이다.
    낮은 주소는 말 그대로 0x00000000부터 들어가는 주소 값이고,
    높은 주소는 0 xFFFFFFFF로 들어가는 주소 값으로 이해하면 된다.
    그 이상은 이해가 너무 어렵다.

     

    1) 코드 영역(Code Area)

    • 실행할 프로그램의 코드, 제어문, 함수, 상수, 리터럴 등이 저장된다.
    • 읽기 전용으로, 코드가 메모리에 로드되는 시점에 할당된다.
    • 우리가 작성하는 코드는 바로 여기에 위치한다(읽기 전용)

     

    2) 데이터 영역(Data Area)

    • 전역 변수(global), 정적 변수(static) 등 고정된 데이터 값이 저장되는 영역이다.
    • 프로세스 시작 시부터 메모리 할당되며, 끝날 때까지 메모리에 남아있어 프로세스 종료 시 해제된다.

     

     

    * 코드 - 데이터까지는 메모리 공간이 불변인 영역이다, 

     

     

     

    3) 힙 영역(Heap Area)

    • 동적 메모리 할당을 위한 영역이다.
    • 프로그래머가 직접 메모리를 할당 및 해제해야 한다.
    • 런타임 중 메모리의 크기가 변동할 수 있다.
    • java 기준 객체 생성, 참조 변수 생성 시 여기에 저장된다
    • Heap 영역은 호출 및 생성 시 낮은 주소에서 높은 주소로 메모리가 할당된다(↑)

     

    4) 스택 영역(Stack Area)

    • 함수 호출 시 생성되는 지역 변수, 매개 변수 등이 저장된다. (java main() 함수의 변수 포함)
    • 함수 호출이 완료되면 자동으로 메모리가 해제된다.
    • 후입선출(LIFO) 방식으로 관리된다.
    • Stack 영역은 Heap 영역과 반대로 호출 및 생성 시 높은 주소에서 낮은 주소로 메모리에 할당된다(↓)

     

    힙 -  스택은 가변적인 메모리 공간이며 사실 같은 메모리 공간을 사용한다.

     

    하지만 같은 공간이라고 무작위로 저장이 되지 않고,

    Heap은 위에서 아래로,  Stack은 아래에서 위 방향으로 저장이 된다. 따라서 많은 가변 메모리 공간 할당으로 인해

    Heap -> Stack을 넘어설 때는 Heap Overflow, Stack -> Heap을 넘어설 때는 Stack Overflow가 발생한다.

     

     

     

    2. java의 Runtime Data Area(메모리 구조)

    그렇다면 java의 메모리 구조에 대해 설명해 보자.

    통상 우리가 코드 실행을 위해 작성하는. java 파일은 컴파일러로 인해 바이트 코드로 변환된다.

    그리고 그 바이트 코드가 JVM(Java Virtual Machine)에 의해 클래스 파일이 되어 우리가 보는 코드로 실행되는 형태이다.

    그중 Runtime Data Area는 JVM의 메모리 영역으로

    우리가 IDE에서 코드를 빌드해 애플리케이션으로 실행할 때 사용되는 데이터들을 적재하는 영역이다.

    이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack,  총 5가지로 나눠진다.

     

     

    런타임 데이터, 메모리 에리어
    Photo link :: https://thsd-stjd.tistory.com/149

    위의 일반 프로그램 메모리 공간 구별되는  java의 메모리 공간의 특징과 , 스레드의 연관성에 대해서 간략히 설명하겠다.

     

     

    1) Method Area

    • Class 정보, 전역변수 정보, Static 변수 정보,  '상수' 정보 등이 저장되는 공간이다.
    • 모든 스레드에서 정보가 공유되는 공간이다.

     

    2) Heap

    • new 연산자로 생성된 객체, Array, 참조 타입 등의 동적 데이터가 저장되는 공간이다.
    • 모든 스레드에서 정보가 공유되는 공간이다.

     

    3) Stack

    • 지역변수, 메서드의 매개변수와 같은 함수 호출에 의한 생성 및 종료 시 해제되는 데이터가 저장되는 공간
    • 모든 스레드에서 정보가 공유되는 공간이다.

     

    4) PC Register

    • 스레드가 생성되면서 생기는 공간이며, 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
    • JVM이 실행하고 있는 현재 위치를 저장하는 역할
    • 스레드마다 하나씩 존재한다.

     

    5) Native Method Stack

    • Java 가 아닌 다른 언어 (C, C++)로 구성된 메서드를 실행이 필요할 때 사용되는 공간
    • 스레드마다 하나씩 존재한다.

     

    결론적으로 스레드는 java 내에서 Method Area와 Heap까지의 공간을 공유하며, Stack 영역부터는 각각 사용한다. 

    아래와 같이 Code, Data, Heap은 공통으로 사용하나, 스레드는 독립적인 Stack 공간을 할당받게 된다.

    그래서 이 Code - Heap 구간 (java 기준 Method Area - Heap 구간)을 스레드의 공유 메모리로 정의한다.

     

    프로세스의 구조
    photo link :: https://olivejua-develop.tistory.com/68

     

     

    3. 결론  : 멀티스레드를 사용함으로써 java 메모리가 가지는 장점

    1) Code부터 Heap까지 사용되는 클래스 내의 변수 등의 값을 멀티스레드가 공통적으로 공유함으로써
    스레드별 실행하는 독립적인 처리동작에 대한 값의 활용과 변경이 용이해진다. 
      ex) 회원 정보를 공유 메모리에 저장하고 이를 활용하는 스레드의 경우 활용 방안
      스레드 1) : 장바구니 확인  / 스레드 2) 구매이력 조회 / 스레드 3 ) 회원 정보 수정

    2) 스레드끼리 공유하는 영역이므로 중복된 데이터만큼 메모리를 아낄 수 있다.
    3) Code와 Heap 영역의 데이터를 Stack 영역까지 올리고 내릴 필요 없으므로 그만큼 효율적이다.

     

    다음 시간에는 java에서 기본으로 지원하는 공유 메모리 구현법에 대해 알아보겠다.

     

     

     

    #REFERENCE

     

    멀티스레드의 개념

    멀티스레드를 설명하기에 앞서 프로세스와 스레드부터 먼저 짚고 넘어가고자 한다. 프로세스와 스레드 프로세스 (Process) 프로세스는 현재 실행 중인 프로그램이다. 프로그램이 실행 중이지 않

    olivejua-develop.tistory.com

     

    스레드와 메모리구조

    프로세스 vs 스레드 (Thread) 프로세스란? - 프로그램을 실행시켰을 때 메모리상에 올라가 동작되고있는 과정 스레드란? - 프로세스 내에서 실행되는 흐름의 단위 1. main() 안의 실행문들이 하나의 Th

    thsd-stjd.tistory.com

     

    JVM 메모리 구조란? (JAVA)

    안녕하세요? 코딩 중독입니다. 오늘은 JVM 메모리 구조에 대해 알아보겠습니다. JVM이란? JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상

    steady-coding.tistory.com