Java는 JVM에 의해 가능해진 운영 체제 독립 언어입니다.
프로그래밍 언어가 OS 독립적이라는 것은 무엇을 의미합니까?
첫째, 프로그램이 실행되기 위해서는 운영체제에서 CPU, 메모리, I/O와 같은 컴퓨터 자원을 할당해야 한다. 프로그램이 필요한 컴퓨터 리소스를 요청하면 운영 체제는 사용 가능한 리소스를 확인한 다음 필요한 컴퓨터 리소스를 프로그램에 할당합니다. 이때 프로그램이 운영체제에 필요한 컴퓨터 자원을 요청하는 방식은 운영체제마다 다르다. 따라서 프로그래밍 언어는 운영 체제에 종속됩니다!
그러나 Java는 다음과 같이 JVM을 통해 운영체제와 통신하므로 운영체제와 독립적으로 동작할 수 있다.

JVM은 어떻게 작동합니까?

JVM의 구조
JVM의 구조는 다음과 같습니다.

Java로 소스 파일(~.java)을 빌드하여 실행하면 Java 컴파일러가 먼저 실행되어 컴파일이 진행됩니다. 컴파일 결과 Java 바이트코드 파일(~.class)이 생성되고 JVM은 소스 코드를 실행하는 데 필요한 메모리를 운영 체제에서 가져옵니다. 이것은 JVM의 런타임 데이터 영역입니다. 다음으로 클래스 로더는 바이트코드 파일을 JVM으로 가져와서 런타임 데이터 영역으로 로드합니다. 로드가 완료되면 실행 엔진은 이제 런타임 데이터 영역에 로드된 바이트코드를 실행합니다. 이때 실행 엔진은 다음 두 가지 방식으로 바이트코드를 실행한다.
- 인터프리터를 통해 코드를 한 줄씩 기계로 번역하고 실행합니다.
- JIT 컴파일러(Just-In-Time Compiler)는 전체 바이트코드를 기계어로 번역하여 실행합니다.
실행 엔진은 기본적으로 인터프리터를 통해 바이트코드를 실행하고 특정 바이트코드가 자주 실행될 경우 해당 바이트코드를 JIT 컴파일러를 통해 실행한다.
그런 다음 런타임 데이터 영역의 구조를 살펴보겠습니다.
런타임 데이터 영역
JVM의 런타임 데이터 영역 구조는 다음과 같다.

영역별로 살펴보겠습니다.
- 방법(정적) 영역 : JVM이 실행되어 클래스를 로드할 때 생성됩니다. JVM이 읽은 클래스를 저장하는 데 사용되는 영역, 인터페이스, 멤버 변수(필드), 클래스 변수(정적), 상수, 생성자 및 메서드 등을 위한 런타임 상수 풀입니다. 이 영역의 데이터는 프로그램이 종료된 후에만 사라집니다. 어디에서나 액세스할 수 있습니다.
- 스택 영역 : 지역 변수와 매개변수의 데이터 값이 저장되는 영역으로 메소드가 호출되면 스택 영역에 스택 프레임이 생성되고 그 안에서 메소드가 호출된다. 메서드가 호출될 때 메모리에 할당되고 메서드가 종료될 때 메모리에서 제거됩니다.
- 힙 영역 : 참조 데이터 타입의 객체와 배열이 저장되는 영역으로, 스택 영역과 달리 저장된 메모리는 호출이 종료된 후에도 지워지지 않고 지속됩니다. 그리고 참조 변수가 힙 영역의 인스턴스를 참조하지 않으면 GC(가비지 컬렉터)에 의해 메모리에서 삭제됩니다.
- PC 등록 : 현재 스레드의 실행 주소를 포함합니다.
- 네이티브 메서드 스택 : Java 이외의 언어로 제공되는 메소드를 호출하는 코드를 실행하기 위한 스택입니다.
마지막으로 가비지 수집기(GC)는 어떻게 작동합니까?

쓰레기 수거
Java에는 가비지 수집이라는 메모리를 자동으로 관리하는 프로세스가 포함되어 있습니다. 가비지 수집은 프로그램이 더 이상 사용되지 않는 개체를 찾아 삭제하거나 제거하여 메모리를 해제하는 것입니다. Garbage Collector를 사용하여 디스크 공간을 확보하고 메모리를 효율적으로 사용할 수 있습니다.
GC 동작 방식을 살펴보기 위해서는 먼저 JVM 힙 영역을 살펴봐야 한다. JVM의 힙 영역은 개체가 대부분 고유하고 메모리 보존이 짧다는 전제하에 설계되었습니다. 따라서 객체의 생명력에 따라 영역을 구분하여 Young 영역과 Old 영역으로 나눕니다.

Young 영역에서는 새로 생성된 객체가 할당되며, 많은 객체가 생성과 소멸을 반복한다. 이 영역에서 활동 중인 가비지 컬렉터 작은 GC그것은 말한다.
Old 공간에서는 Young 공간에서 자신의 상태를 유지하며 살아남는 객체를 복사하는데, 일반적으로 Young 공간보다 더 큰 공간이 할당되고 크기가 클수록 쓰레기가 발생할 가능성이 적습니다. 이 영역에서 활동 중인 가비지 컬렉터 메이저 GC이름을 짓다
GC가 실행될 때 기본적으로 다음 두 단계를 따릅니다.
- Stop the world: JVM이 애플리케이션 실행을 중지하여 가비지 수집을 수행합니다.
- 표시 및 스윕: 표시는 사용된 메모리와 사용되지 않은 메모리를 식별하는 작업입니다. 스윕은 표시 단계에서 사용되지 않는 것으로 식별된 메모리를 해제하는 프로세스입니다.
JVM, JVM 메모리 공간 및 가비지 수집에 대해 간략하게 요약했습니다. 그동안 궁금했던 것들을 블로그에 정리해서 한눈에 볼 수 있어서 좋아요!
