Programming-[Backend]/Java

[자바 기초] 2. 자바의 동작원리 : 클래스 로딩과 JVM 메모리

컴퓨터 탐험가 찰리 2021. 12. 14. 21:54
728x90
반응형

 

지난 글에서 우리가 작성한 소스 코드는 javac 컴파일러에 의해서 바이트코드로 변환된다고 했다. 이것이 .class 확장자를 갖는 파일이며 이 파일들이 classLoader에 의해 JVM(Java Virtual Machine)에 로딩된다. 이번 글에서는 클래스가 로딩되는 JVM 메모리의 구성과 과정에 대해서 이해해본다.

 


 

1. Loading, Memory의 의미

 

Load 의 의미

classLoader를 검색해보면 클래스 파일들을 로딩하는 역할을 한다고 나와있다. 그런데 도대체 로딩이 무엇인지 설명하는 글을 찾기가 어렵다. 컴파일된 파일들을 로드한다는 것이 무슨 의미일까?

 

클래스 파일을 로드한다는 것은 프로그램에서 클래스 파일을 이용할 수 있도록 특정 메모리 영역에 클래스 파일의 정보를 저장하는 것을 의미한다. 여기서 말하는 클래스 파일의 정보란 클래스 파일에서 정의한 변수, 메서드 등을 의미한다.

 

그리고 Static Block도 이 순간에 로드된다(즉 저장된다). 프로그램에서 static 키워드를 통해서 함수나 변수 등을 선언하는 것이 바로 이 순간에 메모리에 해당 정보를 저장하겠다는 의미가 된다.

 

(참조1의 내용)

Class Loading is the process of storing the class-specific information in the memory. Class-specific information means, information about the class members, i.e., variables and methods. It is just like that before firing a bullet, first, we need to load the bullet into the pistol. Similarly, to use a class first we need to load it by a class loader. Static block runs only once in the life of a class. It can only access the static members and will only belong to the class.

 

Static Block is just like any block of code beginning with a ‘static’ keyword is a static block. Static is a keyword which when attached to the method, variable, Block makes it Class method, class variable, and class Block. You can call a static variable/method using ClassName. JVM executes the static block at “CLASS LOADING TIME”.

 

 


 

2. Memory 구조

그럼 자바는 프로그램을 실행시키기 위해서 메모리 공간을 할당한다는 것을 유추할 수 있다. 실제로 자바는 프로그램을 동작시키기 위해서 JVM이 컴퓨터의 자원을 할당받아서 일정 메모리 영역을 차지하도록 한다.

 

JVM의 메모리 구조, 각 구성 요소의 역할과 프로그램 실행 시 메모리 사용 방법에 대해 잘 설명한 글이 있어 그대로 참조한다. (참조 2)

 

 


 

 

JVM의 메모리 구조(ref2)

JVM의 메모리 구조는 크게 5가지로 나뉜다. 

 

1. Heap Memory : 인스턴스 저장

객체의 인스턴스나 동적으로 할당된 데이터를 저장한다.

GC(Garbage Collection)이 일어난다. Garbage Collection이란 실행 중인 프로그램에서 쓸모없어진 객체를 관리하는 JVM 프로그램이다.

  -Young generation 공간에 새로 생성된 인스턴스들이 저장된다. EDEN 공간에 1차적으로 저장되고, 여기서 Minor GC가 일어나서 프로그램의 어디에선가 사용되기 때문에 살아남은 인스턴스들만 Survivor Space에 저장된다.

  -Old Generation 공간에 Minor GC를 여러 번 거친 인스턴스들이 저장된다. 여기서도 GC가 일어나며, Major GC라고 부른다.

 

2. Thread Stack : 메소드 및 메소드 관련값 저장

쓰레드 하나마다 배정되는 메모리 영역이다.

메소드의 결과 및 반환값을 저장하거나 지역변수를 저장한다.

 

3. MetaSpace : 클래스, 메소드 정보, static 멤버 변수 저장

애플리케이션의 클래스나 메서드 정보, static으로 정의된 멤버 변수가 저장되는 영역

 

4. Code Cache : 자주 접근하기 때문에 미리 바이트코드 -> 기계어로 변환된 부분을 저장(캐시)

Just In Time(JIT) 컴파일러가 데이터를 저장하는 영역. 컴파일된 코드 블록이 저장된다.

자주 사용하는 영역이 미리 기계어로 변환되어 저장되어 있어서 빠르게 실행이 가능하다.

 

5. Shared Library : 공유 라이브러리 저장 영역

공유 라이브러리를 기계어로 변환한채로 저장한다.

OS에서 프로세스당 한 번씩 로드된다.

 

 


 

3. Memory 할당 : Stack과 Heap

 

자바 프로그램 실행 시, Stack과 Heap에 어떤 변화가 있는지 아래 슬라이드를 통해 확인할 수 있다.

 

1. stack에 main method 저장

2. Employee라는 인스턴스가 Heap에 생성, Employee 생성자에 주어진 String "John", Integer 5000, Integer 5가 저장, Employee의 attribute들이 null로 초기화

3. Employee 인스턴스에 인자값들 지정, Stack의 john이라는 변수가 Employee 인스턴스를 참조

4. Stack에서 findEmployeeBonus 메서드 저장

5. getBonusPercentage 메서드 저장

6. 연산이 끝난 Integer 2500이 Heap memory가 저장

7. Stack의 john의 bonus라는 attribute가 2500이라는 인스턴스를 참조

8. john 인스턴스의 bonus를 출력

9. main 메서드가 void 리턴 후 프로그램 종료

 

참조3. JVM Memory Usage

 

 

참고할 특징

primitive 타입은 stack에 바로 저장된다.

Integer, Employee, String과 같은 참조형 타입은 Heap에 인스턴스 형태로 저장된다. 이 인스턴스들은 stack에서 포인터로 참조된다.

stack에 사용되는 메소드, 지역변수, 리턴값은 연산이 끝나면 사라진다.


 

 

나중에 참조 4를 더 깊이 공부해보자!




참조

 

1. Geek-for-geeks : What is Class Loading and Static Blocks in Java?

https://www.geeksforgeeks.org/what-is-class-loading-and-static-blocks-in-java/

 

 

2. 관찰과 질문, 그리고 데이터 블로그 - JVM의 메모리 구조 및 할당과정

https://inspirit941.tistory.com/294

 

3. speakerdeck.com - JVM Memory usage(Stack vs Heap)

https://speakerdeck.com/deepu105/jvm-memory-usage-stack-vs-heap

 

4. YABOONG 블로그

https://yaboong.github.io/java/2018/05/26/java-memory-management/

 

728x90
반응형