본문 바로가기

JAVA/DAY 08 _ 23.08.28

메모리의 소멸

// heap메모리의 소멸
// 메모리를 해제하지 않으면 메모리 누수가 발생하여 시스템 성능 저하나 리소스 낭비 등의 문제를 유발할 수 있음

// 1. stack메모리에 arr1생성, heap메모리에 00000 배열을 가진 0xFF11 주소값이 생성, arr1에 (0xFF11) 주소값 부여함
// 2. stack메모리에 arr2생성, heap메모리에 000   배열을 가진 0xFF22 주소값이 생성, arr1에 (0xFF22) 주소값 부여함
// 3. heap메모리의 주소값을 가르키는 참조변수(arr1, arr2)가 사라지면 heap메모리가 소멸이 된다!
//    = stack메모리가 소멸되면서(참조변수가 사라지면시) 가비지 컬렉션(Garbage Collection)이라는 메커니즘을 통해 동적 할당된 메모리를 자동으로 해제한다.

 

int[] arrOuter = null;			// 1.

{
    int[] arr1 = new int[5]; 		// 2.
    int[] arr2 = new int[3];		// 3.

    arrOuter = arr2;			// 4.
    arr2[1] = 50;			// 5.
    arrOuter[0] = 70;			// 6.		
}					// 7.

System.out.println(arrOuter[0]);	// 70
System.out.println(arrOuter[1]);	// 50 --> 나는 arrOuter 1에 값을 넣은적이 없는데..?
					//-> 소멸생성순서를 보자!

 

// 소멸 생성 순서
// 1. stack메모리에 arrOuter생성, heap은 아무것도 없는 상태
// 2. stack메모리에 arr1 생성, heap에 00000 배열을 가진 0xFF11 주소값 생성, arr1에 0xFF11 값 부여
// 3. stack메모리에 arr2 생성, heap에 000   배열을 가진 0xCC11 주소값 생성, arr2에 0xCC11 값 부여
// 4. arr2 자체는 '0xCC11을 가르키라는 것'을 의미하는거임 ---> arrOuter는 0xCC11을 가르키게 됨
// 5. arr2가 가르키는 메모리(0xCC11)에 접근을 해서 [1]에 해당하는 곳에 50을 넣음
// 6. arrOuter가 가르키는 메모리(0xCC11)에 접근을 해서 [0]에 해당하는 곳에 70을 넣음
// 7. 스코프를 빠져나오면 arr1, arr2는 소멸됨 (= 0xFF11을 가르키는 참조변수가 소멸됨)
//    --> heap메모리의 0xFF11은 소멸된다 ★★★ 

// 내생각 : int a = 0; 으로 a라는 변수를 생성한 것 처럼, int[] X = null;로 X라는 배열변수를 생성한거지?

'JAVA > DAY 08 _ 23.08.28' 카테고리의 다른 글

이중배열  (0) 2023.09.04
메모리2  (0) 2023.09.04
참조변수 & 힙메모리  (0) 2023.09.04
배열2  (0) 2023.09.04
배열1  (0) 2023.09.04