일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- reactive
- spring reactive
- reactor core
- Spring Batch
- 웹 스터디
- 웹 커리큘럼
- Spring Framework
- ipTIME
- 서버운영
- 웹앱
- reactor
- 공유기 서버
- Today
- Total
Hello World
GC 를 통한 객체 소멸 시점 본문
이 글에서는, 생성된 객체가 GC 에 의해, 소멸되는 시점에 대해 테스트해볼 것이다.
Global Execution Context 내부
테스트 1
// global execution context function A(){} // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); console.log(obj) // object Object
HEAP MEMORY CHECK
해당 객체가 Heap Memory 영역에 존재하는것을 볼 수 있다.
테스트 2
// global execution context function A(){} // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); // obj 변수에 null 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. obj = null; console.log(obj) // null
HEAP MEMORY CHECK
obj = null
코드를 통해, 해당 객체를 GC 대상으로 만들었다.해당 객체가 Heap Memory 영역에서 소멸된 것을 볼 수 있다.
테스트 3
// global execution context function A(){} // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); // x 변수에 obj 값(객체 참조 포인터)을 할당한다. var x = obj; // obj 변수에 null 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. obj = null; // 해당 객체(new A())를 참조하는 대상(x 변수)이 아직 남아있기때문에, GC 에 의해 Heap Memory 영역에서 소멸되지않는다. console.log(x) // obj Object
HEAP MEMORY CHECK
해당 객체를 참조하는 대상이 아직 남아있기때문에, GC 에 의해 Heap Memory 영역에서 소멸되지않는다.
테스트 4
// global execution context function A(){} // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); // x 변수에 obj 값(객체 참조 포인터)을 할당한다. var x = obj; // obj 변수에 null 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. obj = null; // x 변수에 null 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. x = null; // x 변수에 새롭게 할당된 null 값이 반환된다. console.log(x) // null
HEAP MEMORY CHECK
해당 객체를 참조하는 대상이 모두 사라졌기때문에, 객체가 Heap Memory 영역에서 소멸된 것을 볼 수 있다.
반드시 null 값만 할당해야 하는가?
// global execution context function A(){} // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); // obj 변수에 다른 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. obj = 1; console.log(obj) // 1
HEAP MEMORY CHECK
null 값이 아닌, 다른 값을 할당해도, 객체는 Heap Memory 영역에서 소멸된다.
Function Execution Context 내부
x 변수에는 obj 변수에 할당된 객체 참조 포인터(값)가 할당된다.
// global execution context // obj 변수에 객체를 할당한다. var obj = {x: 1}; function B(){ // function execution context // x 변수를 obj 변수 값으로 초기화한다. // obj 변수 값: 객체 참조 포인터 var x = obj; // x 변수를 통해, 객체를 확장한다. x.y = 2; console.log(obj); // {x: 1, y: 2} } B();
테스트 1
// global execution context function A(){}; // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); function B(){ // function execution context // obj 변수에 null 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. obj = null; console.log(obj); } B();
HEAP MEMORY CHECK
예상했던대로, 객체는 Heap Memory 영역에서 소멸된다.
테스트 2
// global execution context function A(){}; // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); function B(){ // function execution context var x = obj; // obj 변수에 null 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. obj = null; console.log(obj); // null // 해당 객체(new A())를 참조하는 대상(x 변수)이 아직 남아있기때문에, GC 에 의해 Heap Memory 영역에서 소멸되지않았다. console.log(x); // object Object } B();
HEAP MEMORY CHECK
함수 종료 후(== AO 가 소멸되는 시점)에는 해당 객체를 참조하는 대상이 모두 사라졌기때문에, 객체가 Heap Memory 영역에서 소멸된 것을 볼 수 있다.
테스트 3
// global execution context function A(){}; // A 생성자 함수 객체를 통해 새로운 객체를 생성한다. var obj = new A(); function B(){ // function execution context // x 는 globalExecutionContext 내부 VO 의 새로운 속성으로 추가된다. x = obj; // === this.x = obj; // obj 변수에 null 값을 할당하여, 생성된 객체를 GC 대상으로 만든다. obj = null; console.log(obj); // null // 해당 객체(new A())를 참조하는 대상(x 변수)이 아직 남아있기때문에, GC 에 의해 Heap Memory 영역에서 소멸되지않았다. console.log(x); // object Object } B();
HEAP MEMORY CHECK
이 같은 경우, 함수 종료 후(== AO 가 소멸되는 시점)에도 해당 객체를 참조하는 대상(globalExecutionContext.VO.x)이 아직 남아있기때문에, 객체가 Heap Memory 영역에서 소멸되지 않는다.
테스트 결과
var x = obj
코드를 통해, x 변수에는 obj 변수에 할당된 객체 포인터(값)가 할당된다.생성된 객체는 그 객체를 참조하는 대상이 없을경우에만 GC 에 의해, Heap Memory 영역에서 소멸된다.
- 즉 null(or 다른 값) 값만 할당한다고 무조건 소멸되는 것은 아니다.
null 값이 아닌, 다른 값을 할당해도, 객체는 Heap Memory 영역에서 소멸된다.
JS 는 개발자가 직접 Heap Memory 영역에 할당된 객체를 소멸시킬 수 있는 방법을 제공하지 않는다.
- 즉
null
값을 할당하거나,delete
연산자를 통해 VO 의 속성을 삭제하는것은, 모두 간접적으로 GC를 통해, 객체를 소멸시키는 방법들이다.
- 즉
AO 의 속성으로 할당된 객체 참조는 함수 종료 시 모두 GC 에 의해 소멸된다.
참조 URL
출처: http://mohwa.github.io/blog/javascript/2015/10/30/variable-consider-inJS/
'Java > Core' 카테고리의 다른 글
[펌]Java HashMap은 어떻게 동작하는가? (0) | 2016.01.10 |
---|---|
[펌]람다가 이끌어 갈 모던 Java (0) | 2016.01.10 |
액터모델 맛만 보기 발표자료 (0) | 2016.01.10 |
Java 7: How to write really fast Java code (0) | 2016.01.10 |
[펌]JMeter Tutorial for Load Testing – The ULTIMATE Guide (0) | 2016.01.10 |