"이것이 자바다" 정리5-1 java 메모리 구조에 대하여

2023. 2. 15. 15:27자바/이론 공부

이 게시글은 내가 "이것이 자바다" 책을 읽고 노트에 정리해놨던 내용들을 검색하기 쉽게 데이터로 백업하는 용도의 글이다.

 

문제가 된다면 삭제하겠음.

 

 

 

 

5장 참조타입

5-1 java 메모리 구조에 대하여

 

 

*자바의 데이터 타입

-기본 타입(primitive type) : 정수, 실수, 문자, 논리 리터럴.

-참조 타입(reference type) : 배열, 열거, 클래스, 인터페이스 // 객체(object)의 번지를 참조하는 타입

 

 

*기본 타입은 선언된 변수가 실제 값을 가지지만

참조 타입은 선언된 변수가 메모리의 번지를 값으로 가짐.

번지를 통해 객체를 참조함.

 

 

*변수는 스택(stack)에 생성되고 객체는 힙(heap)에 생성된다.

 

스택                                                                                       힙

int a = 5;

String s = 100번지;(주소가 저장. 주소는 스택)              =>   100번지 ("Hi") << 값 저장은 힙에

(힙 영역의 String객체 주소 값을 가지고 있음)

 

 

*메모리 사용 영역 (Runtime Data Area) <OS가 JVM에게 할당해줌.

 

1. 메소드 영역

 - 클래스 별로 런타임상수풀(runtime contant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(constructor) 코드 등을 분류해서 저장.

JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.(종료시에는 사라지는 영역.)

 

+) 전역변수와 정적 멤버 변수(static변수)는 이 영역에 저장된다. 프로그램 시작부터 종료될 때까지 메모리가 남아있게 되고, 따라서 프로그램 종료전까지 어디서든 사용이 가능하다.

 

 @ Method Area에서 저장하는 데이터

ⅰ) type information(타입정보)

    - type의 전체 이름 ( 여기서 말하는 type이라는게 변수타입을 말하는게 맞는지...? 클래스 말하는건지 어떤걸 말하는건지 잘 모르겠다..!)

    - type의 직계 하위 클래스 전체 이름

    - type 클래스 / 인터페이스 여부

    - type의 modifier(public / abstract / final)

    - 연관된 인터페이스 이름 리스트

 

ⅱ) runtime constant pool 런타임 상수 풀

    - type의 모든 상수정보를 갖고 있음.(static final)

    - type, field, method의 모든 symbolic reference 정보 저장. (symbolic referebce란 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아닌 참조하는 대상의 이름만을 지칭한 것이다!)

    - constant pool의 entry는 인덱스 번호를 통해 접근(이게 무슨 소린지 모르겠다)

    - object(객체)의 접근 등 모든 참조를 위한 핵심 요소 -> JVM이 runtime contant pool을 통해 실제 메모리상 주소를 찾아 참조한다.

 

ⅲ) field information 필드정보

    - field type

    - field modifier 필드 제어자( public / private / protected / static / final / volatile / transient)

 

ⅳ) method information 메서드 정보

    - constructor(생성자)를 포함한 모든 메서드

    - method name

    - method return type

    - method parameter(매개변수) 수와 type

    - method modifier(제어자) (public / private / protected / static / final / syncronized / native / abstract)

    - method 구현 부분이 있을 경우 ( abstract(추상메서드) 또는 native(c/c++ 코드 사용)가 아닐 경우)

    - method bytecode

    - method의 stackframe의 operand stack(메소드 내 계산을 위한 작업 공간) 및 local variable section(지역 변수 : 메소드안에 선언된 변수)의 크기

    - exception table(예외처리를 말하는 것으로 추측. table은 뭘까..?)

 

ⅴ) class variable 클래스 변수 : 클래스 변수는 static 키워드로 선언된 변수를 의미함.

    - 모든 인스턴스에 공유되며 인스턴스가 없어도 직접 접근 가능

    - 클래스변수는 인스턴스의 것이 아니라 클래스에 속하게 됨.

    - 클래스를 사용하기 이전에 이 변수들은 미리 메모리를 할당받은 상태

    - final class 변수는 상수로 치환되어 runtime constant pool에 값을 복사.

    - static 변수는 해당 영역에 저장되지만 기본형이 아닌 static 클래스형 변수는 레퍼런스 변수(참조타입)만 저장되고 실제 인스턴스는 heap에 저장. (static변수는 runtime constant pool에 저장. but static 클래스형 변수는 사정이 좀 다르다! 를 말하는 것 같음. 확실 x.)

 

 

