JVM이란?
=> Java Virtual Machine의 약자. JAVA와 OS 사이에서 중개자 역할 및 JAVA가 OS에 구애받지 않고 프로그램 실행시킬 수 있도록 도와주는 역할. Garbage Collector를 사용하여 메모리 관리도 자동으로 수행하고, Stack 기반으로 동작함.
(참고: https://steady-coding.tistory.com/305)
JVM은 크게 4가지 영역으로 나눌 수 있다.
1. Class Loader
=> .java 소스 파일을 JAVA Compiler를 통해 .class 파일로 생성됨.
Class Loader는 이렇게 생성된 Class 파일들을 엮어서 OS가 JVM으로 할당해준 Memory 영역인 (Runtime Data
Area)로 적재하는 역할을 함.
2. Execution Engine
=> Execution Engine은 Class Loader에 저장된 Class (Byte Code)를 명령어 단위로 분류 및 하나씩 실행하게 하는 엔진
3. Garbage Collector
=> GC는 Heap Memory 영역에 생성된 객체들 중, 참조되지 않은 객체들을 탐색 후 제거하는 역할.
4. Runtime Data Area
=> JVM 메모리 영역이며, JAVA Application을 실행할 때 사용되는 Data를 적재하는 영역.
크게 5가지 영역으로 나눌 수 있음.
1. Method Area : Class, 전역변수, Static 변수 정보가 저장됨. 모든 thread에서 정보 공유.
2. Heap Area : new 연산자 객체, 동적으로 생성된 데이터 (ex> Array)가 저장됨.
3. Stack Area : 지역변수, 매개변수 등 잠시 사용되고 나서 필요 없어지는 데이터가 저장됨.
4. PC Register : 현재 실행되는 thread의 주소와 명령 저장됨.
5. Native Method Stack : JAVA 외 언어로 작성된 코드를 위한 메모리 영역.
-----------------------------------------------------------------------------------------------------------------------------------
Heap Memory
Runtime Data Area 중 Heap Area는 GC의 주요 대상이기에 좀 더 중요하다고 볼 수 있다.
Heap Area는 크게 eden / survivor0 / survivor1 / old / permanent 5개 영역으로 나누어짐.
이 중, eden, survivor0&1 는 Minor GC, 그 외는 Major GC로 나뉨.
Minor GC란 New 영역에서 일어나는 GC이다.
최초의 객체는 Eden 영역에서 생성이되며, 이 영역이 꽉 차게 되면 첫 번째 GC가 일어난다. 그럴때 Survivor 0 영역에 Eden영역을 복사하게 되고, 0 마저 가득 차면 참조되는 객체만 Survivor1 영역에 복사됨.
위 과정 중 일정 횟수 이상 참조되는 객체들은 Survivor2에서 Old 영역으로 이동되며, Survivor2 영역이 차기 전까지 계속해서 Old로 비움.
Major GC란 Old 영역에서 일어나는 GC이다.
Old 영역에 있는 모든 객체들을 검사하고, 참조되지 않은 객체들을 모아 한 번에 제거함. 단 이는 Minor GC보다 시간이 훨씬 많이 소요되며, 실행 중 GC를 제외한 모든 thread 중지됨.
참고로 JDK7까지는 permanent영역 (PermGen)이 heap에 존재했으나, JDK8부터는 permanent 영역이 사라지고 Meta Space로 변경 & native stack 영역에 포함됨.
(참고 : https://jeong-pro.tistory.com/148)
============================================================================
JVM Option (Memory에 관련된)
1. -Xms, -Xmx : 각각 JVM 시작 시의 heap size, 최대 heap size. 2개의 값을 동일하게 셋팅하는 것이 추천됨.
2. NewSize : Heap Area 중 Minor GC 영역에 대한 메모리 설정.
3. MetaspaceSize : MetaSpace에 관련된 메모리 설정. JDK7을 사용한 WebLogic의 경우
(-XX:MaxPermSize=???m -XX:PermSize=???m) 사용
'JAVA > JAVA' 카테고리의 다른 글
AlwaysPreTouch JVM option (0) | 2022.05.18 |
---|---|
ClassLoader (0) | 2022.05.10 |
Thread dump (0) | 2022.03.25 |
Virtual Host (0) | 2022.03.15 |
JAVA option - urandom option (0) | 2022.01.24 |