isoomni
디벨로폴리
isoomni
전체 방문자
오늘
어제
  • Category (47)
    • 취업 (0)
    • 대외활동 (4)
    • 알고리즘 (16)
      • 알고리즘 (11)
      • 코딩테스트 (3)
    • STUDY (15)
      • 서버 (9)
      • 안드로이드 (2)
      • 기타 (4)
    • LANGUAGE (9)
      • Java (9)
      • C (0)

블로그 메뉴

  • 홈
  • 글쓰기
  • 관리

공지사항

인기 글

태그

  • 알기쉬운 알고리즘
  • 라이징캠프후기
  • Unmanaged
  • 너도개발자할수있어
  • 컴공선배후기
  • Layout 바꾸기
  • Unmanaged Language
  • 기술인터뷰
  • Tech Interview
  • 자바
  • Quick DBD
  • 라이징캠프
  • 라이징프로그래머
  • Java
  • Managed Language
  • 컴공선배
  • 질문
  • 서버
  • AWS 서버 구축
  • 기술면접

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
isoomni

디벨로폴리

[JAVA] JVM 구조 총정리
STUDY/서버

[JAVA] JVM 구조 총정리

2022. 9. 4. 21:23

🔓 모든 스레드가 공유하는 데이터 영역

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
    'STUDY/서버' 카테고리의 다른 글
    • [서버] CI/CD 그리고 Jenkins (젠킨스)
    • [TI/SPRING] IOC, DI 정의/ 장점
    • [TI/Spring] 스프링이란? EJB와 비교
    • 백엔드 개발자 기술면접 질문 정리
    isoomni
    isoomni
    개발을 공부하고 일상을 기록합니다.

    티스토리툴바