이지은님의 블로그
250110 - Java 개념과 실행 환경 (JVM 구조, 메모리 영역, JRE, JDK) 본문
▷ 코드 문제풀이
[JAVA] 코드카타 - (21)~(25)
문제 (21) : 하샤드 수양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연
queenriwon3.tistory.com
[JAVA] 코드카타 - (26)~(30)
문제 (26) : 음양 더하기어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제
queenriwon3.tistory.com
[JAVA] 코드카타 - (31)~(35)
문제 (31) : 수박수박수박수박수박수?길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라
queenriwon3.tistory.com
▷ 오늘 배운 것
Java 종합반 1주차에서 배웠던 것의 심화과정을 공부해보려고 한다.
<<목차>>
1. Java에 대해
2. JVM(Java Virtual Machine, 자바가상머신)
3. JRE(Java Runtime Environment, 자바 실행 환경)과 JDK(Java Development Kit, 자바 개발 키트)
1. Java에 대해
자바의 핵심기능: C언어 기능 + 공통실행환경(JVM), 클래스, 객체
자바의 필요성
- Java는 공통실행환경(JVM)이 있어 여러기기에서 실행가능하다.
- 여러기기의 운영체제에서 실행할 수 있는 언어
- 앱(운영체제 위에서 실행되는 프로그램) 개발에 적합함
- 세상과 닮아있는 개발언어라 코드를 이해하기 쉽고 유지보수가 쉽다.
- 객체: 존재하는 물건
- 자바에서는 클래스를 통해 객체를 만듦
- 안정성이 높아서 프로그래밍 오류를 방지하고 보안상 안전
- Java언어로 작성된 문맥을 바이트 코드로 변환하는 변환기가 먼저 오류를 체크함
- 지원하는 보안기술이 많음
- 파이썬 등 간단한 개발언어도 있으나 이보다 안정성이 높음
- 대규모 앱 개발이 가능하다.
- 네트워크 및 데이터베이스 연결 및 통신 등의 작업을 처리하는 API제공
- 다양한 개발도구와 라이브러리를 사용가능(서드파티)
2. JVM(Java Virtual Machine, 자바 가상 머신)
가상의 기기를 만들어서 여러가지 기기 위에 Java프로그램을 실행시킬 수 있는 가상의 기기를 만들어준다. 따라서 어느 장비든 JVM을 설치할 수 있다면 Java 프로그램을 실행시킬 수 있다.
JVM 특징
- 컴파일된 바이트코드를 기계가 이해할 수 있는 기계어로 변환 (인터프리터, JIT 컴파일러)
- 스택기반의 가상머신 (PC register, JVM stack, Native Method stack)
- 메모리 관리와 Garbage collection(가비지 컬렉션)수행 (Heap)
JVM 실행 순서
- .java 파일을 컴파일러를 통해 .class파일로 변환 (Compile-time 환경)
- .class 파일을 Class Loader에게 보낸다. (Run-time 환경)
- ClassLoader에서 JVM런타임영역으로 할당하여 메모리에 올린다.
Hello.java -> 자바 컴파일러 -> hello.class(0과 1로된) -> JVM(클래스로더, 인터프리터,JIT 컴파일러) -> Devices
- Java Compiler(자바 컴파일러): 내가 작성한 Java코드(.java)를 운영체제가 읽을 수 있는 바이트 코드(.class)로 변환시켜주는 변환기, JVM에 포함되지 않음
👉 JVM 구조(간단히)
- Java Interpreter(인터프리터): java.class 코드 해석기
- JIT Compiler(JIT 컴파일러): 빠른 java.class 코드 해석기
- 메모리 영역: java 데이터를 저장하는 영역(운영체제로부터 JVM이 할당받은 메모리 영역)
(Static영역 + Stack영역 + Heap영역)
- Class Loader(클래스 로더): .class 바이트 코드를 메모리 영역으로 운반함(JVM으로 바이트 코드를 불러와서 메모리에 저장)
- Garbage Collector(가비지 컬렉터): java쓰레기 청소기. Heap영역 에서 안쓰는 데이터를 주기적으로 흡수하는 청소기
-
더 자세하게 설명하자면
JVM의 구조에는 1️⃣ Class Loader, 2️⃣ Execution Engine, 3️⃣ GC, 4️⃣Runtime data areas 로 나누어져 있다.
1️⃣ Class Loader: 클래스 파일을 Runtime Data Area의 메서드 영역으로 불러오는 역할
2️⃣ Execution Engine: .class파일과 같은 ByteCode를 실행가능하도록 해석한다.
3️⃣ GC(Garbage Collector): 메모리 관리 기법으로 메모리 영역중 Heap영역에 배치된 객체들을 관리한다.
4️⃣ Runtime Data Area: 런타임 시 클래스 데이터와 같은 메타 데이터와 실제 데이터가 저장되는 곳(프로그램을 수행하기 위해 OS로부터 할당받은 메모리 영역, Java메모리 공간)
Runtime Data Area는 또 다시 1️⃣ PC Register, 2️⃣ Native Method Stacks, 3️⃣ JVM Stack, 4️⃣ Heap, 5️⃣ Method Area로 나누어진다.
4-1) PC Register
- JVM은 스택기반의 가상머신. CPU에 직접 접근하지 않고 Stack에서 주소를 뽑아 가져온다. 이 가져온 주소를 저장하는 곳이다.
—> 현재 어떤 명령을 실행할지 기록(스택기반)
4-2) Native Method Stacks
- Java 이외의 언어에 제공되는 Method의 정보가 저장되는 공간 / Java Native Interface를 통해 바이트 코드로 저장
- 커널이 자체적으로 스택을 잡아 독자적으로 프로그램 실행
4-3) JVM Stacks (메모리 영역 - Stack 영역)
- 호출된 메서드의 기본자료형, 파라미터(매개변수), 지역변수, 리턴값 및 연산값 등이 저장되는 영역(임시적으로 사용되는 변수, 주소값 포함 크기가 정해져있는 기본형 변수)
- 객체 생성시 참조 주소값도 저장된다.(참조 자료형) -> Heap영역에 존재하는 인스턴스를 가르킴
- 프로그램 실행시 임시로 할당되었다가 메서드를 빠져나가게 되면 소멸되는 특성의 데이터 저장
- 메서드 호출시마다 스택에 각각 스택프레임이 생성되고 수행이 끝나면 해당 프레임 제거(LIFO, Last In First Out)
4-4) Heap (메모리 영역 - Heap 영역)
- 객체를 동적으로 생성시 인스턴스가 Heap영역의 메모리에 할당(new 키워드로 생성된 객체)(크기가 계속 늘어날 수 있음)
- 참조형 데이터의 객체에 실제 데이터들이 담기며 실제 데이터를 가지고 있는 Heap영역의 참조값을 Stack영역의 객체를 가진다.
- 어떤 참조 변수도 Heap영역에 있는 인스턴스를 참조하지 않으면, GC(가비지 컬렉터)가 처리한다.
- 멀티 스레드를 사용하더라도 Heap영역은 하나만 사용한다.
4-5) Method Area (메모리 영역 - Static 영역)
- 전역변수와 정적멤버변수, static으로 선언된 것이 저장된다.
- 클래스 정보의 초기화정보(필드/메서드(생성자)/타입정보 저장)
- Static영역은 컴파일 시간동안 할당된 메모리이며, 고정된 공간을 차지한다. 런타임중에는 값을 변경할 수 없다.
- Static 영역에 있는 것은 어디서든 접근이 가능하다. 그러므로 무분별한 사용은 메모리 부족을 일으킬 수 있다.
- JVM이 동작해서 클래스가 로딩될 때 생성되며, 프로그램 종료까지 남아있는다.
- 상수형을 저장하고 중복을 막는 Runtime Constant Pool존재
3. JRE(Java Runtime Environment, 자바 실행 환경)과 JDK(Java Development Kit, 자바 개발 키트)
JRE만 있다면 Java프로그램을 실행만 시킬 수 있다.(.class만 실행가능)
JDK 가 javac(자바 컴파일러) 명령을 통해 .java 파일을 실행 가능한 .class 파일로 변환
JDK는 JRE(JVM)포함하고 있음. 자바 개발 도구가 있어 코드를 디버깅가능(JDB)
여러자료를 참고하여 직접 구조를 그려보았다.
▷ 참고 블로그
https://backendcode.tistory.com/161
[IT 기술 면접] JVM (자바 가상 머신) 이란?
이번에는 JVM에 대해 정리할 것이다. ▶ JVM 이란? JVM이란 Java Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다. (가상 머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한
backendcode.tistory.com
[JAVA] JVM과 자바 메모리 영역 Static, Stack, Heap
JAVA 에서 사용되는 대표적인 메모리 영역에는 Static, Stack, Heap 영역이 있다. JAVA를 공부하면서 그리고 Spring 을 다루면서 기본적으로 알고 있어야 하는 개념이기에, 이 세 가지의 주요 특징과 사용
developshrimp.com