Chillax in dev

[Java] JVM의 메모리 구조 본문

Java 공부/Java

[Java] JVM의 메모리 구조

Seong Story 2020. 12. 22. 15:57
728x90

[Java] JVM의 메모리 구조와 메모리 영역

- 이번엔 우리가 프로그램을 실행 할때 어떤 일이 일어나는지? 공부해보고자 한다.

일단 응용프로그램이 실행되면, JVM(Java Virtual Machine)은 시스템으로부터 프로그램 수행 시 필요한 메모리들을 할당받아 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

그중에 3가지 주요 영역에 대해선 반드시 알아야 한다.

 

  1. Method Area : 클래스 데이터의 바이트 코드가 로드되는 곳
  2. Call stack : 프로그램이 함수 호출을 추적할 때 사용한다.
  3. Heap : 객체를 저장하는 가상 메모리 공간 , new로 생성된 객체 + 배열을 저장

1. 메서드 영역(method area)

- 프로그램 실행 중 어떤 클래스가 사용되면 , JVM이 해당 클래스의 바이트코드 즉(*. class)

를 분석하여 클래스의 데이터(정보)들을 이곳에 저장한다. 클래스의 데이터 중 클래스 변수도 이 영역에 함께 생성된다.

JVM은 말 그대로 자바 가상 머신인데, java와 os 사이의 중개자 역할로 이 녀석이 있어 자바의 큰 특징 중 하나인 os에 구해 받지 않고 재사용이 가능하게 해 주는 것이다. 또한 메모리의 관리와 GC(Garbage Collection)을 수행하는 스택 기반의 가상 머신 정도로 알고 있자

JVM이 뭔가를 실행하기 앞서 먼저 그 바이트 코드들이 특정 메모리 공간에 저장되어있어야 한다. 

-JVM은 메인 메서드를 호출하는 것으로 시작을 한다. 그것이 프로그램의 시작이다.

특히 우리가 main에 사용하는 클래스, static 변수 등 이바로 메서드 영역에 올라온다.

- 예시를 들어보면 메인에서 어떤 메서드를 호출한다. 그 메소드를 가진 클래스 바이트 코드는 아직 로딩되지 않았으나 바로 JVM이 JRE라이브러리 폴더에서 클래스를 찾고 없다면 CLASSPATH에 지정된 폴더에서 클래스를 찾아낸다.

이후 메서드 영역으로 파일을 로딩한다.

이렇게 한번 클래스의 바이트 코드가 로딩되면 JVM이 종료될 때까지 유지된다.

 

2 힙 영역(Heap)

- 클래스에서 생성한 객체인 인스턴스가 생성되는 공간으로 프로그램 실행 중 실행되는 모든 인스턴스가 이곳에 저장된다. 즉 인스턴스 변수의 저장공간이다.

 

3. 호출 스택(Call Stack or execution stack)

- 호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출 스택에 호출된 메서드를 사용하기 위해서 메모리가 할당되는데, 이 메모리는 메서드가 작업을 수행하는 동안 로컬 변수(지역), 매개변수들과 연산의 중간 결과 등을 저장하는 데 사용된다. 그리고 메서 그가 작업을 마치면 메모리 공간을 비우는 방식으로 활용된다.

- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.

- 스택 구조로 데이터를 쌓아 사용하여 메서드 수행이 끝나면 사용했던 메모리를 반환, 스택에서 제거한다.

- 즉 호출 스택의 제일 위에 위치하는 메서드가 현재 실행 중인 메서드이다.

- 그렇다면 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드인 것이다.

 

대충 이런 느낌

728x90
LIST
Comments