2. 힙 영역 heap area

 - 객체와 배열이 생성되는 영역.

 - 힙에 생성된 객체와 배열은 JVM 스택영역의 변수나 다른 객체의 필드에서 참조. (변수나 필드에서 선언된 객체와 배열은 stack에 주소값을 갖고 힙에 값을 가짐.)

 - JVM이 관리하는 프로그램에서 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용하는 영역

 - new 연산자로 생성된 객체, 인스턴스와 배열을 저장

 - 참조하는 변수나 필드가 없으면(null값이거나 null이 되면) JVM은 GC ( Garbage Collector)를 실행시켜 힙 영역에서 자동으로 제거.

 

ⅰ) Eden ( young generation)

    - 객체가 생성되면 처음에 저장되는 공간.

    - 일정 시간이되고 Eden의 공간이 꽉 차면 해당 데이터는 Survivor 1로 복사. 이때 쓸모없는 데이터는 minor GC에 의해 삭제됨.

 

ⅱ)Survivor 1&2 ( young generation)

    - Eden에서 살아남은 데이터가 옯겨짐.

    - 공간이 부족해지면 쓸모없는 데이터는 minor GC에 의해 삭제되고 old로 데이터를 보냄

 

ⅲ)Old(tenured generation)

    - young generation에서 살아남은 객체가 저장되는 곳.

    - 오래 사용된, 크기가 큰 객체가 대부분임.

    - Old의 공간이 꽉 차면 major GC가 실행됨.

    - major GC는 객체들이 살아있는 여부를 파악하기 위해서 모든 쓰레드의 실행을 멈추고 heap을 대대적으로 정리함.

    - minor에 비해 자원, 시간이 많이 소모됨.

 

ⅳ)Permanent

    - class의 meta정보, method의 meta정보, static 변수와 상수 정보들이 저장되는 공간이었으나 java8부터 meta space 영역이 되어 native 메모리 영역으로 관리가 넘어감.

 

 

3. JVM 스택 영역. stack (내가 아는 stack 클래스하고 stack 영역하고 같은 건가..?)

 - 각 스레드마다 하나씩 존재. 스레드가 시작될 때 할당.

 - JVM스택은 메소드를 호출할때마다 프레임 Frame을 추가 push 하고 메소드가 종료되면 해당 프레임을 제거 pop하는 동작 수행.

 - 프레임 내부에는 로컬 변수 스택이 있음. 기본타입 변수가 추가 push되거나 제거 pop됨. => 변수가 이 영역에 생성되는 시점은 초기화때.(최초로 값이 저장될 때)

 - 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거됨.

 - 기본 타입 변수는 스택 영역에 직접 값을 갖고 있음.

 - 참조 타입 변수는 값이 아니라 힙 영역이나 메소드영역의 객체 주소를 가짐.

 - 자바에서 메소드 호출시 메소드의 stack frame이 저장되는 영역

 - stack frame 안에는 지역변수, 인자값, 리턴값 등이 저장

 

@과정

main 스레드만 존재시, stack frame은 한개만 존재. -> 메서드 호출. stack frame 하나 새로 생성. push. -> 생성된 stack frame에 메서드와 관계된 지역변수, 매개변수 등을 스택 영역에 저장 -> 메서드 호출 완료시 스택 영역은 소멸 pop

 

+) 기본자료형등의 지역변수는 method 영역에 저장되는 static 변수와 다르게 stack 영역에 저장되기때문에 메서드 밖에서는 사용이 불가능함.

 

 

4. PC Resisters

 - 스레드가 하나씩 생성될 때 생성됨. 각 스레드마다 존재.

 - 현재 실행중인 JVM의 명령 주소를 갖고 있는 영역

 - stack 내에서 작동

 

 

5. native stack

 - java 이외의 언어로 만들어진 코드들을 위한 stack.

 

 

'자바 > 이론 공부' 카테고리의 다른 글

[Java] HashMap, LinkedHashMap, HashSet, LinkedHashSet  (0) 2023.02.15
[Java] Stack 과 Queue  (0) 2023.02.15
"이것이 자바다" 정리4  (0) 2023.02.13
"이것이 자바다" 정리3  (0) 2023.02.10
"이것이 자바다" 정리2  (0) 2023.02.09