메모리 구조를 이해하기 위해서는 JVM에 대해 알아야 한다!
JVM 이란?
Java virtual Machine의 약자이며, 자바 가상머신이라고 불린다
Java의 바이트코드를 해석하고 실행하는 역할을 한다
OS에 상관없이 실행할 수 있는 것이 장점, JVM만 설치하면 어떤 운영체제든 java 파일을 실행할 수 있다
JVM 실행 순서
- .java 파일을 컴파일러(Compiler)를 통해. class 파일로 변환한다
- .class 파일을 JVM의 classLoader(클래스로 더)에게 보낸다
- 클래스 로더에서 JVM 런 타임 영역으로 로딩하여 메모리에 올린다
자바 소스파일은 컴파일러에 의해 바이트 코드 형태인 클래스 파일이 됩니다
그리고 이 클래스 파일은 클래스로 더 가 읽어들이면서 JVM이 수행됩니다
클래스 로더(classLoader)
JVM 내로 클래스 파일을 로드 하고, 링크를 통해 배치하는 작업을 수행하는 모듈
런타임 시에 동적으로 클래스를 로드함
실행 엔진(Execution Engine)
클래스 로더에 의해 JVM으로 로드된. class 파일(바이트코드)들은 Runtione Data Areas의 Method Area에 배치되는데, 배치 괸 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진(Execution Engine)에 제공하여, 정의된 정의된 내용대로 바이트 코드를 실행
이때, 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진
가비지 컬렉터(Garbage collector)
자바 가상머신은 가비지 컬렉터(Garbage collector)를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 줌
개발자가 따로 메모리를 관리하지 않아도 되므로, 손쉽게 프로그래밍을 할 수 있다
Heap 메모리 영역에 생성된 객체들 중에 참조하지 않는 객체들은 탐색 후 제거하는 역할을 한다
Java의 메모리 영역
자바 프로그램을 실행하게 되면 JVM은 OS로부터 메모리를 할당받는다
할당받는 메모리를 자바 프로그램에 맞게 여러 개의 영역으로 나누어 사용하게 된다
각 영역은 목적에 맞게 사용되고, 애플리케이션의 성능에 영향을 미친다
같은 기능을 하는 애플리케이션일지라도, 메모리 관리에 따라 성능에 차이가 생긴다는 이야기이다
메모리를 관리하지 않고 구성하게 된다면 StackOverFlow가 발생하여 애플리케이션이 종료될 수 있다는 말이다
JVM의 메 모히는 크게 3가지로 이루어져 있다
- Heap 영역
- Stack 영역
- Static(Method) 영역
Static(Method) 영역
Static 영역 혹은 Method 영역이라고 불린다
클래스 변수나, static으로 선언된 것들이 해당 메모리 영역에 저장된다
- JVM이 실행될 때 Class가 로딩될 때 생성
- Class의 정보, Static 변수(클래스 변수), 생성자(Constructor), 메서드(Method)와 같은 것들을 저장한다
- Static 영역에 있는 것은 어디서든 접근 가능하다
- JVM이 종료 시 (프로그램이 종료 시) 메모리에서 해제된다. 즉, 프로그램이 종료되기 전까지 메모리상에 존재
- 어디서든 접근이 가능하기 때문에, 무분별하게 사용될 경우 메모리 부족 현상이 발생할 수 있다
Heap 영역
인스턴스를 생성할 때 사용되는 메모리 영역이다
- 참조형 데이터 객체의 실제 데이터가 저장되는 공간, Stack 영역에서 실제 데이터가 존재하는 Heap 영역의 참조 값을 가지고 있다
- new 키워드로 인스턴스를 생성할 때, Heap 영역에는 생성된 객체가 저장, Stack 영역에 생성된 객체에 대한 주소값(Reference)이 저장된다
- new를 사용해 객체를 생성할 때 저장된다
- 참조형 데이터 타입이 저장된다.(String, 배열(array), enum, class, interface), Object
- Heap 영역의 데이터들을 가리키는 reference(참조 주소)는 Stack 영역에 적재된다. Reference를 통해서만 heap 영역의 데이터들에 접근, 핸들링할 수 있다
- 호출이 종료돼도 삭제되지 않는다 -> GC(가비지 컬렉터)에 의해 메모리에서 해제된다
- 스레드가 몇 개가 존재하든, 단 하나의 영역만 존재한다(Stack 영역의 경우 스레드 별로 1개씩 생성)
Animal a = new Animal("cat");
// a = Stack Area
// Animal("cat") = Heap Area
Stack영역
- 기본 자료형, 지역변수, 매개변수가 저장되는 메모리
- 메서드 내부의 기본 자료형에 해당하는 변수 적재
- Heap 영역에 생성된 데이터의 참조 값이 할당됨
- 메서드가 호출될 때 메모리에 할당, 메서드 종료 시 메모리에서 삭제
- 자료구조 Stack의 구조이다
- 각 Thread마다 자신만의 Stack을 가진다 (1:1) = Thread: Stack
Thread는 내부적으로 static, Heap, Stack 영역을 가진다
Thread는 다른 Thread에 접근할 수 없지만, static, Heap 영역을 공유하여 사용 가능
'CS' 카테고리의 다른 글
[CS] 세션(Session)과 쿠키(Cookie) (0) | 2024.05.08 |
---|---|
[CS] HTTP, HTTPS (0) | 2024.05.08 |
[CS] Model1과 Model2 (0) | 2024.05.08 |
[CS] N+1 문제 해결 (0) | 2024.05.08 |
[CS] 인터페이스 vs 추상 클래스 (0) | 2024.05.08 |