선요약
메서드 영역(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() 키워드로 생성해서 접근 가능하다는 뜻
추가로 힙영역은 가비지 컬렉터가 관리한다
가비지 컬렉터가 힙 관리를 제대로 못하면 밑처럼 터져벼림
'컴퓨터 > Java' 카테고리의 다른 글
[JVM] JVM(자바) 의 메모리 구조 - 스택과 힙 영역, 스택 프레임이 쌓이는 과정과 힙 영역에 객체가 생기는 과정 (0) | 2024.12.24 |
---|---|
[JVM] JVM 동작 과정 - | 클래스로더, 실행엔진, 가비지 컬렉션 (0) | 2024.12.19 |
[레거시분석] 메모리 관점에서 참조형 객체 초기화 방법 (new, null) (0) | 2024.10.22 |
[Java] JavaSE, JDK, JRE 의미, JDK 의 주요 디렉토리 및 exe 정리 (1) | 2024.05.03 |
[Java] List<Map<String, Object>> 을 List<Map<String, String>> 으로 형변환하기 (0) | 2023.02.27 |
댓글