일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Spring boot
- DNS
- 국비지원교육
- 패스트캠퍼스
- k8s
- RDB
- MariaDB
- 내일배움카드
- PV
- linux dns
- ARP
- MegabyteSchool
- reclaim
- L2 통작
- CoreDNS
- linux domain
- 개발자취업부트캠프
- dns forward
- L2 통신
- 메가바이트스쿨
- PVC
- Layer 2
- 127.0.0.53
- ssh tunneling
- systemd-resolved
- Today
- Total
hoonii2
[Java] 03. JVM 메모리 구조 본문
1. JVM 메모리 구조
- JVM 은 heap 에 여러 runtime data area 를 만든다.
- 이 영역은 프로그램 실행동안 사용한다.
- memory 영역은 JVM 종료 시 사라지지만, data 영역은 thread 종료 시 사라진다.
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 |