카테고리 없음

JVM heap 과 steak

박대신 코딩공부 2021. 11. 7. 21:06

JVM

JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 한다.

JVM은 Java Virtual Machine의 약자로, 자바 가상 머신이라고 부른다. 그리고 자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다.

 

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

 

먼저, 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환된다. 그리고 이러한 바이트 코드를 JVM에서 읽어 들인 다음에, 이것저것 복잡한 과정을 거쳐서 어떤 운영체제든간에 프로그램을 실행할 수 있도록 만드는 것이다.

 

자바 소스 파일은 리눅스에서 만들었고 윈도우에서 이 파일을 실행하고 싶다면, 윈도우용 JVM을 설치만 하면 된다.

여기서 JVM은 운영체제에 종속적이라는 특징을 알 수 있다.

 

 JVM의 구조는 Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로, 4가지로 나눌 수 있다.

Runtime Data Area

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

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

1. Method Area

JVM이 동작해서 클래스가 로딩될 때 생성

클래스정보(멤버변수의 이름), 변수정보(데이터타입, 접근제어자정보), 메소드정보(메소드 이름, 리턴타입, 파라미터, 접근제어자 정보), static변수, final class변수, Constant pool(상수풀 : 문자상수, 타입, 필드, 객체참조가 저장됨)등을 분류해서 저장한다.

2. Heap Area

new 키워드로 생성된 객체와 배열이 저장되는 영역

GC의 주요 대상이 된다.

런타임시 할당된다.

3. Stack Area

지역변수, 파라미터, 리턴값, 연산에 사용되는 임시값등이 생성되는 영역

메소드를 호출할 때마다 개별적으로 스택이 생성되며 종료 시 영역에서 해제된다.

컴파일 타임 시 할당된다.

Stack 영역은 LIFO(Last In First Out)의 구조를 갖고

변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다는 것을 알 수 있다.  

 

Garbage Collector

Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업

Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

 

사용되고 있는 메모리를 식별하는데, 이러한 과정을 Mark라고 한다.

이후에 Mark가 되지 않은 객체들을 메모리에서 제거하는데, 이러한 과정을 Sweep라고 한다.

 

 

힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.

이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다.