일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- springwebmvc
- lambda
- FunctionalInterfaces
- DesignPattern
- DispatcherServlet
- hibernate
- 토비의스프링
- Immutable
- ApplicationContext
- 메이븐
- String
- IOC
- Kotlin for Java Developers
- AutoConfiguration
- ORM
- 링킹
- exception
- 토비의스프링3.1
- springboot
- 링커
- 클린코드
- beanfactory
- java
- JPA
- Spring
- 컴퓨터시스템
- 빌드툴
- 프록시
- 자바
- gradle
- Today
- Total
엔지니어로 가는 길
JVM 런타임 메모리 영역 본문
출처: https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register
JVM 런타임 메모리 영역
1. Program Counter(이하 PC)
2. JVM 스택
3. 힙
4. 메소드 영역
5. 런타임 상수 풀
6. 네이티브 메소드 스택
JVM 런타임 메모리 영역은 크게 두 가지로 그룹으로 나눌 수 있다.
@스레드별로 갖는 영역: PC, JVM 스택, 네이티브 메소드 스택
이 영역의 데이터는 스레드가 시작할 때 초기화되고, 스레드가 완료될 때 제거된다.
@모든 스레드가 공유하는 영역: 힙, 메소드 영역, 런타임 상수 풀
이 영역의 데이터는 JVM이 시작할 때 초기화되고, JVM이 종료될 때 제거된다.
1. PC
PC는 스레드에서 현재 실행중인 instruction을 가리킨다. 자바는 멀티스레딩을 지원하므로 PC는 새로운 스레드가 생성될 때마다 생성된다. (만약 현재 실행중인 메소드가 ‘native’하다면 PC의 값은 정의되지 않는다.)
2. JVM 스택
JVM 스택은 JVM의 프레임을 저장하는데 사용된다. JVM은 스택에 대해 어떤 직접적인 조작도 하지 않고 그냥 프레임을 저장한다. 스택의 메모리 크기는 고정적일 수도 있고 가변적일 수도 있다. 가변적인 크기는 필요에 따라 동적으로 확장된다. JVM 프레임은 메소드가 호출될 때 생성되며, 동적 링킹을 수행한다. JVM 스택은 스레드마다 생성되며 관리된다.
-StackOverflowError
JVM 스택의 크기가 고정적일 때, 메모리의 크기가 프로그램의 실행 동안 충분하지 않을 경우 일어나는 에러이다.
-OutOfMemoryError
동적 크기의 스택에서, 더 많은 공간이 필요하지만 할당가능한 공간이 없을 때 일어나는 에러이다.
3. 힙
클래스나 배열의 객체를 저장할 때 사용되는 곳으로 모든 스레드에서 공유하는 자원이다. 가비지 컬렉터가 활동하는 영역이기도하다. 힙은 가상머신이 시작할 때 생성되며, 메모리 회수는 가비지 컬렉터에 의해 자동으로 이루어진다. 런타임에 할당된 메모리가 충분하지 않을 경우 JVM은 OutOfMemoryError를 던질 수 있다.
4. 메소드 영역
클래스 이름, 경로, 클래스의 정적 변수, 메소드 데이터, 메소드, 생성자 코드, 동적 상수풀과 같이 클래스에 대한 정보를 가지고 있다. 메소드 영역은 JVM이 시작할 때 생성되며, 모든 스레드들이 공유한다. JVM은 런타임에 할당된 메모리가 충분하지 않을 경우 OutOfMemoryError를 던진다.
5. 런타임 상수 풀
클래스나 인터페이스가 생성되었을 때 JVM에 의해 생성된다. 클래스나 인터페이스에서 이용 가능한 상수 풀 테이블을 가지고 있다. 리터럴를 포함한다. 동적 상수풀을 할당할 메모리를 찾지 못하면 OutOfMemoryError가 발생한다.
6. 네이티브 메소드 스택
native 메소드를 지원하는 JVM은 네이티브 메소드 스택을 갖는다. 네이티브 메소드를 위해 사용되며 스레드마다 생성된다. 만약 네이티브 메소드가 JVM에 의해 로드될 수 없다면 네이티브 메소드 스택을 가질 필요 없다. JVM 스택과 마찬가지로 스택의 크기가 고정적이라면 StackOverflowError를, 가변적이지만 할당가능한 공간이 부족할 경우 OutOfMemoryError를 던진다.
'프로그래밍 > Java' 카테고리의 다른 글
JAVA 지역 클래스(Local Classes) (0) | 2020.05.20 |
---|---|
자바 스트림 API (0) | 2020.05.05 |
Java 중첩 클래스 (11) | 2020.04.23 |
Java 접근 제어자와 접근의 의미 (0) | 2020.04.21 |
논리 연산자 &, |와 &&, ||의 차이 (0) | 2020.04.10 |