Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

Java - Runtime Data area(메모리)의 Method 영역, Heap 영역, Stack 영역 본문

Self Study Java

Java - Runtime Data area(메모리)의 Method 영역, Heap 영역, Stack 영역

Jelly-fish 2023. 9. 10. 23:39

Method 영역 : JVM이 실행될 때 생성된다. 코드에서 작성된 클래스를 클래스 로더로 읽어

static Field(정적 필드, static으로 선언된 변수와 메소드들)와, 클래스 코드, 생성자 코드, 상수를 분류하여 저장한다.

 

 → 메소드 영역 : static 필드, 클래스, 생성자, 상수 저장.

 

 

Heap 영역 : 객체와 배열을 생성한다. 여기에 생성된 객체와 배열은 Stack 영역의 변수나, 다른 객체의 Field에서 참조한다. 만약, Heap 영역에 존재하는 객체와 배열 중에서 더 이상 다른 곳에서 참조하지 않는 데이터가 있을 경우 의미 없는 객체가 되어 Garvage Collector가 자동으로 제거한다.

 

→ Heap 영역 : 객체, 배열 저장.

 

 

Stack 영역 : 메소드를 호출할 때마다 프레임(Frame)을 생성한다. 메소드가 종료되면 그 프레임을 제거한다. 프레임 내부에는 Local 변수 Stack이 존재하며 이 내부에서 기본타입 변수와, 참조타입 변수가 추가 되거나 제거된다. (생성 : push, 제거 : pop) 기본 타입 변수의 경우 Stack 영역에서 직접 값을 갖고 있으며, 참조 타입 변수의 경우 Heap 영역의 객체와 배열을 참조하기 위해 그 객체의 Heap영역 번지수(address)를 갖고 있다.

 

→ Stack 영역 : 기본 타입 변수, 참조 타입 변수 저장. 기본 타입 변수는 실제 값을 저장. 참조 타입 변수는 Heap 영역의 참조 주소를 저장.

 

null - Heap 영역의 객체를 참조하지 않는다는 뜻으로, 참조 변수만 사용할 수 있는 값. 참조 변수를 선언만 했을 경우 초기값으로 사용된다. 

 

String 클래스의 특징 - String 또한 참조 변수의 일종이다. String 변수는 String 문자열을 그대로 저장하고 있는 것이 아니라, Heap 영역에 저장된 String 문자열의 번지 수(address)를 갖고 Heap 영역의 객체를 참조한다. 

 

String 문자열이 동일할 때 - Java에서는 동일한 문자열을 갖는 변수를 두 개 이상으로 선언했을 때, 그 문자열을 공유하도록 설계되어 있다. 따라서, 같은 문자열이라도 서로 다른 객체로 저장하고 싶다면 객체 생성 연산자 new 연산자를 통해 같은 문자 리터럴이라도 다른 객체를 가질 수 있도록 할 수 있다.

// [① 같은 문자 리터럴을 갖는 변수를 new 연산자 없이 선언]
String a = "apple";
String b = "apple";

// 참조 변수이므로, == 연산을 통해 주소 값이 같은지를 확인한다.
// 내부 문자열을 비교하고 싶을 경우("apple")
// a.equals(b)와 같은 형태로 작성한다.
System.out.println(a == b);	//--> 주소 값 동일한지 확인!


// [② 같은 문자 리터럴을 갖는 변수를 객체 생성 연산자 new를 통해 선언]
String c = new String("grape");
String d = new String("grape");

System.out.println(c == b); //--> 주소 값 동일한지 확인!

 

// [실행 결과]

true	// → 문자열 리터럴의 Heap 영역 주소 값이 동일하다!    (서로 같은 객체 참조)
false	// → 문자열 리터럴의 Heap 영역 주소 값이 서로 다르다. (서로 다른 객체 참조)