JVM

이정연·2023년 1월 19일

자바기초

목록 보기
6/25

🎯JVM의 탄생

  • 자바라는 언어가 있기전 C++이 주된 언어였다.

  • 문제가 있었다면 운영체제로부터 독립적이지 못한 점이있었다.

  • Windows를 위해 만든 프로그램은 Windows에서만 작동이 가능했다.

  • Mac OS에서 그 프로그램을 실행시키려면 Mac OS에 맞게 새로 프로그램을 만들고 컴파일해야 했다.

  • 자바는 이러한문제를 해결해주는 언어로써 운영체제로부터 독립되어있다.

  • 즉, 자바언어로 소스코드를 한번만 작성하면 어떤 운영체제 에서도 프로그램을 실행시킬 수 있다.

  • 이것을 가능케 한 프로그램이 JVM이다.

  • JVM(Java Virtual Machine)은 자바 프로그램을 실행 시키는 도구임 즉, JVM은 자바로 작성한 소스 코드를 해석해 실행하는 별도의 프로그램이다.

  • 즉, JVM이 자바 프로그램과 운영체제 사이에서 일종의 통역가 역할을 수행한다.

  • 따라서 운영체제에 맞는 JVM이 개발되어있다.

✔ 프로그램이 실행 되기 위해서는 CPU, 메모리, 각종 입출력 장치 등과 같은 컴퓨터 자원을 운영체제에게서 할당받아야 한다.
✔ 이때 프로그램이 운영체제에게 필요한 자원을 요청하는 방식이 운영체제마다 다르기때문에 프로그래밍언어가 운영체제에 대한 종속성을 가지는 이유가된다.

🎯JVM의 구조 및 flow

  1. 자바 소스 코르를 작성하고 실행하면 컴파일러가 실행되면서 컴파일진행
  2. 컴파일 결과 .java확장자를 가졌던 자바 소스코드가 .class 확장자를 가지는 바이트 코드 파일로 변환된다.
  3. JVM은 운영체제로부터 소스코드 실행에 필요한 메모리를 할당 받음(Rumtime Data Area)
  4. 클래스 로더(Class Loader)가 바이트 코드 파일을 JVM 내부로 불러들여 로드한다.
  5. 로드가 완료되면 실행 엔진(Execution Engine)이 런타임 데이터 영역에 적재된 바이트 코드를 실행시킨다.
  • 실행은 두가지 방법으로 진행되는데
    1. 인터프리터(Interpreter)를 통해 코드를 한 줄씩 기계어로 번역하고 실행시키기
    2. JIT Compiler(Just-In-Time Compiler)를 통해 바이트 코드 전체를 기계어로 번역하고 실행시키기

      기본적으로 1번의 방법을 통해 바이트 코드를 실행함.
      특정 코드가 자주실행되는것 같으면 JIT Compiler를 통해 실행

🎯Stack과 Heap

JVM 메모리 구조

1. Stack 영역

  • 프로그램이 데이터를 저장하는 방식인 일종의 자료구조임
  • LIFO(Last In First Out)로 마지막에 들어간 데이터가 가장 먼저 나온다.
  • 메서드가 호출되면 그 메서드를 위한 Method Frame이 생성된다. 이 Method Frame들이 Stack에 순서대로 쌓이는데 역순으로 제거되는 특징을 가진다.

2. Heap 영역

  • JVM이 작동되면 이영역은 자동으로 생성되는 영역이다.
  • 이 영역 안에 객체, 인스턴스 변수, 배열이 저장된다.
Person person = new Person();

위의 예시 에서 new Person()이 실행되면 Heap 영역에 인스턴스가 생성되고, 인스턴스가 생성된 위치의 주소값을 person에게 할당해준다. person은 Stack영역에 선언되어 있다.

객체를 다룬다는 것은 Stack 영역에 저장되어 있는 참조 변수를 통해 Heap 영역에 존재하는 객체를 다룬다는 것 Heap영역은 실제 객체의 값이 저장되는 공간.

🎯Garbage Collection

  • 메모리를 자동으로 관리하는 프로세스
  • 프로그램에서 더이상 사용하지 않는 객체를 찾아 삭제하거나 제거하여 메모리를 확보함.

동작방식

  • JVM의 Heap 영역에 있는 객체는 대부분 일회성이며, 메모리에 남아있는 기간이 대부분 짧게 설계된다.
  • 객체가 얼마나 살아있냐에 따라서 Heap영역안에서 구역을 나누게된다
  • Young과 Old로 나뉜다.

Young 영역(Young Generation)

  • 새롭게 생성된 객체가 할당(Allocation)되는 영역
  • 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
  • Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다.

Old 영역(Old Generation)

  • Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
  • Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC 또는 Full GC라고 부른다.

실행 단계

  1. Stop The World
  • Garbage Collection을 실행시키기 위해 JVM이 애플리케이션의 실행을 멈춘다.
  • Garbage Collection이 실행될 때 이 스레드를 제외한 다른 모든 스레드들의 작업이 중단되고, 정리가 완료되면 재개한다.
  1. Mark and Sweep
  • Mark는 사용되는 메모리와 사용하지 않는 메모리를 식별하는 작업을 한다.
  • Sweep은 Mark단계에서 사용되지 않음으로 판단된 메모리를 해제하는 작업을 한다.
profile
반갑습니다.

0개의 댓글