Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/heap/heap.h" | 5 #include "src/heap/heap.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/ast/scopeinfo.h" | 9 #include "src/ast/scopeinfo.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 1677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1688 if (collector->is_code_flushing_enabled()) { | 1688 if (collector->is_code_flushing_enabled()) { |
| 1689 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor); | 1689 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor); |
| 1690 } | 1690 } |
| 1691 } | 1691 } |
| 1692 | 1692 |
| 1693 { | 1693 { |
| 1694 TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE); | 1694 TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE); |
| 1695 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); | 1695 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| 1696 } | 1696 } |
| 1697 | 1697 |
| 1698 { | |
| 1699 // Copy objects marked black or grey by MarkCompact collector. | |
|
Hannes Payer (out of office)
2016/05/20 07:34:41
Scavenge objects...
Marcel Hlopko
2016/05/20 14:31:41
Done.
| |
| 1700 TRACE_GC(tracer(), | |
| 1701 GCTracer::Scope::SCAVENGER_OBJECTS_MARKED_BY_MARK_COMPACT); | |
| 1702 if (incremental_marking()->IsMarking()) { | |
| 1703 IterateMarkedForScavenger(&scavenge_visitor); | |
| 1704 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); | |
| 1705 } | |
| 1706 } | |
| 1707 | |
| 1698 if (FLAG_scavenge_reclaim_unmodified_objects) { | 1708 if (FLAG_scavenge_reclaim_unmodified_objects) { |
| 1699 isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending( | 1709 isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending( |
| 1700 &IsUnscavengedHeapObject); | 1710 &IsUnscavengedHeapObject); |
| 1701 | 1711 |
| 1702 isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots( | 1712 isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots( |
| 1703 &scavenge_visitor); | 1713 &scavenge_visitor); |
| 1704 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); | 1714 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| 1705 } else { | 1715 } else { |
| 1706 TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_OBJECT_GROUPS); | 1716 TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_OBJECT_GROUPS); |
| 1707 while (isolate()->global_handles()->IterateObjectGroups( | 1717 while (isolate()->global_handles()->IterateObjectGroups( |
| (...skipping 1337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3045 reinterpret_cast<Map*>(root(kTwoPointerFillerMapRootIndex))); | 3055 reinterpret_cast<Map*>(root(kTwoPointerFillerMapRootIndex))); |
| 3046 } else { | 3056 } else { |
| 3047 DCHECK_GT(size, 2 * kPointerSize); | 3057 DCHECK_GT(size, 2 * kPointerSize); |
| 3048 filler->set_map_no_write_barrier( | 3058 filler->set_map_no_write_barrier( |
| 3049 reinterpret_cast<Map*>(root(kFreeSpaceMapRootIndex))); | 3059 reinterpret_cast<Map*>(root(kFreeSpaceMapRootIndex))); |
| 3050 FreeSpace::cast(filler)->nobarrier_set_size(size); | 3060 FreeSpace::cast(filler)->nobarrier_set_size(size); |
| 3051 } | 3061 } |
| 3052 if (mode == ClearRecordedSlots::kYes) { | 3062 if (mode == ClearRecordedSlots::kYes) { |
| 3053 ClearRecordedSlotRange(addr, addr + size); | 3063 ClearRecordedSlotRange(addr, addr + size); |
| 3054 } | 3064 } |
| 3065 | |
| 3055 // At this point, we may be deserializing the heap from a snapshot, and | 3066 // At this point, we may be deserializing the heap from a snapshot, and |
| 3056 // none of the maps have been created yet and are NULL. | 3067 // none of the maps have been created yet and are NULL. |
| 3057 DCHECK((filler->map() == NULL && !deserialization_complete_) || | 3068 DCHECK((filler->map() == NULL && !deserialization_complete_) || |
| 3058 filler->map()->IsMap()); | 3069 filler->map()->IsMap()); |
| 3059 } | 3070 } |
| 3060 | 3071 |
| 3061 | 3072 |
| 3062 bool Heap::CanMoveObjectStart(HeapObject* object) { | 3073 bool Heap::CanMoveObjectStart(HeapObject* object) { |
| 3063 if (!FLAG_move_object_start) return false; | 3074 if (!FLAG_move_object_start) return false; |
| 3064 | 3075 |
| (...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4833 // Iterate over the partial snapshot cache unless serializing. | 4844 // Iterate over the partial snapshot cache unless serializing. |
| 4834 if (mode != VISIT_ONLY_STRONG_FOR_SERIALIZATION) { | 4845 if (mode != VISIT_ONLY_STRONG_FOR_SERIALIZATION) { |
| 4835 SerializerDeserializer::Iterate(isolate_, v); | 4846 SerializerDeserializer::Iterate(isolate_, v); |
| 4836 } | 4847 } |
| 4837 // We don't do a v->Synchronize call here, because in debug mode that will | 4848 // We don't do a v->Synchronize call here, because in debug mode that will |
| 4838 // output a flag to the snapshot. However at this point the serializer and | 4849 // output a flag to the snapshot. However at this point the serializer and |
| 4839 // deserializer are deliberately a little unsynchronized (see above) so the | 4850 // deserializer are deliberately a little unsynchronized (see above) so the |
| 4840 // checking of the sync flag in the snapshot would fail. | 4851 // checking of the sync flag in the snapshot would fail. |
| 4841 } | 4852 } |
| 4842 | 4853 |
| 4854 void Heap::IterateMarkedForScavenger(ObjectVisitor* visitor) { | |
| 4855 NewSpacePageIterator it(new_space_.from_space()); | |
| 4856 while (it.has_next()) { | |
| 4857 Page* page = it.next(); | |
| 4858 LiveObjectIterator<kAllLiveObjects> it(page); | |
| 4859 Object* object = nullptr; | |
| 4860 while ((object = it.Next()) != nullptr) { | |
| 4861 if (object->IsHeapObject()) { | |
| 4862 DCHECK(IsUnscavengedHeapObject(this, &object)); | |
| 4863 visitor->VisitPointer(&object); | |
| 4864 } | |
| 4865 } | |
| 4866 } | |
| 4867 } | |
| 4843 | 4868 |
| 4844 // TODO(1236194): Since the heap size is configurable on the command line | 4869 // TODO(1236194): Since the heap size is configurable on the command line |
| 4845 // and through the API, we should gracefully handle the case that the heap | 4870 // and through the API, we should gracefully handle the case that the heap |
| 4846 // size is not big enough to fit all the initial objects. | 4871 // size is not big enough to fit all the initial objects. |
| 4847 bool Heap::ConfigureHeap(int max_semi_space_size, int max_old_space_size, | 4872 bool Heap::ConfigureHeap(int max_semi_space_size, int max_old_space_size, |
| 4848 int max_executable_size, size_t code_range_size) { | 4873 int max_executable_size, size_t code_range_size) { |
| 4849 if (HasBeenSetUp()) return false; | 4874 if (HasBeenSetUp()) return false; |
| 4850 | 4875 |
| 4851 // Overwrite default configuration. | 4876 // Overwrite default configuration. |
| 4852 if (max_semi_space_size > 0) { | 4877 if (max_semi_space_size > 0) { |
| (...skipping 1503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6356 } | 6381 } |
| 6357 | 6382 |
| 6358 | 6383 |
| 6359 // static | 6384 // static |
| 6360 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6385 int Heap::GetStaticVisitorIdForMap(Map* map) { |
| 6361 return StaticVisitorBase::GetVisitorId(map); | 6386 return StaticVisitorBase::GetVisitorId(map); |
| 6362 } | 6387 } |
| 6363 | 6388 |
| 6364 } // namespace internal | 6389 } // namespace internal |
| 6365 } // namespace v8 | 6390 } // namespace v8 |
| OLD | NEW |