개요
Check
-
- JVM의 용어와 개념은 알고 있었지만 메모리구조, 작동방식에 대해 거의 무지한 상태 > 잘못된 코드를 작성하여 문제 발생 ↑
- Java application을 실행하는데 힙 메모리가 부족했던 경험 > 대처 부족
Java로 개발을 하는데 JVM에 대한 지식이 없다는 것은
"요리를 하는데 요리법을 제대로 숙지하지 못한 상태에서 요리를 하는 것이다. "
JVM에 대한 지식을 가지고 더 나은 개발을 해 나가기 위해 알아보았다.
JVM(Java Virtual Machine)이란?
JVM은 자바가상머신이라 불리며, 자바 바이트코드를 실행 할 수 있는 주체이며, 각종 운영체제에 구애받지 않고
프로그램을 실행할 수 있게 해준다. 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 API와 함께 실행하는 역할을 수행
(가비지 컬렉션을 이용한 메모리 관리 수행, 일반적으로 우리가 사용하는 것은 스택기반에서 동작)
JAVAC(JavaCompier)가 .java로 작성된 파일을 .class라는 바이트코드의 클래스 파일로 변환 변환된 클래스파일이
JVM을 통해 각 OS에서 실행됨
같은 ByteCode를 가지고 이기종 플랫폼에서도 실행이 가능하도록 설계되어 서로 다른 OS에서도 실행이
가능하나 JVM을 OS에 맞게 설치해야 하는 운영체제의 종속성이 있다.
JVM 구성
위에서는 전체적인 설명이였다면 지금부터는 JVM 구성에 대해 간략하게 알아보겠습니다.
구성 ( 자바 실행 과정 사진 속 빨간 박스에 해당)
JVM은 Class Loader, Runtime Data Areas, Execution Engine 크게 이 3가지로 구성되어있다.
1. Class Loader(클래스 로더)
JVM으로 동적로딩을 하는 자바 런타임 환경의 일부이며 말 그대로 .class 파일을 찾아 읽어드려 JVM환경에 올려 놓는 역할을 한다.
로딩 -> 링크 -> 초기화 순으로 진행
로드에 실패할 경우 ClassNotFoundException 에러가 난다.
[다음번 포스트에 더 자세히 다뤄 링크를 걸 예정.]
2. Runtime Data Areas(런타임 데이터 영역)
JVM 메모리 영역으로 자바 애플리케이션을 실행 할 때 사용되는 메모리 영역이다 크게 5영역으로 나뉨
- 메소드 영역(Method (static) Area)
└ 모든 스레드가 공유하는 메모리 영역, 클래스를 위한 공간
JVM에서 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 메서드와 필드 Static변수, 메서드 바이트 코드 를 보관 (필드정보, 메소드 정보, 타입정보가 함께 담김)
컴파일된 바이트코드의 대부분이 메소드형태이므로 대부분의 바이트 코드가 적재 된다고 봐도 무방하다.
미리 로드되어 호출 시간이 적지만 할당받는 메모리가 한정되어 static을 함부로 사용하면 안된다.
Runtime Constant Pool이라는 별도 영역이 존재하는데 이 영역은 static자료형을 저장하고 참조하여
중복을 막는 역할을 한다.
Garbage Collector 대상 - 힙 영역(Heap Area)
└ 메소드 영역과 동일하게 모든 스레드가 공유하는 메모리 영역, 객체를 위한 공간
런타임시 동적으로 할당하여 사용하며 New 연산자를 통해 생성한 객체 또는 인스턴스와 배열(Reference Type) 을 저장하는 가상메모리 공간으로 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서
참조한다. 힙은 크게 3영역 Young Generation, Tenured Generation, Permanent 으로 나뉜다.
Garbage Collector 대상
Heap영역 - 스택 영역(Stack Area)
└ FILO(First in Last Out) 선입후출의 Stack 구조로 메서드 호출 시 생성되는 스레드 수행 정보를 기록하는 Frame 저장 메서드 정보, 지역변수(Primitive type), 매개변수, 연산 중 발생하는 임시 데이터를 저장한다.
메서드 호출시에 Frame을 추가(push)하고 메서드가 종료되면 제거(pop)되는 특성이 있다.
각 스레드 별로 생성 - PC 레지스터(PC Register)
└ 현재 실행중인 JVM 주소를 가지며 CPU 명령어 Instruction을 수행
CPU Instruction을 수행하는 동안 필요한 정보를 CPU내 기억장치인 레지스터에 저장하고 연산 결과 값을
메모리에 전달하기 전 CPU내 기억장치
각 스레드 별로 생성 - Native Method Stack
└ 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 C / C++ 등의 코드를 수행하기 위한 스택
Native 메서드의 매개변수, 지역변수 등을 바이트 코드로 저장
각 스레드 별로 생성
3. Execution Engine(실행 엔진)
클래스로더를 통해 런타임 데이터 영역에 할당된 바이트코드를 명령어 단위로 읽어 실행
그 후 기계가 읽을 수 있는 코드로 Interpreter 와 JIT Compiler가 변경을 해준다.
그 이유는 CPU가 Java 바이트 코드를 실행할 수 없기 때문
GarbageCollection은 참조되지 않은 개체를 수집하고 제거하여 메모리를 확보해준다.
참조되지 않은 객체들을 탐색 후 삭제 -> 삭제된 객체의 메모리 반환 -> 힙 메모리 재사용
세가지 하위 구성요소로 Interpreter, JIT(Just In Time) Compiler, Garbage Collection 구성됨
[다음번 포스트에 더 자세히 다뤄 링크를 걸 예정.]
JVM에 대해 알아보았는데 내용이 생각보다 방대해서
다음 포스팅에 추가로 구성별로 더 자세하게 예제를 들어 포스팅을 할 예정입니다.
그리고 자바 실행시 메모리 할당 방법에 대해 알아볼 예정입니다.
참조
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0
자바 가상 머신 - 위키백과, 우리 모두의 백과사전
자바 가상 머신 사양의 자바 SE 7 에디션에 기반을 둔 자바 가상 머신(JVM) 아키텍처의 개요도. 자바 가상 머신(영어: Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으
ko.wikipedia.org
https://www.javacodegeeks.com/2018/04/jvm-architecture-execution-engine-in-jvm.html
JVM Architecture: Execution Engine in JVM - Java Code Geeks - 2022
Hello readers, this tutorial will help developers to correctly understand the Execution Engine in Java Virtual Machine.
www.javacodegeeks.com
https://hoonmaro.tistory.com/19
마로의 Java(자바) 정리 - 8. 자바 메모리 구조
JVM 구조 실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행 메소드와 클래스변수들을 해당 메모리 영역애 배치 클래스로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조
hoonmaro.tistory.com
https://catch-me-java.tistory.com/12
[Java-4] JVM의 구조
전 글에서는 JVM에 대해서 간단하게 알아 보았다. 이제 JVM 구조에 대해서 알아보고 JRE와 JDK 에 대해서 알아보도록 하자. 1. JVM 구조 JVM 의 구성요소는 크게 3가지로 구성 되어있다. 클래스 로더 시
catch-me-java.tistory.com
https://93jpark.tistory.com/58?category=898428
[Java] JVM 아키텍처(3) - 실행 엔진 Execution Engine
이전 글에서는 클래스로더와 런타임 데이터 영역에 대해 알아보았다. 이번에는 JVM의 코드를 실행시키는 실행엔진에 대해 알아보자. JVM 실행 엔진(Execution Engine) Execution Engine은 실제로 클래스파
93jpark.tistory.com
'📚Language > JAVA' 카테고리의 다른 글
[ERROR] java Runtime (class file version 59.0), this version of the Java Runtime only recognizes class file versions up to 52.0 해결 (0) | 2021.12.05 |
---|---|
[JAVA]배열의 오름차순, 내림차순 정렬 (int, String) (0) | 2021.07.07 |