Programming/Process & Multi Threading

[Java] 스레드와 메모리구조 그리고 프로세스(Process)의 구조

dev.pudding 2023. 12. 16. 16:33
728x90

 

메모리의 종류 

스택메모리 (Stack Memory)

Each JVM thread has a private Java virtual machine stack, created at the same time as the thread. A JVM stack stores frames, also called “stack frames”. A JVM stack is analogous to the stack of a conventional language such as C  

 

각각의 JVM 스레드는  만들어짐과 동시에 JVM스택(Java Virtual Machine Stack ) 이 함께 만들어진다. JVM 스택은 "스택 프레임(Stack Frame)"이라고 하는 프레임들을 저장하며 이는 C언어의 스택 구조와 비슷한 것이다. 

 

위는 오라클에서 설명하는 JVM 스레드의 구조이다. 스레드는 스택이라고 하는 프레임들을 저장하고 있다.

그림의 예시처럼 스레드당  스텍이라는 것이 만들어지며 하나의 스택안에는 여러개의 스택 프레임으로 구성되어있다.

스택프레임의 구조는 지역변수(local variable) , 피연산자 스택(operand stack) 그리고 상수풀참조(constant pool reference)로 구성되어있다.

  1. 지역 변수 : 메소드 내부에서 선언된 변수. 스택 메모리에 할당된다. 메소드가 호출될 때 생성되며 메소드 종료시 소멸된다. 따라서 지역변수는 메소드 내부에서만 유효하며 다른 메소드에서 접근이 불가하다.
  2. 피연산자 스택(Operand Stack): 연산관련된 데이터를 처리하는 스택자료구조. 연산자가 실행될 때 피연산자 스택을 사용하여 데이터를 push하고 pop하여 연산을 수행함
  3. 상수 풀 참조(Constant Pool Reference): 자바 클래스 파일 내의 상수값 및 클래스 구조에 대한 정보를 보유하는 데이터 구조

스레드가 실행되는 메모리 영역은 stack 메모리 영역이다.  스레드가 실행되기 위해서는 여러 변수 정보를 읽어야하며 객체의 주소값이 스택영역에 저장되있기 때문이다.

힙메모리 (Heap Memory)

Java objects reside in an area called the heap. The heap is created when the JVM starts up and may increase or decrease in size while the application runs. When the heap becomes full,  garbage is collected. During the garbage collection objects that are no longer used are cleared, thus making space for new objects.

 자바의 객체들은 heap이라고 불리는 영역에 위치하고 있다. JVM이 시작되면 heap 영역이 만들어지고 어플리케이션 실행시 크기가 늘어나거나줄어들 수 있다. heap 영역이 가득차면 가비지 컬렉션(Garbage Collection)으로 사용되지 않는 객체들을 정리하고 새로운 객체가 heap 영역에 들어올 공간을 만들어준다.  

 

아래의 그림예시를 보면 객체는 heap 메모리 영역에 저장되고, heap 메모리 영역에 저장된 객체의 주소값은 stack 메모리 영역에 저장되어있다.

프로세스 구조

그림은 프로세스를 나타낸 것이다. 프로세스가 실행되기 위해 많은 작업들 (스레드)가 실행되며, 모든 스레드는 각각의 스택을 가지고 있다. 프로세스 내부에는 공유자원이 있으며, 스레드간의 효율적인 분배를 위해서 동기화 메커니즘을 구상해야한다. 

 


출처 

 

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

 

Chapter 2. The Structure of the Java Virtual Machine

Conditional branch: ifeq, ifne, iflt, ifle, ifgt, ifge, ifnull, ifnonnull, if_icmpeq, if_icmpne, if_icmplt, if_icmple, if_icmpgt if_icmpge, if_acmpeq, if_acmpne.

docs.oracle.com

https://dzone.com/articles/java-memory-management

 

Master Guide to Java Memory Management - DZone

To optimize your Java apps, make sure you know how it manages memory, and how you can tweak it. This deep dive tackles heap memory and garbage collection.

dzone.com