본문 바로가기
개발 지식/Java

[Java] 자바란 무엇일까? JVM 메모리, 각 명칭 및 기능

by 에르주 2020. 7. 29.
반응형

내가 알고있는 Java에 대한 지식으로는JVM(Java Virtual Machine)은 자바 가상 머신으로 자바라는 언어의 강점이자 자바를 실행시키는 프로그램이다. 그리고 메모리는 JVM에서 알아서 관리해 준다라는 것이 내가 알고 있는 JVM의 전부이다.

 

어찌보면 익숙한 프로그래밍 언어이기도 하지만 기본을 잘 알고 있지는 못하게 때문에 인터넷에서 알음알음 공부했던 것들과 내가 알고 있는 것들을 블로그에 정리 해둔다. 

 

전체 자바 코드가 실행되는 프로세스는

자바코드(.java) -> 자바 컴파일 -> 바이트 코드(.class) -> JVM JIT 컴파일러 -> 머신 코드 -> 실행 

이다.

 

 

Java 순서도 및 JVM 구조

 

- 자바 컴파일을 통해 바이트 코드(.class)로 변환 뒤 Class Loader를 통해 Class 파일을 JVM으로 로딩한다.

- 로딩된 Class 파일들은 Execution Engine(클래스를 실행시키는 역할, 실제 JVM 내부에서 기계가 실행 할 수 있는 형태로 변경)을 통해 해석된다.

- 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적인 수행을 한다.

 

그렇다면 JVM의 역할에 대해서 알아보아야 하는데 기능과 구조는 다음과 같다.

 

JVM 구성은 크게 3개로 나뉘어 지며 각각의 기능은 다음과 같다.

 

1) Class Loader: 확장자가 .class 클래스 파일의 위치를 찾아 그것을 JVM 위에 올려 놓는다.

 

2) Execution Engine: Class load가 끝난 작업이 끝난 Class파일들은 Runtime Data Areas의 Method Area에 배치된다. JVM은 Method Area에 있는 바이트 코드를 Execution Engine에 제공하여 Class에 정의된 내용대로 실행한다. (바이트 코드를 실행 가능하도록 해석)

 

3) Runtime Data Areas ( JVM 메모리): 총 5개의 영역으로 나눈다.

- PC register

   : 쓰레드가 생성 될 때마다 생성되는 영역으로 Program Counter이고 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.

 

- Method Area

  : 클래스 멤버 변수이름, 데이터 타입, 접근 제어자 같은 필드 정보와 메소드의 이름, 리턴 타입, 파라미터 같은 메소드 정보 Type 정보(ex. Interface, class), Constant Pool, Static 변수, final class 변수등 생성

 

- Heap area

  : new 키워드로 생성된 객체와 배열이 생성 되는 영역, 메소드 영역에 로드된 클래스만 생성 가능하고 garbage Collector가 참조되지 않는 메모리를 확인하고 제거한다.

모든 오프렉트 타입(String, Integer, String, ArrayList, ..)은 heap 영역에 생성된다.

몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.

Heap 영역에 있는 오프젝트들을 가리키는 레퍼런스 변수(주소값) 가 stack에 올라간다. (원시타입인 경우는 값과 함께 저장) Heap 영역에는 주로 긴 생명주기를 가지는 데이터가 많다.

 

- Stack

 : 지역 변수, 파라미더, 리턴값, 연산에 사용되는 임시 값들이 저장되는 영역

   예를 들어 People p = new People(); 경우 People p는 스택에 생성되고 new로 생성된 People 클래스의 인스턴스는 힙 영역에 생성된다. 그리고 스택 영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다. 즉 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키도(참조) 있는 것이다.

원시타입의 데이터는 값과 함께 할당된다. 지역변수들은 scope에 따른 visibility를 가진다. 각 Thread는 자신만의 Stack를 가진다.

 

- Native Code Stacks

 : Java 외의 네이티브 코드를 실행하기 위한 영역

 

4) Garbage Collector

Unreachable Object를 우선적으로 메모리에서 제거하여 메모리 공간을 확보한다. Unreachable Object는 Stack에서 도달할 수 없는 Heap 영역의 객체를 말한다.

Mark and Sweep이라고도 하며 Garbage가 아닌 것을 다로 mark하고 그 외의 것들은 모두 지워진다.

 

스터디 참고 사이트: https://yaboong.github.io/java/2018/05/26/java-memory-management/

 

 

 

 

 

 

 

 

반응형

댓글