티스토리 뷰
런타임 데이터 영역(Runtime Data Area)
▶ PC Register
- 스레드 시작될 때 생성
- 현재 수행중인 JVM 명령 주소 갖음.
▶ JVM Stack
- 스레드 시작될 때 생성
- 스택 프레임 저장 및 추가, 제거
- 예외 발생 시 printStackTrack() 등의 메소드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임 표현
- 지역 변수도 스택
- 객체 레퍼런스 변수도 스택 ( 변수만!! 실제론 힙에 들어있음 )
* 스택 프레임 ?
- 메소드 수행 시 하나의 스택 프레임 생성 → JVM 스택에 추가 → 메소드 종료 → 스택 프레임 제거
- 지역 변수 배열 : 0부터 시작하는 인덱스를 가진 배열
- 피연산자 스택 : 메소드의 실제 작업공간, 각 메소드는 피연산자 스택과 지역변수 배열 사이의 데이터 교환, 다른 메소드 호출 결과를 추가하거나 꺼냄, 피연산자 스택 공간이 얼마나 필요한지는 컴파일 할 때 결정
- 런타임 상수풀 : 클래스 & 인터페이스의 상수 & 메소드의 필드에 대한 레퍼런스를 담음, 메소드 & 필드 참조 시 이걸 통해서 실제 메모리상 주소 찾아서 참조
- 네이티브 메소드 스택 : 자바 외 언어로 작성된 native 코드를 위한 스택
- 메소드 영역
> JVM 시작될 때 생성
> 클래스, 인터페이스에 대한 런타임 상수 풀, 필드, 메소드 정보, Static변수, 메소드의 바이트코드 등 보관
(Static은 Java8 때 Heap Area로 옮겨감)
- Heap 영역 (Garbage Collecter가 도는 영역이라 GC도 함께)
1. 새로 생성한 대부분의 객체는 Eden에 위치
2. Eden 영역에서 GC 발생 후 살아남으면 Survivor 영역 중 한 곳으로 이동
3. 하나의 Survivor 영역이 가득차면 그 중 살아남은 객체를 다른 Survivor 영역으로 이동. (가득찼던 곳은 데이터 비워짐)
4. 계속 반복하다가 끝까지 살아남은 객체는 Old영역으로 이동
5. Old 영역의 GC 방법은 D2 사이트 참고!
ps. 참조한 사이트(D2)를 보고 개인적인 공부를 위해 정리한겁니다.
생략된 내용도 많기 때문에 더 세밀하게 보고 싶으시다면 아래 사이트를 참고해주세요!
Reference
https://d2.naver.com/helloworld/1230
+ 내용 추가
- 인스턴스 변수 (class 내에 존재하지만 method 밖에 있는 변수) 는 객체 안에 저장된다. (class 객체의 heap 영역에)
- 원시 변수라면 Heap 영역에 원시 변수의 크기만큼 저장공간 생성
> int (32bit) 안에 32비트보다 적게 들어가 있더라도 32비트만큼 차지함.
- 객체 레퍼런스 변수라면 객체 레퍼런스 변수의 저장공간만 생성 ( 참조하는 객체를 저장할 공간 필요 없음 )
- 레퍼런스 변수에 새로운 객체를 대입하기 전까진 힙에 실제 객체가 만들어지지 않는다.
1 2 3 4 | public class CellPhone(){ private Antenna ant; // 힙에 antenna 객체 생성 안됨. private Antenna ant = new Antenna(); // 힙에 생성. | cs |
* 클래스를 만들면 컴파일러에서 생성자를 만들어 줌. ( public 클래스명(){} )
* 메소드와 다른 점은 리턴 유형이 없음.
* new로 객체를 생성하면 상속된 모든 객체들에 대한 인스턴스 변수나 메소드도 모두 해당 객체 안에 들어감.
- 객체의 레퍼런스를 제거하려면? (heap 메모리를 확보하려면?)
1. 레퍼런스가 영역을 벗어나야 한다.
1 2 3 | void go(){ Life f = new Life(); } | cs |
> 메소드가 종료되면 제거
2. 레퍼런스에 다른 객체 대입
1 2 3 4 | void go(){ Life f = new Life(); f = new Life(); } | cs |
3. 레퍼런스에 null 대입
1 2 3 4 | void go(){ Life f = new Life(); f = null; } | cs |
'JAVA' 카테고리의 다른 글
JAVA if문을 Enum을 활용해 적용하기 (0) | 2018.10.29 |
---|---|
JVM - 3 (Execution Engine, 실행 엔진) (0) | 2018.10.25 |
JVM - 1 (Class Loader, 클래스 로더) (0) | 2018.10.23 |
6장. 클래스 feat. 이것이 자바다 (0) | 2018.05.29 |
배열 속 랜덤 값 구하기(Collections.shuffle) (0) | 2018.02.07 |
- Total
- Today
- Yesterday
- 124 나라의 숫자
- codility
- 맵 api
- 타겟 넘버
- 완주하지 못한 선수
- 기능개발
- 다음 맵 api
- 최솟값
- cgv
- 텔레그램
- 예매 알림
- 노션트렐로광고X
- FrogJmp
- 파이팅코리아
- 자바
- API
- 프로그래머스
- 객체지향과 디자인패턴
- 알고리즘
- 쇠막대기
- 문자열 내 마음대로 정렬하기
- java
- Spring
- json
- 스프링 부트
- 더 나은 내일
- AWS
- 카카오인턴
- K번째수
- 안드로이드 스튜디오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |