Thank you for your input, Forrest.

> You're never ending / destroying / disposing any of the responses,
> so they're just piling up inside the callback closures. 

In foo1, there is a "return" statement immediately after the asynchronous
   setTimeout(foo1,0);
so i would assume the responses are marked as GC-able after the return from the 
callback closure.

Therefore, i think the real culprit here is that setTimeout(foo1,0) never lets 
go of the next tick so GC never gets a chance to kick off.   Is that so?

Thanks.



On Wednesday, August 21, 2013 11:22:06 PM UTC-4, ming wrote:
>
> Hi,
> My node.js program crashed and i saw the following in the log:
>    FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
>
> i reduced the original program to the following tiny self-contained program:
>
> =============================
> ...
>
> function foo1()
> {
>   var someBadURI = ...;
>
>   http.get
>   (
>     someBadURI,
>     function(res)
>     {
>       if (res.statusCode != 200)
>       {
>         util.log("!!!!!   bad ....");
>         setTimeout(foo1,0);
>         return;
>       }  ...
>     }
>   )  ...
> }
>
> foo1();
> =============================
>
> If i let the program above run long enough (~30 minutes or more), the process 
> ran out of memory then crashed with the aforementioned error message but it 
> is not clear to me why:
>     FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
>
> However, the following program has been running for days without any problem:
>
> =============================
> function foo2()
> {
>   util.log("entering foo2");
>   setTimeout(foo2,0);
>   util.log("leavinging foo2");
> }
>
> foo2();
> =============================
>
> Why is that?   Should the V8 engine register the event and invoke the 
> callback/handler constantly with 0-wait setTimeout?   Why would it consume a 
> lot of memory?
>
> My guess is 
> * memory has been allocated for the http.get call in foo1.  
>   In foo2, there is only log printing which does not really consume any 
> resource (memory in this case)
>
> * the call
>      setTimeout(foo,0);
>   in foo1 always grabs the next tick so the GC never gets a chance to run
>
> Am i way off?   i'm unsure if i need to yank in scoped, handle, context, etc. 
> into my reasoning though for a better description.
>
> Thanks.
>
>

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to