Hi, Mads and Erik,

If OOM happens, Are those heap resources still can be reclaimed if we call
v8::V8::Dispose()?


Or there would be memory leak until we exit the process?


Cheers~
Xiang



On Wed, Nov 25, 2009 at 4:31 PM, Xiang Zhong <[email protected]> wrote:

> Hi, Erik,
>
> Yes, you are right.
>
> I confuse setting heap limit with setting stack limit, which have to be set
> seperately by the doc for the latter.
>
> thanks~
>
> /**
>  * A set of constraints that specifies the limits of the runtime's memory
> use.
>  * You must set the heap size before initializing the VM - the size cannot
> be
>  * adjusted after the VM is initialized.
>  *
>  * If you are using threads then you should hold the *V8::Locker lock*while
>  * setting the stack limit and you must *set a non-default stack limit
> separately*
>  * for each thread.
>  */
> class V8EXPORT ResourceConstraints {
>
>
>
> On Wed, Nov 25, 2009 at 4:22 PM, Erik Corry <[email protected]> wrote:
>
>>
>> 2009/11/25 Xiang Zhong <[email protected]>:
>> > Suppose they speficy heap constraint seperately
>> > with SetResourceConstraints(ResourceConstraints* constraints)
>>
>> You can only use that interface once to set the heap size (and you
>> have to do it before initializing V8).  It applies to all threads.
>>
>> >
>> >
>> > On Wed, Nov 25, 2009 at 4:15 PM, Xiang Zhong <[email protected]>
>> wrote:
>> >>
>> >> Hi, Mads,
>> >>
>> >> Yeah, I see. Thanks for your answer.
>> >> Another question :-), if we enable multi-thread by v8::V8::Locker, will
>> >> other threads dead too if one thread encounter OOM?
>> >>
>> >> Sincerely~
>> >> Xiang
>> >>
>> >>
>> >>
>> >> On Wed, Nov 25, 2009 at 3:54 PM, Mads Sig Ager <[email protected]>
>> wrote:
>> >>>
>> >>> Nothing like that exists.  We do not know in advance that we are going
>> >>> to run out of memory.
>> >>>
>> >>> -- Mads
>> >>>
>> >>> On Wed, Nov 25, 2009 at 8:52 AM, Xiang Zhong <[email protected]>
>> wrote:
>> >>> >
>> >>> > Hi, Mads,
>> >>> >
>> >>> > Is there a way that the caller can get notified before an OOM
>> situation
>> >>> > happen?
>> >>> > If that is possible, the caller can call
>> v8::V8::TerminateExecution()
>> >>> > beforehand, and dispose the global object in time to free memory.
>> >>> > That will save v8 from being dead or crashing.
>> >>> >
>> >>> > We can hook a callback through SetGlobalGCEpilogueCallback() after
>> GC
>> >>> > happen, if we can get a flag some like "
>> >>> > GC_FAIL_GOING_TO_OUT_OF_MEMORY",
>> >>> > then it is possible to check the flag and terminate in time.
>> >>> > Does there exist something like that?
>> >>> >
>> >>> > Wishes~
>> >>> > Xiang
>> >>> >
>> >>> > On Wed, Nov 25, 2009 at 3:35 PM, Mads Sig Ager <[email protected]>
>> >>> > wrote:
>> >>> >>
>> >>> >> An out of memory situation can leave the VM in an inconsistent
>> state,
>> >>> >> so it is not possible to continue.  It is therefore the expected
>> >>> >> behavior that we cannot continue here.
>> >>> >>
>> >>> >> Cheers,    -- Mads
>> >>> >>
>> >>> >> On Wed, Nov 25, 2009 at 3:45 AM, Xiang <[email protected]> wrote:
>> >>> >> >
>> >>> >> > Hi, All,
>> >>> >> >
>> >>> >> > I have declared  v8::V8::IgnoreOutOfMemoryException(), and the
>> out
>> >>> >> > of
>> >>> >> > memory exception is caught by trycatch as expected.
>> >>> >> >
>> >>> >> > However, after disposing the current context, we can't create a
>> new
>> >>> >> > context.
>> >>> >> >
>> >>> >> > The handle is empty.
>> >>> >> >
>> >>> >> > Please check the following UT case:
>> >>> >> >
>> >>> >> > Reproduction steps
>> >>> >> > ---------------------------------------------------------
>> >>> >> > Please add the following case to test-api.cc,
>> >>> >> >
>> >>> >> > When creating a new context,
>> >>> >> >   v8::Persistent<v8::Context> context = v8::Context::New(0,
>> >>> >> > v8::Handle<v8::ObjectTemplate>(), v8::Handle<v8::Value>());
>> >>> >> > It will fail
>> >>> >> >
>> >>> >> > TEST(CreateNewContextAfterOutOfMemory) {
>> >>> >> >        // It's not possible to read a snapshot into a heap with
>> >>> >> > different
>> >>> >> > dimensions.
>> >>> >> >  if (v8::internal::Snapshot::IsEnabled()) return;
>> >>> >> >  // Set heap limits.
>> >>> >> >  static const int K = 1024;
>> >>> >> >  v8::ResourceConstraints constraints;
>> >>> >> >  constraints.set_max_young_space_size(256 * K);
>> >>> >> >  constraints.set_max_old_space_size(4 * K * K);
>> >>> >> >  v8::SetResourceConstraints(&constraints);
>> >>> >> >
>> >>> >> >  // Execute a script that causes out of memory.
>> >>> >> >  v8::HandleScope scope;
>> >>> >> >  {
>> >>> >> >    LocalContext context;
>> >>> >> >    v8::V8::IgnoreOutOfMemoryException();
>> >>> >> >    Local<Script> script =
>> >>> >> >
>>  Script::Compile(String::New(js_code_causing_out_of_memory));
>> >>> >> >    Local<Value> result = script->Run();
>> >>> >> >
>> >>> >> >    // Check for out of memory state.
>> >>> >> >    CHECK(result.IsEmpty());
>> >>> >> >    CHECK(context->HasOutOfMemoryException());
>> >>> >> >  }
>> >>> >> >
>> >>> >> >  {
>> >>> >> >        v8::Persistent<v8::Context> context = v8::Context::New(0,
>> >>> >> > v8::Handle<v8::ObjectTemplate>(), v8::Handle<v8::Value>());
>> >>> >> >
>> >>> >> >
>> >>> >> >        //Check here!
>> >>> >> >
>> >>> >> >        //I think we should  be allowed to create a new context
>> >>> >> >        //And the Handle should not be empty
>> >>> >> >        CHECK(!context.IsEmpty());
>> >>> >> >        context.Dispose();
>> >>> >> >        context.Clear();
>> >>> >> >  }
>> >>> >> > }
>> >>> >> > >
>> >>> >> >
>> >>> >
>> >>> >
>> >>> >
>> >>> > >
>> >>> >
>> >>>
>> >>>
>> >>
>> >
>> >
>> > >
>> >
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to