🔓 모든 스레드가 공유하는 데이터 영역
1. Class Area (=Method Area, Static Area, Code Area)
💾 저장되는 정보
- 클래스 정보(멤버 변수 이름),
- 변수 정보(데이터 타입, 접근 제어자 정보)
- 메서드 정보(메서드 이름, 리턴타입, 파라미터, 접근제어자 정보)
- static 변수, final class 변수
- constant pool (상수풀: 문자상수, 타입, 필드, 객체 참조가 저장됨)
⏰ 생성시점
- JVM이 동작해서 클래스가 생성될 때 생성된다.
2. Heap Area (객체들의 놀이터)
- new 를 통해 생성된 객체와 배열이 저장되는 영역
- Method Area에 로드된 클래스들만 생성이 가능하다.
- GC의 주요 대상이 된다. - 효율적인 GC를 위해 메모리 영역이 분리되어 있다.
- 런타임 시 할당
📌 String Pool (Heap영역) vs Heap 영역
자바에서는 String을 저장하는데 2가지 영역을 사용할 수 있다.
1. String Pool (Heap영역)
String str1 = "soom";
이렇게 literal 방식으로 선언하면, 내부적으로 String 클래스의 intern() 메서드가 호출되고, 이것을 String interning이라고 한다.
이때 String은 String Constant Pool에 저장되는데, 자바 6 이전에 String Pool은 Static 영역 (Method 영역)의 Permenet Generation에 있다가, 이 Perm Generation의 크키가 작게 고정되어 있어서, Java7부터는 Spring Pool이 이 위치를 Heap 영역으로 옮겼다. 이전에 static 영역에서 메타데이터를 저장하던 Permenent Generation은 Java8 이후, Meta Space로 이름을 변경한다.
2. Heap 영역
String str1 = new String("soom");
이렇게 new를 통해 객체를 생성하면, Heap 영역에 존재하게 된다.
이렇게 객체를 생성하면 서로 같은 문자여도 각 객체가 다른 메모리를 가리키기 때문에 동일한 값이 나오지 않는다.
🔒 각각의 스레드 마다 생성되고 공유되지 않는 메모리 영역
3. Stack Area (메서드들의 놀이터)
- 지역변수, 파라미터, 리턴값, 임시 값 등이 생성되는 영역
- 메서드를 호출할 때마다 개별적으로 stack이 생성, 종료 시 영역에서 해제
- 컴파일 타임 시 할당
📌 런타임과 컴파일
📍 컴파일 타임 : 소스코드가 기계어로 변환되어 실행가능한 프로그램이 되는 과정
-> Syntax Error, 파일 참조 오류, 타입 체크 오류 등
📍 런타임 : 컴파일 이후 실제로 프로그램이 실행되는 때
-> Null 참조 오류, 메모리 부족 오류
4. PC Register
- 스레드가 생성될 때마다 생성되며 현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역
- 하나의 메소드 코드를 JVM의 쓰레드라고 하며, 쓰레드가 실행되면 이 메소드가 실행된다.
- 현재 실행된 쓰레드의 메소드가 네이티브 메소드가 아니면 PC Resiter에 JVM 명령 주소가 저장된다.
- 만약 실행 중인 쓰레드의 메소드가 네이티브 메소드면 바이트 코드의 명령어가 없기 때문에 PC Register가 비어있거나 정의되지 않는다.
- 이를 통해 스레드를 돌아가면서 수행할 수 있게 한다.
📌 멀티스레드 vs 멀티 프로세스
📍 멀티스레드
스택 영역을 스레드 개수만큼 분할해서 쓰는 것이다.
각 스레드는 힙영역, 클래스 영역 등 공유 데이터를 함께 사용한다.
장점
- 시스템 자원소모 감소 (자원의 효율성 증대)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다.
- 시스템 처리율 향상 (처리비용 감소)
- 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
- 스레드 사이 작업량이 작아 Context Switching이 빠르다. (캐시 메모리를 비울 필요가 없다.)
- 간단한 통신 방법으로 프로그램 응답시간 단축
- 스레드는 프로세스 내 스택영역을 제외한 메모리 영역을 공유하기에 통신 비용이 적다.
- 힙 영역을 공유하므로 데이터를 주고 받을 수 있다.
문제점
- 자원을 공유하기에 동기화 문제가 발생할 수 있다. (병목현상, 데드락 등)
- 주의 깊은 설계가 필요하고 디버깅이 어렵다. (불필요 부분까지 동기화하면, 대기시간으로 인해 성능저하 발생)
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
📍 멀티 프로세스
다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조이다.
장점
- 독립된 구조로 안전성이 높은 장점이 있다.
- 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업속도가 느려지는 손해정도는 생기지만
정지되거나 하는 문제는 발생하지 않는다.
- 여러개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 - 프로세서(CPU)가 이를 공유하면 비용적으로 저렴하다.
문제점
- 독립된 메모리 영역이기 때문에 작업량이 많을수록( Context Switching이 자주 일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능저하가 발생 할 수 있다.
- Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드가 발생한다.
Context Switching
- CPU는 한번에 하나의 프로세스만 실행 가능하다.
- CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 Context Switching라 한다.
- 구체적으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
5. Natice Method Stack (JNI - Java Naming Interface)
자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 코드를 실행할 때, Native Method Stack이 할당되며, 일반적인 C 스택을 사용한다.
'STUDY > 서버' 카테고리의 다른 글
[서버] CI/CD 그리고 Jenkins (젠킨스) (0) | 2022.02.21 |
---|---|
[TI/SPRING] IOC, DI 정의/ 장점 (0) | 2022.02.18 |
[TI/Spring] 스프링이란? EJB와 비교 (0) | 2022.02.17 |
백엔드 개발자 기술면접 질문 정리 (0) | 2022.01.27 |
[SERVER][SPRING] 검색하기 API (0) | 2022.01.21 |