| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 8174)
|
| +++ src/heap.cc (working copy)
|
| @@ -107,6 +107,7 @@
|
| cell_space_(NULL),
|
| lo_space_(NULL),
|
| gc_state_(NOT_IN_GC),
|
| + gc_post_processing_depth_(0),
|
| mc_count_(0),
|
| ms_count_(0),
|
| gc_count_(0),
|
| @@ -152,6 +153,29 @@
|
| max_semispace_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE;
|
| #endif
|
|
|
| + intptr_t max_virtual = OS::MaxVirtualMemory();
|
| +
|
| + if (max_virtual > 0) {
|
| + intptr_t half = max_virtual >> 1;
|
| + intptr_t quarter = max_virtual >> 2;
|
| + // If we have limits on the amount of virtual memory we can use then we may
|
| + // be forced to lower the allocation limits. We reserve one quarter of the
|
| + // memory for young space and off-heap data. The rest is distributed as
|
| + // described below.
|
| + if (code_range_size_ > 0) {
|
| + // Reserve a quarter of the memory for the code range. The old space
|
| + // heap gets the remaining half. There is some unavoidable double
|
| + // counting going on here since the heap size is measured in committed
|
| + // virtual memory and the code range is only reserved virtual memory.
|
| + code_range_size_ = Min(code_range_size_, quarter);
|
| + max_old_generation_size_ = Min(max_old_generation_size_, half);
|
| + } else {
|
| + // Reserve three quarters of the memory for the old space heap including
|
| + // the executable code.
|
| + max_old_generation_size_ = Min(max_old_generation_size_, half + quarter);
|
| + }
|
| + }
|
| +
|
| memset(roots_, 0, sizeof(roots_[0]) * kRootListLength);
|
| global_contexts_list_ = NULL;
|
| mark_compact_collector_.heap_ = this;
|
| @@ -771,11 +795,13 @@
|
|
|
| isolate_->counters()->objs_since_last_young()->Set(0);
|
|
|
| + gc_post_processing_depth_++;
|
| { DisableAssertNoAllocation allow_allocation;
|
| GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
|
| next_gc_likely_to_collect_more =
|
| isolate_->global_handles()->PostGarbageCollectionProcessing(collector);
|
| }
|
| + gc_post_processing_depth_--;
|
|
|
| // Update relocatables.
|
| Relocatable::PostGarbageCollectionProcessing();
|
| @@ -1610,7 +1636,8 @@
|
| map->set_prototype_transitions(empty_fixed_array());
|
| map->set_unused_property_fields(0);
|
| map->set_bit_field(0);
|
| - map->set_bit_field2((1 << Map::kIsExtensible) | (1 << Map::kHasFastElements));
|
| + map->set_bit_field2(1 << Map::kIsExtensible);
|
| + map->set_elements_kind(JSObject::FAST_ELEMENTS);
|
|
|
| // If the map object is aligned fill the padding area with Smi 0 objects.
|
| if (Map::kPadStart < Map::kSize) {
|
|
|