[JAVA] JVM

승 아·2023년 3월 10일
0
post-thumbnail

배경

  • 자바 탄생 전 C++이 프로그래밍 언어로 사용되었지만, 운영체제로부터 독립적이지 못하다는 문제점이 있음

  • 이러한 문제점을 해결하고자 자바가 탄생, 자바의 운영체제로부터의 독립성은 JVM이라는 별도의 프로그램을 통해서 구현됨

프로그램 실행 과정

  1. CPU,메모리, 각종 입출력 장치 등 컴퓨터 자원을 프로그램이 할당 받음

  2. 프로그램이 자신이 필요한 컴퓨터 자원을 운영체제에게 주문

  3. 운영체제는 가용한 자원을 확인 후 프로그램이 실행되는 데에 필요한 컴퓨터 자원을 프로그램에 할당

  4. 프로그램이 운영체제에게 필요한 컴퓨터 자원을 요청하는 방식이 운영체제마다 다름
    -> 프로그래밍 언어가 운영체제에 대한 종속성 가지게 됨

JVM(Java Virtual Machine)

  • 바로 작성한 소스 코드를 해석해 실행하는 별도의 프로그램

  • 운영체제로부터의 독립성을 구현

  • 운영체제에 맞게 JVM이 개발되어져 있어, 자바 소스 코드를 운영 체제에 맞게 변환해 실행시켜줌

JVM을 통한 프로그램 실행 과정

  1. 자바로 소스코드 작성 후 실행(.java file)

  2. 컴파일러가 실행되면서 컴파일 진행 -> 컴파일 결과로 .class확장자를 가진 바이트 코드 파일로 변환

  3. JVM은 운영체제로부터 소스 코드 실행에 필요한 메모리를 할당받음->런타임 데이터 영역(Runtime Data Area)

  4. 클래스 로더(Class Loader)가 바이트 코드 파일을 JVM 내부로 불러들여 런타임 데이터 영역에 적재시킴(자바 소스코드를 메모리에 로드)

  5. 로드 완료 후 실행 엔진(Execution Engine)이 런타임 데이터 영역에 적재된 바이트 코드를 실행시킴(2가지 방법)

    • 인터프리터(Interpreter)를 통해 코드를 한 줄씩 기계어로 번역하고 실행

    • JIT Compiler(Just-In-Time Compiler)를 통해 바이트 코드 전체를 기계어로 번역하고 실행(중복적으로 어떤 바이트 코드 등장 시 한 번에 바이트 코드를 해석하고 실행시킴)

    • 실행엔진은 기본적으로 인터프리터를 통한 방법으로 바이트 코드를 실행시키다가, 특정 바이트 코드가 자주 실행되면 해당 바이트 코드를 JIT Compiler를 통해 실행시킴

JVM 메모리 구조

  • JVM에 Java 프로그램이 로드되어 실행될 때 특정 값 및 바이트코드, 객체, 변수등과 같은 데이터들이 메모리에 저장되어야 함

  • 런타임 데이터 영역이 이러한 정보를 담는 메모리 영역이며, Method Area, Heap Area, Stack Area, PC Register, Natice Method Stack으로 구분되어 있음

Stack Area

  • 일종의 자료구조(프로그램이 데이터를 저장하는 방식)

  • LIFO(Last In First Out)으로, 마지막에 들어간 데이터가 가장 먼저 나옴

  • JVM안에서 메서드 호출 시 메서드를 위한 Method Frame이 생성 ->
    메서드 내부에서 사용하는 참조변수, 매개변수, 지역변수, 리턴 값 및 연산시 일어나는 값들이 임시로 저장 ->
    이런 Method Frame이 Stack에 호출되는 순서대로 쌓이고, 동작 완료시 역순으로 제거됨

Heap Area

  • JVM에는 단 하나 존재하며, 객체는 대부분 일회성이고 메모리에 남아 있는 기간이 대부분 짧음

  • 메모리에 남아 있는 기간에 따라 2가지로 분류할 수 있음

    • Young 영역 : 새롭게 생성된 객체가 할당되는 곳, 많은 객체가 생성되고 사라지는 것 반복
    • Old 영역 : Young영역에서 상태를 유지하고 살아남은 객체들이 복사되는 곳, 보통 Young 영역보다 크게 할당되고 크기가 큰 만큼 가비지는 적게 발생
  • JVM 작동 시 자동으로 생성되며 이 영역 안에 객체나 인스턴스 변수, 배열이 저장됨

  • 실제 객체의 값이 저장되는 공간 cf)Stack Area에는 참조 변수가 저장되어 있어 Heap Area에 있는 객체를 다룸

Garbage Collection

  • 메모리를 자동으로 관리하는 프로세스

  • 프로그램에서 더 이상 사용하지 않는 객체를 찾아 삭제하거나 제거하여 메모리를 확보

  • 아무한테도 참조되고 있지 않은 객체 및 변수들을 검색하여 메모리에서 점유를 해제시킴

Garbage Collection 동작 방식

Minor GC란 Heap Area의 Young Area에서 활동하는 가비지 컬렉터를, Major GC란 Heap Area의 Old Area에서 활동하는 가비지 컬렉터를 의미한다.

Young 영역과 Old 영역은 서로 다른 메모리 구조로 되어 있기 때문에, 세부적인 동작 방식은 다르지만 기본적으로 가비지 컬렉션이 실행될때는 아래의 두 단계를 따른다.

  1. Stop The World
  • 가비지 컬렉션을 실행시키기 위해 JVM이 애플리케이션의 실행을 멈추는 작업

  • 가비지 컬렉션이 모든 변수와 객체를 탐색하여 어떤 객체를 참고하고 있는지 확인

  1. Mark and Sweepd
  • 사용되는 메모리와 사용하지 않는 메모리를 식별하는 작업

  • 사용되지 않음으로 식별된 메로리를 제거

profile
개발 공부를 기록하는 공간

0개의 댓글

관련 채용 정보