JVM(Java Virtual Machine)
- 컴파일된 *.class 파일을 읽어 실행하고 운영체제의 메모리 영역에 접근하여 메모리 관리(GC) 수행하는 프로그램
- JDK > JRE > JVM ( JDK 안에 JRE와 JVM이 포함되어 있음 )
- 운영체제에 맞는 JVM 설치만 하면 자바 프로그램 실행 가능
JVM 구조
- Class Loader
생성된 class 파일을 Runtime Data Area에 적재하는 역할
- Execution Engine
메모리에 적재된 클래스를 기계어로 변경해 명령어 단위로 실행하는 역할(인터프리터, JIT방식)
- G.C(Garbage Collection)
heap 메모리 영역에 생성된 객체 중 reachability를 잃은 객체를 탐색 후 제거함
- Runtime Data Area
[Thread 공통 사용 영역]
① Heap ( GC 대상 )
- 어플리케이션 실행시 동적 생성된 객체 인스턴스를 저장하는 영역
- Thread 공유 영역으로 동기화 문제 발생가능 ( immutable 객체 사용권장 )
② Method Area ( root space )
- Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타 데이터 정보가 저장됨
- 해당 영역에 등록된 class만이 heap에 생성가능
- 논리적으로 Heap 영역에 포함되어 PermGem 영역에 속했으나, Java8 이후 Metaspace라는 OS관리 영역으로 옮김
[Thread 별 생성 영역]
③ JVM Language Stack ( root space )
- 메서드 호출시 stack frame 이라는 블록으로 쌓으며, 로컬변수, 중간 연산 결과 등이 저장되는 영역
- 메서드 호출 종료시 stack에서 제거
④ Native Method Stack ( root space )
- Java 외의 언어로 작성된 native code를 위한 stack
- low level(C/C++) 코드를 실행하는 영역
⑤ PC Register
- 스레드가 현재 실행할 스택 프레임의 주소를 저장함(가르킴)
Runtime Data Area
- 스레드 별로 JVM Language Stack, Native Method Stack, PC Register 를 개별 할당
- 스레드 공통으로 Heap, Method Area 사용
Garbage Collection (GC)
- JVM이 heap영역에서 사용하지 않는 객체를 삭제하는 프로세스
- 프로그램이 동적으로 할당했던 메모리 영역(Heap) 중 필요 없게 된 영역을 찾아 해제한다
장점 | 단점 |
- 메모리 누수 막음 - 해제된 메모리에 접근 차단 - 해제한 메모리에 대한 이중 해제 차단 |
- GC 작업은 순수 오버헤드 - 개발자는 언제 GC가 메모리를 해제하는지 알 수 없다 |
GC - Mark & Sweep 방식
① GC 가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹(Mark)
② Reachable Object가 참조하고 있는 객체도 찾아서 마킹(Mark)
③ 마킹되지 않는 객체를 Heap에서 제거(sweep)
Heap 구조와 GC
Young Generation | 새로운 객체들이 할당되는 영역(Eden, Survivor0/1로 구성) |
Old Generation | Young Generation영역에서 오랫동안 살아남은 객체들이 존재하는 영역 |
Meta Space | GC에 필요한 클래스와 메소드의 요약 정보가 존재하는 영역 |
① 인스턴스화된 객체들이 Heap 의 Eden 영역에 저장
② Eden 영역을 다 채우면 Minor GC 발생
③ root space를 기준으로 Heap 영역에 reachable/unreachable 객체 구분하여 Mark & Sweep
④ 살아남은 객체는 Survior0 으로 이동 ( 이때, 객체의 age-bit 증가 )
⑤ ①~③ 반복 후 Survior1로 살아남은 객체 이동 ( 특징. Survior0/1중 하나는 비워져 있어야 함 )
⑥ ①~⑤ 반복 후 Age-bit가 기준치가 되면 Old Generation영역으로 Promotion(이동,승진)함
⑦ Old Generation 영역이 다 찰 경우 Major GC 실행
참고
https://d2.naver.com/helloworld/1329
https://d2.naver.com/helloworld/329631
https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management
https://velog.io/@litien/JVM-%EA%B5%AC%EC%A1%B0
https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/
https://jithub.tistory.com/40
'공부 > Spring' 카테고리의 다른 글
[에러] java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException (0) | 2022.03.06 |
---|---|
[Spring] javax.servlet.ServletException: Circular view path ..에러 (0) | 2022.01.07 |
[Spring] Http Request에 대한 DispatcherServlet 동작과정 (0) | 2021.11.13 |
[gradle] General error during semantic analysis: Unsupported class file major version 60 에러 (0) | 2021.10.11 |
[Java] toString() - 객체에 정의시 출력문에서 자동 호출되는 함수 (0) | 2021.10.06 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!