dev_dbdb1114

[JAVA] HEAP영역과 STACK영역 Unreachable Object 본문

프로그래밍/JAVA

[JAVA] HEAP영역과 STACK영역 Unreachable Object

dbdb1114 2022. 12. 8. 18:10

비전공자에 프로그래밍을 배운지 1년 남짓한 요즘 이런 단어들 조차 어렵다. 

혹시 나와 같은 사람들이 있을까 싶어 글을 올린다.

public class Date01 {
	public static void main(String[] args) {
		int a = 0;
		String str = "자바";
	}
}

위 코드를 실행한다면, HEAP영역과 STACK영역에 어떻게 저장되는지 살펴보자.

가장 먼저 

 

위와 같이 HEAP영역에는 영향없이 STACK에만 저장될 것이다. 

어떤 것이 STACK에 저장되고 어떤 것이 HEAP에 저장될까?

원시형 데이터타입인 int, float, double, char, boolean 등 원시형 데이터타입은

모두 HEAP에는 저장되지 않고 STACK영역에 저장된다. 

 

자연스럽게 추론할 수 있는 것은 우리가 아는 데이터 타입은 크게 보면 두 가지다. 

원시형 데이터타입과 참조형 데이터타입 원시형 데이터타입은 STACK에 저장된다고 했으니 

당연히 나머지는 HEAP에 저장될 것이다. 다만 형태가 STACK과 다르다. 

참조형 변수인 String 값을 초기화한다면 아래와 같은 구조가 된다.

 

STACK에는 흔히 우리가 말하는 변수가 있고 해당 변수는 HEAP영역에 우리가 저장한 값을 가리키고 있다. 

우리가 원시타입 변수나 참조형 변수(배열, String, 사용자정의타입)를 선언하고 초기화할 때 위 그림과 같은 일이 일어난다. 

 

우리가 참조형 변수 str을 다른 값으로 바꾸면 어떻게 될까?

예를 들어 str = "바꾼거" 라고 코드를 작성하면 

str = "바꾼거";

 

그리고 이렇게 된 원래의 참조 값인 String "자바" 는 unreachable object라고 하며, 이러한 unreachable object를 GC가 처리한다.

 

아래 GC관련 포스팅된 블로그를 참조했다. 정말 설명 잘해놓으셨다. 리스펙.,,,

https://yaboong.github.io/java/2018/05/26/java-memory-management/

Comments