1. Overall

    Spider Monkey는 Object나 String에 할당된 Memory를 JAVA와 같이 Garbage Collector를 통해 해제하는데 
    Garbage Collector가 호출되는 시점은 크게 두가지로 나뉜다.
    1) JS_NewRuntime(메모리 량 in byte); 함수에서 요구한 Memory를 전부사용하였을 때 자동으로 호출된다.
    2) JS_GC() or JS_MaybeGC() 함수를 통해 수동으로 호출할 수 있다. JS_GC()와 JS_MaybeGC() 의 
        차이점은 JS_GC() 함수의 경우 무조건 Garbage Collector를 호출하는 반면 JS_MaybeGC() 함수의 경우는
        Runtime에서 사용되고 있는 Memory량을 참고하여 Garbage Collector를 호출할 지 말지를 판단한다.
    위와 같은 방법으로 Garbage Collecting을 수행하게 되는데 GC작업은 performance에 좋지 않은 영향을 
    초래하기 때문에 JS_NewRuntime시에 ‘적절한'(참 모호한 표현입니다) 양의 Memory를 요구해야 한다.
    1)번과 같은 방법으로 Garbage Collector가 호출되는 시점은 memory를 많이 사용하는 작업을 수행중일 때 
   호출 될 확률이 높다. Memory를 많이 사용한다는 것은 중요한 작업일 확률도 높은데 이 작업이 GC에 의해서
    Pending된다는 것은 좋은 결과가 아니다.
    따라서 만약에 Application이 idle한 timing을 알 수 있다면 이때 JS_GC나 JS_MaybeGC를 통해 미리 쓰레기 처리를
    해주는 것이 낫다.
2. Mark-and-Sweep Garbage Collector
    Spider Monkey의 Garbage Collector는 Mark-and-Sweep 방식을 사용한다.
    1) Mark : 쓰레기 개체를 인식하는 작업을 수행한다. 
                  Pointer들을 분석하여 해당 Memory block을 Pointing하고 있는 Pointer가 하나도 없을때,
                  즉 Memory Block이 unreachable 상태가 되었을때 쓰레기 개체로 분류된다.
    2) Sweep : 쓰레기 개체로 분류된 Memory를 회수한다. 
   
3. Garbage Collector로 부터 Object나 value를 보호하는 방법
    Garbage Collector로 부터 Data를 보호하기 위해서는 Data를 Reachable한 상태로 만들어야 한다.
    *rval이나 argv array에 값을 저장하거나 JS_AddRoot() 함수를 통해 root에 등록함으로써 Garbage Collect되는 것을
    막을 수 있다.