hoonii2

[Java] 03. JVM 메모리 구조 본문

개념 공부/(개발) 01. Java

[Java] 03. JVM 메모리 구조

hoonii2 2022. 10. 7. 17:14

1. JVM 메모리 구조

 - JVM 은 heap 에 여러 runtime data area 를 만든다.

 - 이 영역은 프로그램 실행동안 사용한다.

 - memory 영역은 JVM 종료 시 사라지지만, data 영역은 thread 종료 시 사라진다.

https://www.javatpoint.com/memory-management-in-java

1-1. Method 영역

 - method 영역은 모든 thread 가 공유하는 heap 메모리의 일부분이다.

 - 이는 JVM 시작 시 생성되며, 'class 구조' / 'superclass 이름' / 'interface 이름' / 'constructors' 를 저장하는데 사용된다.

 - JVM 은 아래 종류의 정보를 method 영역에 저장한다.

  1) type 의 Fully qualifed name ( ex, String )

  2) type's modifiers

  3) type's direct superclass name

  4) A structured list of the fully qualified names of super interfaces.

 

1-2. Heap 영역

 - Heap 은 실제 object 를 저장한다.

 - 이는 JVM 시작 시 생성된다.

 - 사용자가 필요 시 heap 을 제어할 수 있으며, 이는 동적 크기를 수정할 수 있다.

 - 'new' 키워드를 사용 시, JVM 은 heap 에 object 에 대한 instance 를 생성한다.

 - 해당 object 참조가 stack 에 저장되는 동안, 실행중인 각 JVM 프로세스에 하나의 heap 만 존재한다.

 - heap 이 가득차면 garbage collect 된다.

  1) 예, StringBuilder sb = new StringBuilder();

   - 위 예제는 StringBuilder class object 를 생성하며, 이는 heap 에 할당되고 참조되는 sb 는 stack 에 할당된다.

   - heap 은 아래 부분으로 분리된다.

    1) Young generation

    2) Survivor space

    3) Old generation

    4) Permanent generation

    5) Code Cache

 

1-3. Reference Type

 - 'Strong' / 'Weak' / 'Soft' / 'Phantom reference' 로 4가지 타입의 reference type 이 있다.

 - heap 에 있는 object 는 해당 type 에 따라 서로 다른 적합한 garbage collecting 조건에 맞춰 동작한다.

  1) Strong Reference (기본)

   - 강한 참조는 garbage collect 에 적용되지 않는다.

   - 사용 예) StringBuilder sb = new StringBuilder();

  2) Weak Reference

   - 다음 garbage collection 프로세스에서 지워진다, 만약 지워진 후 참조할 경우 null 값이 return 될 것이다.

   - 사용 예) WeakReference<StringBuilder> reference = new WeakReference<>(new StringBuilder());

  3) Soft Reference

   - Application 이 적은 memory 에서 실행되는 경우 수집된다.

   - 이는 'OutOfMemoryError' 가 발생하기 전에 garbage collector 에 수집된다.

   - 사용 예) SoftReference<StringBuilder> reference = new SoftReference<>(new StringBuilder());

  4) Phantom Reference

   - garbage collector 가 원할 때 해당 reference 를 사용하는 object 를 수집한다.

   - 사용 예) PhantomReference<StringBuilder> reference = new PhantomReference<>(new StringBuilder());

 

1-4 Stack Area

 - Thread 생성 시 Stack Area 가 생성되며, 각 Stack 크기는 고정되거나 동적 크기로 구성된다.

 - 즉, Stack memory 는 thread 마다 할당된다.

 - Stack memory 는 data 와 일부 결과값을 저장하는데 사용된다. 이는 heap object 에 참조 값도 포함되며, heap 참조 값이 아닌 값 자체를 저장할 수 있다.

 - Stack 에 저장된 변수는 scope 라고 불리는 특정 가시성을 갖게된다.

  1) Stack Frame

   : Stack Frame 은 Thread data 를 구성하는 data 구조이며, Thread data 는 현재 method 안에 thread 의 상태를 나타낸다.

   - 부분 결과 및 데이터를 저장하는데 사용된다.

   - 어떤 시점에서든 thread 제어를 위한 frame 은 오직 하나만 활성화가 되며, 이 frame 은 current frame 이라 불리고, 이 frame 의 method 는 current method, 해당 method 의 class 는 current class 라고 불린다.

   - Frame 의 Method 가 다른 Method 를 호출하거나 Method 가 종료되면 Frame 은 현재 Method 를 중지한다.

   - 다른 method 호출 시 새로운 frame 이 생성되며, method 가 종료되면 frame 도 사라진다.

   - Thread 에 의해 생성된 Frame 은 해당 Thread 에 대한 로컬 전용이며, 다른 Thread 에서 참조할 수 없다.

   - 각 frame 에는 자체 LVA (Local Variable Array) , OS (Operator Stack) , FD (Frame Data) 가 포함된다.

   - 위 LVA , OS , FD 의 크기는 컴파일 시 결정된다.

 

1-5 Native Method Stack

 - C Stack 이라고도 불리며, Java 외의 언어로 작성된 Native Code 의 스택이다. JNI (Java Native Interface) 는 기본 스택을 호출하며, Native Stack 의 성능은 OS 에 따라 다르다.

 

1-6. PC Register

 - 각 Thread 에는 PC (Program Counter) Register 가 있다.

 - 이는 반환 주소나 기본 포인터를 저장하며, 현재 실행중인 JVM 명령어의 주소도 포함된다.

'개념 공부 > (개발) 01. Java' 카테고리의 다른 글

[Java] 06. Local Class / Anonymous Class  (0) 2022.12.02
[Java] 05. Interface  (0) 2022.11.25
[Java] 04. Primitive/Reference Data Type, Wrapper Class  (0) 2022.11.18
[Java] 02. JVM 컴파일  (0) 2022.09.30
[Java] 01. JAVA 기초  (1) 2022.09.23
Comments