자바썸
자바랑 썸타는중
자바썸

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
자바썸

자바랑 썸타는중

Java는 어떻게 동작하지?( + 메모리 영역)
Language/Java

Java는 어떻게 동작하지?( + 메모리 영역)

2022. 5. 23. 20:41

Java란?

 

  • Java는 프로그램을 만드는 프로그래밍 언어 중 하나이자 대표적인 객체지향 언어이다.
  • 운영체제와 상관없이 JVM(Java Virtual Machine)만 있으면 코드를 실행할 수 있다.
  • 가비지 컬렉션이 존재하기 때문에 사용자가 일일이 메모리를 관리해주지 않아도 자동으로 사용하지 않는 메모리를 해체해준다.

 

JVM(Java Virtual Machine)이란?

 

  • JVM은 자바의 Byte 코드를 OS에 맞게 실행해주는 역할을 수행한다.( 그래서 CPU나 OS에 상관없이 실행할 수 있게 해 준다.)
  • 우리가 Java로 코드를 작성하면 이건 인간끼리만 알아볼 수 있지 컴퓨터는 하나도 읽을 수 없다.
  • 그래서 Java 코드를 컴퓨터가 읽을 수 있게 기계어로 변환하는 작업을 '컴파일'이라고 한다.

 

Java 동작 과정

출처 :https://www.youtube.com/watch?v=9V0rdrm59X4

우리가 IDE에 코드를 작성하면 .java라는 확장자로 파일이 생성된다. 

 

그리고 Java 컴파일러(Javac.exe)가 컴퓨터가 읽을 수 있는 Byte코드로 변환하고 .class라는 확장자로 파일을 생성한다.

 

그리고 .class 파일을 JVM이 읽어서 적혀있는 대로 컴퓨터가 동작하도록 한다.  


JVM 내부 구조 

출처 :https://jeong-pro.tistory.com/148

JVM(Java Virtual Machine)의 내부 구조를 보면 크게 4가지로 나뉜다.

 

  • Class Loader
  • Execution Engine
  • Garbage Collector
  • Runtime Data Area

1) Class Loader 

위에서 컴파일러가 .java 파일을 byte코드로 변환해서 .class 파일을 만들다고 했다. 이렇게 만든 .class 파일을 JVM이 운영체제로부터 할당 받은 메모리 영역인 Runtime Data Area에 적재하는 작업이 필요한데 이 역할을 해주는 게 Class Loader이다.( 자바 어플리케이션이 실행중일 때 이 작업이 수행된다고 한다.)

 

2) Execution Engine

Class Loader에 의해 적재된 class 파일을 명령어 단위로 실행하는 역할을 한다. 명령어를 실행하는 방법은 인터프리터(Interpreter)방식과 JIT(Just-In-Time)방식이 있다.

  • 인터프리터 : 명령어 하나하나 실행함. (실행이 느림)
  • JIT : byte 코드를 native코드로 변환해서 실행함. (실행이 빠르나 변환하는 데 비용이 발생함)

3) Garbage Collector

Heap 메모리 영역에 생성된 객체들중 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다. GC(Garbage Collector)가 언제 역할을 하는 시간을 정확히 알 수 없다고 한다.

 

4) Runtime Data Area 

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 영역은 5가지로 나눌 수 있다.

 

  • Method Area
  • Heap Area
  • Stack Area
  • PC register
  • Native Method Stack

(1) Method Area ( = Static Area)

모든 쓰레드가 공유하는 영역. Method Area는 클래스, 인터페이스, 메소드, 필드, static 변수 등 바이트 코드를 보관한다.

 

(2) Heap Area

모든 쓰레드가 공유하는 영역. new 키워드로 생성된 객체와 배열이 생성되는 영역이다.

메소드 영역에 로드된 클래스만 생성이 가능하고 GC가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

 

(3) Stack Area

각 쓰레드마다 하나씩 존재. 지역 변수 , 파라미터, 리턴 값, 연산에 사용되는 임시 값이 생성되는 영역이다.

예를 들어, int a = 100;을 실행하면 Stack Area 안에 a라는 이름으로 100을 값으로 가지는 공간이 생긴다.

또 다른 예로, Car car = new Car()를 실행하면 Stack Area 안에 car라는 이름이 Heap Area에 있는 인스턴스의 주소 값을 가지는 공간이 생긴다. 즉, Stack Area의 car는 Heap Area에 객체를 가리키는 것이다.

 

(4) PC register

각 쓰레드마다 하나씩 존재. 현재 쓰레드가 실행되는 명령의 주소와 값을 가지고 있다.

그래서 현재 명령이 끝나면 값을 증가시켜 다음 해당하는 값의 명령을 실행한다.

 

(5) Native Method Stack

각 쓰레드마다 하나씩 존재. 자바 외의 언어로 작성된 Native 코드를 위한 메모리 영역이다.

 

Method Area와 Heap Area는 모든 쓰레드가 공유한다.

반면에 Stack Area, PC register, Native Method Stack은 공유하지 않고 각각 쓰레드마다 생성된다.

 

 

※ 도움을 주신 분들

https://www.youtube.com/watch?v=9V0rdrm59X4

https://jeong-pro.tistory.com/148

https://maivve.tistory.com/212

https://steady-coding.tistory.com/305

'Language > Java' 카테고리의 다른 글

[Java]스트림(stream)(2/3)  (0) 2022.06.07
[Java]스트림(stream)(1/3)  (0) 2022.06.07
[Java] 람다식  (0) 2022.06.06
예외처리(Exception Handling)  (0) 2022.05.27
객체 지향 프로그래밍에 대해 묻는다면 ?  (0) 2022.05.25
    'Language/Java' 카테고리의 다른 글
    • [Java]스트림(stream)(1/3)
    • [Java] 람다식
    • 예외처리(Exception Handling)
    • 객체 지향 프로그래밍에 대해 묻는다면 ?
    자바썸
    자바썸

    티스토리툴바