본문 바로가기
컴퓨터/Java

[JVM] JVM 의 메모리구조, 메모리 영역 별 저장되는 데이터

by 버니케이 2024. 12. 23.
반응형

 

선요약

 

메서드 영역(Method Area): 
클래스 로더에 의해 로드된 클래스의 메타데이터, 상수 풀, 정적 변수, 메서드 코드 등이 저장

스택 영역(Stack Area):
메서드 호출 시 생성되는 프레임이 저장
각 스레드마다 스택이 하나씩 있고, 메인 스레드에 main()-프로그램 시작점 이 있음

힙 영역(Heap Area): 
객체와 배열, 인스턴스 변수가 동적으로 저장
모든 객체는 힙에 생성되며, 전역 접근 가능

 

 


메모리 구조

메서드영역, 스택영역, 힙영역으로 구성되어있다.
일명 메스힙

 

자바 프로그램 실행 시의 대충 흐름은..
자바실행 -> .java가 .class 로 컴파일 
-> (클래스가 처음으로 참조될 때) 클래스로더가 .class 읽으면서 메서드영역에 클래스메타데이터, 상수풀, 정적변수 저장 + 정적변수 초기화
-> 실행엔진이 스택영역에 실행 순서대로 쌓고(스택 프레임 생성) 후 실행
 + 실행되는동안 객체가 있으면 힙에 생성
  + 실행되는동안 가비지컬렉션이 힙 관리
(자세한 내용은 전 글 참고)

https://gallery-k.tistory.com/468

 

 

 


메서드영역

클래스 로더에 의해 로드된 클래스 메타데이터, 상수풀,  정적변수 등등이 저장된다.

저장되는 데이터들: 
- 클래스 메타데이터: 클래스 정보, 메서드 정보, 필드 정보들
- 생성자 및 메서드
- 상수 풀(Constant Pool): 클래스 파일 내에 상수, 문자열 리터럴 등
- static 변수
...

 

 


스택영역

메서드 호출 시 생성되는 프레임이 저장되는 영역이다.
프레임은 메서드 호출과 관련된 정보를 저장하는 구조체이다. 칸 하나하나가 프레임이라고 생각하면 편함.

스레드 개수만큼 스택이 생기는데, 자바는 보통 단일 스레드여서 스택이 한개이다.
멀티 스레드라면 그 개수만큼 스택이 추가로 생긴다.
침고로, 멀티 스레드일 때는 서브 스레드에 분산해서 실행시킬 메소드들이 쌓여있고
메인 스레드에 main()-프로그램 시작점 이 있음

 


저장되는 데이터들: 
- 지역 변수
- 메서드 호출 정보
...

 

 

 

프로그램 실행 시, main(String[] args) 부터 스택 (자료구조) 에 쌓인다.

 

스택에 들어가면서 실행이 되고, 코드 종료시에 위에서부터 차례대로 빠진다.
결국,  main() 이 제일 마지막에 빠지면서 실행 종료

 


힙영역

참조형 객체가 동적으로 할당되는 영역이다.

저장되는 데이터들:
- 모든 참조형 객체
- 인스턴스 필드
- 배열


참조형 데이터 타입의 변수는 실제 객체가 아니라 객체를 가리키는 참조(메모리 주소)를 저장한다.
그래서 전역 접근이 가능하다. - new() 키워드로 생성해서 접근 가능하다는 뜻

 

 

추가로 힙영역은 가비지 컬렉터가 관리한다
가비지 컬렉터가 힙 관리를 제대로 못하면 밑처럼 터져벼림

저번주에 내가 터트린 회사 코드...

 

반응형

댓글