1. JDK, JRE, JVM 이란?
1) JDK
Java Development Kit의 약자로, Java환경에서 돌아가는 프로그램을 개발하는 데 필요한 툴을 모아놓은 소프트웨어 패키지이다. 자바 실행 환경인 JRE와 자바 언어를 바이트 코드로 컴파일 해주는 javac, 자바 클래스 파일을 해석해주는 javap 등을 포함하는 개발 도구들로 이루어져 있다.
2) JRE
Java Runtime Environment의 약자로, 컴퓨터의 운영체제 소프트웨어 상에서 실행되고 클래스 라이브러리 및 특정 Java 프로그램이 실행해야 하는 리소스를 제공하는 소프트웨어이다.
JRE는 JDK를 사용하여 작성된 Java 코드를 JVM에서 실행하기 위해 필요한 필수 라이브러리와 결합한 후 결과 프로그램을 실행하는 JVM의 인스턴스를 작성한다. JVM은 운영체제에 영향 받지 않고 실행가능하다.
3) JVM
Java Virtual Machine의 약자로, Java 프로그램을 실행하기 위한 가상 머신(컴퓨터)이다. JVM은 Java 애플리케이션을 실행하기 위해 Java 컴파일러로부터 생성된 바이트코드를 읽고 해석한다. 해석 과정에서 JVM은 바이트코드를 네이티브 코드로 변환한 후, 이를 실행한다.
JVM은 Java 프로그래밍 언어로 작성된 애플리케이션을 운영체제와는 독립적인 플랫폼으로 제공하는 역할을 한다. 따라서 Java 프로그램은 어떤 운영체제에서도 동일한 방식으로 실행될 수 있다. 때문에, 한 번 작성하면 운영체제에 구속받지 않고 어디서나 실행가능 하다.
또한, JVM은 Java 애플리케이션을 실행하기 위해 여러 가지 기능을 제공한다.
JVM은 메모리 관리를 담당하며, 객체를 생성하고 사용한 뒤 자동으로 메모리를 해제한다. 자세한 내용은 아래 Run Time Data Area 내용에서 확인하자. 이 외, JVM은 스레드 관리, 예외 처리 등을 수행한다.
2. Run Time Data Area 란?
자바의 실행 환경인 JVM(Java Virtual Machine)은 프로그램의 실행에 필요한 메모리를 관리하기 위해 Run Time Data Area라는 메모리 영역을 가지고 있다. 이 영역은 다시 5개의 영역으로 나뉜다.
1) Method Area
Method Area는 JVM에서 클래스 정보를 저장하기 위한 영역이다. 클래스 정보는 .class 파일에서 읽어와 상수풀, 필드, 메소드 등의 정보를 저장한다.
특징으로, 모든 스레드에서 Method Area 영역을 공유할 수 있으며, JVM이 시작될 때 해당 영역이 생성된다.
2) Stack Area
Stack Area는 메소드를 호출할 때마다 각각의 스택 프레임(Stack Frame)이 생성되는 영역이다. 스택 프레임에는 메소드 호출 시 전달되는 인자, 로컬 변수, 연산 시 중간 계산 결과 등이 저장된다.
3) Heap Area
Heap Area는 객체가 생성되는 메모리 공간이다. 객체는 new 연산자를 이용하여 Heap 영역에 생성된다. JVM은 Heap 영역을 관리하기 위해 Garbage Collection을 수행한다.
Tip1> 가비지 컬렉션(Garbage Collection)이란?
메모리 관리 기법 중 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중 필요없게 된 영역의 메모리를 다시 수거하는 기능을 한다.
Tip2> 가비지 컬렉션(Garbage Collection) 동작 원리는?
어떤 변수에서도 객체를 참조하지 않으면, 해당 객체는 프로그램에서 사용할 수 없는 객체가 된다. 즉, 힙 메모리에는 존재하지만, 위치 정보를 모르기 때문에 사용할 수 없는 객체가 된다. 자바는 이러한 객체를 쓰레기로 취급하고, 쓰레기 수집기(Garbage Collection)을 실행시켜 자동 제거한다. 이 때, 객체를 직접 제거하는 것은 아니다. 때문에 메모리에서 객체를 제거하는 유일한 방법은 객체의 모든 참조를 없애는 것이다.
4) Native Method Stack
Native Method Stack은 자바 코드가 아닌 다른 언어(C, C++ 등)로 작성된 네이티브 코드를 실행하기 위한 메모리 공간이다.
5) PC Register
PC Register는 JVM이 현재 실행 중인 명령어의 주소를 저장하는 영역이다.
코드로 구분하는 Heap Area와 Stack Area>
package Day06;
public class ReferenceVariableCompareExample_참조타입 { // c S
public static void main(String[] args) { // m S
int [] arr1;
int [] arr2;
int [] arr3;
// 해석: int형 배열 선언 (Stack 영역에 변수 생성)
arr1 = new int[] { 1, 2, 3};
arr2 = new int[] { 1, 2, 3};
// 해석1: heap 영역에 '1', '2', '3' 메모리 3개 저장
// 해석2: 배열은 첫번째 메모리 주소를 스택영역에 대입함.
arr3 = arr2;
// 해석: arr2가 가지고 있던 메모리 주소를 arr3에 대입
System.out.println( arr1.length );
System.out.println( arr1 == arr2 );
// 결과값: false
System.out.println( arr2 == arr3 );
// 결과값: true
System.out.println( arr1 == arr3 );
// 결과값: false
// NullPointerException
int[] intArray = null;
// System.out.println( intArray[0] );
// intArray[0] = 10;
// 결과값: NullPointerException 오류 발생
// 해석: Heap영역에 생성된 데이터가 없기 때문에, 오류발생
String str = null;
// System.out.println( str.length() );
// 결과값: NullPointerException 오류 발생
// 해석: Heap 영역에 생성된 데이터가 없기 때문에, 길이 확인 불가
} // m E
} // c E
위의 코드 그림으로 다시 보기>
'자바(Java)' 카테고리의 다른 글
Java 싱글톤 패턴(SingleTon Pattern) / 게터&세터(Getter & Setter) (0) | 2023.03.03 |
---|---|
Java 클래스(class)란? (0) | 2023.03.01 |
Java 반복문, 제어문 활용 (console 가위바위보, 예금, 키오스크) (0) | 2023.02.27 |
Java 반복문과 제어문(조건문) (0) | 2023.02.27 |
Java 객체 지향 프로그래밍이란? (0) | 2023.02.27 |