// 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 |