-
Java의 메모리 영역Backend/Java and Trouble Shooting 2020. 2. 23. 17:20
Java의 메모리 영역(정확히 말하면, 실행 시 데이터가 저장되는 영역(Runtime data area))은 다음과 같다.
- pc (program counter) 레지스터 : 스레드별 보유
- JVM 스택 : 스레드별 보유
- 힙(Heap) : 대부분의 데이터가 저장되는 일반적인 저장소
- 메서드 영역(Method Area)
- 런타임 상수 풀(Runtime Constant Pool) : 메서드 영역에 할당되어 있음
- 네이티브 메서드 스택(Native Method Stack)
1. pc 레지스터
- 각 스레드의 JVM 인스트럭션의 주소가 저장되어 있다.
2. 스택
- 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
- 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.
- 입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
- 메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장
- 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
- 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
- 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.
3. 힙
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
- Heap Area는 JVM이 시작할 때 생성된다.
- New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다.
- 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
- 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.
- 힙 영역의 사용기간 및 스레드 공유 범위
- 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시
- GC(Garbage Collection) 대상
- 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
- 모든 스레드에서 공유한다
더보기출처: https://hoonmaro.tistory.com/19 [훈마로의 보물창고]
4. 메서드 영역 (Static Area)
- 모든 JVM의 스레드를 공유하며, 각 클래스의 구조 정보를 저장하는 영역이다.
- 런 타임 상수 풀, 필드, 메서드 데이터, 메서드와 생성자의 코드에 대한 정보가 저장된다.
- 클래스와 인터페이스 인스턴스의 초기화를 위한 특수 메서드들에 대한 정보가 들어 있다.
5. 런타임 상수 풀
- 메서드 영역에 포함되지만 독자적인 영역이다.
- 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다.
- JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다
6. 네이티브 메서드 스택
- 자바 언어 이외의 네이티브 언어를 호출할 경우 타 언어의 스택 정보를 바이트 코드로 저장한다.
보통 일반적으로 우리가 개발하는 객체들은 힙 영역에 저장되며, 이 영역은 Young, Old, Perm 영역으로 나뉜다.
https://hoonmaro.tistory.com/19
마로의 Java(자바) 정리 - 8. 자바 메모리 구조
JVM 구조 실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행 메소드와 클래스변수들을 해당 메모리 영역애 배치 클래스로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓..
hoonmaro.tistory.com
위 블로그에서 자바 실행 메카니즘에 대해 자세한 내용을 볼 수 있습니다.
참고 자료: 자바 트러블 슈팅. 이상민 지음
'Backend > Java and Trouble Shooting' 카테고리의 다른 글
스프링부트 + Oracle 메이븐 프로젝트 만들기 (0) 2020.03.17 스레드 덤프로 확인할 수 있는 문제 (0) 2020.02.23 스레드에서 발생하는 문제들 (0) 2020.02.22