포도가게의 개발일지
[Java] JVM과 자바 메모리 구조 본문
JVM
- Java의 가장 큰 장점은 OS에 종속적이지 않고 Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행 할 수 있다는 것이다. JVM이란 Java Virtual Machine, 자바 가상머신의 약자이다. JVM은 Java Byte Code를 OS에 맞게 해석 해주기 때문에 자바는 운영체제와 독립적으로 동작이 가능하다.
- JVM은 크게 Garbage collector, Execution Engine, Class Loader, Runtime Data Area 4가지 영역으로 나누어집니다.
1. Garbage collector(GC)
Runtime Data Area 중 Heap영역에 더 이상 사용하지 않고 자리만 차지하고 있는 객체들을 제거하는 역할을 합니다. 자동으로 실행되기 때문에 언제 정확히 언제 실행되는지 알기 어렵고 사용자가 임의로 GC를 발생시키는 것은 좋은 발상이 아니기에 JVM에 맡기는 것이 좋습니다. 기본적인 특징은 GC가 수행되는 동안 GC를 실행하는 쓰레드 외 모든 쓰레드가 일시정지 됩니다.
2. Class Loader
.java파일은 컴파일러(javac)에 의해 .class파일 즉 JAVA Byte Code(바이트코드) 로 컴파일되고, 이렇게 컴파일된 바이트코드들을 Class Loader가 운영체제에 의해 메모리를 할당 받은 Runtime Data Area으로 적재하는 역할을 합니다.
3. Execution Engine
Class Loader에 의해 Runtime Data Area에 적제된 .class파일들을 하나의 명령단위로 읽어서 컴퓨터가 이해할 수 있는 기계어로 번역하고 명령을 실행합니다. Interperter방식과 JIT(Just-In-Time) 방식이 존재하고 추후 포스트에 자세히 다루어 보겠습니다.
4. Runtime Data Area
JVM메모리 영역으로 OS로부터 별도로 메모리 공간을 할당받고 JAVA 어플리케이션을 실행할 때 사용됩니다. Method Area, Heap Area, Stack Area, PC register, Native Method Stack 총 5가지로 구분됩니다.
Method Area(Static Area) 는 java 어플리케이션이 실행되면 Class Loader가 적재한 클래스(또는 인터페이스)에 대한 바이트 코드가 저장된다. 예를 들어 Math.abs(-10) 같이 Math 클래스의 메서드를 초기화 없이 바로 사용할 수 있는것은 해당 영역에 덕분입니다.
Heap Area은 JVM이 관리하는 프로그램에서 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용하는 영역. 해당 영역에서 생성된 객체들은 다음에 나올 JVM Stack Area의 변수나 다른 객체의 필드에서 참조 가능합니다. 때문에 해당 객체를 참조하지 않으면 더는 쓸모가 없어 Garbage Collector에 의해 객체가 Heap 영역에서 제거됩니다.
GC(번외)
- new를 통해 객체가 생성되면 Eden영역에 생성됩니다. new를 통해 다양한 객체가 생성 중 만약 Eden 영역이 가득 차게 된다면 첫 minor GC가 일어납니다. Eden에서 참조되지 않은 객체를 제거하고 참조가 유지되는 객체를 Survivor 1영역/Survivor 2영역으로 이동시킵니다. Old 영역은 새로 Heap에 할당된 Object가 들어오는 것이 아닌, Survivor 영역에서 살아남아 오랫동안 참조되었고 앞으로도 사용될 확률이 높은 Object들을 저장하는 영역이다. Major GC는 Old 영역에 있는 모든 객체를 검사하고 참조되고 있는지 확인 후 참조되지 않은 객체들을 모아 한번에 제거하는 것을 말합니다. 이를 Full GC라고도 하며 Full GC는 GC를 제외한 모든 쓰레드가 중지되어야 합니다.
Stack Area은 스레드마다 하나씩 존재(공유X)하며 쓰레드가 시작될 때 할당됩니다. 내부에는 매소드에서 직접 사용할 지역 변수, 파라미터, 리턴 값, 참조 변수일 경우 주소 값 들이 저장됩니다. 만약 프로그램에서 매소드가 호출되면 매소드와 매소드 정보는 차곡차곡 Stack에 쌓이면서(PUSH) 내부 과정을 실행합니다. 매소드 호출이 종료되면 해당 매소드는 Stack Area에서 제거(POP) 됩니다.
PC register은 Thread가 생성될 때마다 생성되는 영역으로 Program counter 즉 현재 쓰레드가 실행되는 부분의 주소와 해당 명령을 저장하고 있는 영역입니다. 이것을 이용해 다수의 쓰레드들이 명령의 흐름을 잃지 않고 함수가 순차적으로 실행됩니다.
Native Method Stack은 자바 외 다른 언어로 작성된 네이티브 코드를 수행하기 위한 메모리 영역입니다. JAVA 이외의 다른 언어에서 제공되는 Method의 정보가 저장됩니다.
https://honbabzone.com/java/java-jvm/
'Spring boot' 카테고리의 다른 글
Dependency Injection? IoC? (0) | 2022.01.31 |
---|---|
[Spring] java.lang.IllegalStateException: Failed to load ApplicationContext (0) | 2022.01.21 |
[JAVA] Generic (0) | 2022.01.21 |
[Spring]Transaction? (0) | 2022.01.20 |
[JAVA] Annotation? (0) | 2022.01.20 |