강의를 듣다가 정리를 하는게 좋다고 생각해서! JVM Memory는 무엇인가에 대해 글을 쓴다라리
JVM 이란?
- 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체!
- CPU나 운영체제의 종류와 무관하게 실행이 가능함!
- JVM의 구성
- Class Loader
- Execution Engine
- Grabage Collector
- Runtime Data Area
Class Loader
- 변환된 Byte code(.class) 파일을 JVM 내로 class를 로드하고 Link작업을 통해 배치 등 일련의 작업을 한다! 또 런타임시 class를 load 한다!
Execution Engine
- class loader를 통해 JVM 내부로 넘어와 Runtime Data Area (JVM 메모리)에 배치된 Byte code들을 명령어 단위로 실행시킴!
Garbage Collector
- 어플리케이션이 생성한 객체의 생존 여부를 판단하며, 더이상 참조되지 않거나 null 인 객체의 메모리를 해체시켜 메모리 반납을 한다.
- Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
- GC가 역할을 하는 시간은 정확히 언제인지 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않음!)
- GC가 수행되는 동안 GC를 수향하는 쓰레드가 아닌 다른 모든 쓰레드가 일시정지된다. 특히 Full GC가 일어나서 수 초간 모든 쓰레드가 정지한다면 장애로 이어지는 치명적인 문제가 생길 수 있는 것이다!!
Runtime Data Areas(JVM 메모리)
- JVM 메모리로 Java 어플리케이션이 싱행하면서 할당받은 메모리 영역이다.
- Method,Runtime, Constant Pool, Heap, Stack, PC Register, Native Method Stack)의 영역으로 나뉨!
Method area (static) (모든 스레드에서 공유)
[사용기간]
JVM 시작시 생성
프로그램 종료 시까지 명시적으로 null 선언시 GC대상
구성방식이나 GC방법은 JVM 벤더마다 약간 다를 수 있음
- 클래스 맴버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보와 같은 메소드 정보, Type정보(Interface 인지 class 인지), Constant Pool(상수 풀: 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final class 변수등이 생성되는 영역이다!
Heap area (모든 스레드에서 공유)
[사용기간]
객체가 더 이상 쓰지 않거나, 명시적으로 null 선언시 GC대상
구성방식이나 GC 방법은 JVM 벤더마다 다를 수 있음
- new 키워드로 생성된 객체와 배열이 생성되는 영역이다!
- 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다!
- Young Generation: 객체가 생성될 때 저장된다. 막 생성된 객체들의 인큐베이터이다!(오~ 아주 재밌는 표현) 생성된 기간이 흐르고, 우선 순위가 낮아지면 Young 세대의 객체들은 Old세대로 이동하게 된다. 이 영역에서 객체가 사라질 때는 Minor GC가 수행된다.
- Old(Tenured) Generation: Young Generation 영역에 있는 객체가 오래되서 저장되는 공간이다. 이 영역에서 객체가 사라질 때는 Major GC(Full GC)가 수행된다.
- Permanent Gerneration: 클래스 로더에 의해 로드 되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역으로 JVM 리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다.
- 더 자세한 것은 https://jeong-pro.tistory.com/148 참조!
Stack area (각 스레드별로 생성)
[사용기간]
{}나 메서드가 끝날때
- 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다!
- [Call by value] int a = 10; 이라는 코드를 작성했다면 정수값이 할당될 수 있는 메모리 공간을 a(변수이름)라고 잡아두고 그 메모리 영역에 값이 10이 들어간다! 즉, stack에 메모리에 이름이 a라고 붙여주고 값이 10인 메모리 공간을 만든다!
- [Call by reference] Lima l = new Lima(); 라는 소스를 작성했다면 Lima l은 stack 영역에 생성되고 new로 생성된 Lima 클래스의 인스턴스는 Heap 영역에 생성된다.
- stack영역에 생성된 l의 값으로 heap영역의 주소값을 가지고있다. stack 영역에 생성된 l이 heap영역에 생성된 객체를 참조하고 있는 것이다.
- 메소드를 호출할 때마다 개별적으로 stack이 생성된다!
PC register (각 스레드별로 생성)
- Thread가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다(cpu의 레지스터와 다르다!)
Native method stack (각 스레드별로 생성)
[사용 기간]
native interface 호출시 생성
native interface 종료시 생성
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다!
- 보통 C/C++ 등의 코드를 수행하기 위한 스택 이라고 한다!
오늘은 JVM 구조에 대해서 알아보았따!
이제 그만 알아보자!
자바와 JVM 메모리 구조
JVM (Java Virtual Machine)과 메모리 할당
velog.io
https://limkydev.tistory.com/51
[Java] JVM 메모리 구조
오늘은 자바 JVM의 메모리에 대해서 알아보도록 하겠다. 사실 JVM 메모리에 대해서 왜 알아야할까? 스스로 자문했을 때 메모리 관리정도?라고 답변을 했다. 소규모프로젝트나 간단한프로그램을
limkydev.tistory.com
https://jeong-pro.tistory.com/148
JVM 구조와 자바 런타임 메모리 구조 (자바 애플리케이션이 실행될 때 JVM에서 일어나는 일, 과정
JVM(Java Virtual Machine) : 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다. CPU나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다. 즉, 운영체제 위에서 동작하는 프로세스로 자
jeong-pro.tistory.com
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은
내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > Java' 카테고리의 다른 글
[JAVA] LinkedList 알꺼같으면서도 모르겠다. (0) | 2024.12.23 |
---|---|
[JAVA] 타입 캐스팅 시 발생하는 오버플로우? (0) | 2024.12.22 |
[Spring] @RestController @Controller 차이가뭐야?? (0) | 2022.01.29 |
[Spring] Hidden Method (0) | 2021.11.23 |
[Spring] DI (Dependency Injection) (0) | 2021.11.11 |
댓글