--Sorry, I forgot to CC v8-dev 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 Nov 25, 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 -~----------~----~----~----~------~----~------~--~---
