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