diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-01-10 11:09:06 -0800 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-01-10 11:24:47 -0800 |
commit | db7f37d57b6ac83abe6815d0cd5c50701b6be821 (patch) | |
tree | 842c409305d1c5a2b48171889ecd5f7284822f3b /runtime/gc/collector/mark_sweep.cc | |
parent | 9a612c6b38c158a199b3cbe469286090b72767ca (diff) | |
download | art-db7f37d57b6ac83abe6815d0cd5c50701b6be821.zip art-db7f37d57b6ac83abe6815d0cd5c50701b6be821.tar.gz art-db7f37d57b6ac83abe6815d0cd5c50701b6be821.tar.bz2 |
Refactor large object sweeping.
Moved basic sweeping logic into large_object_space.cc.
Renamed SpaceSetMap -> ObjectSet.
Change-Id: I938c1f29f69b0682350347da2bd5de021c0e0224
Diffstat (limited to 'runtime/gc/collector/mark_sweep.cc')
-rw-r--r-- | runtime/gc/collector/mark_sweep.cc | 22 |
1 files changed, 4 insertions, 18 deletions
diff --git a/runtime/gc/collector/mark_sweep.cc b/runtime/gc/collector/mark_sweep.cc index 937ff6d..5d450a7 100644 --- a/runtime/gc/collector/mark_sweep.cc +++ b/runtime/gc/collector/mark_sweep.cc @@ -465,7 +465,7 @@ inline void MarkSweep::MarkObjectNonNull(const Object* obj) { bool MarkSweep::MarkLargeObject(const Object* obj, bool set) { // TODO: support >1 discontinuous space. space::LargeObjectSpace* large_object_space = GetHeap()->GetLargeObjectsSpace(); - accounting::SpaceSetMap* large_objects = large_object_space->GetMarkObjects(); + accounting::ObjectSet* large_objects = large_object_space->GetMarkObjects(); if (kProfileLargeObjects) { ++large_object_test_; } @@ -1112,8 +1112,8 @@ void MarkSweep::SweepArray(accounting::ObjectStack* allocations, bool swap_bitma } // Handle the large object space. space::LargeObjectSpace* large_object_space = GetHeap()->GetLargeObjectsSpace(); - accounting::SpaceSetMap* large_live_objects = large_object_space->GetLiveObjects(); - accounting::SpaceSetMap* large_mark_objects = large_object_space->GetMarkObjects(); + accounting::ObjectSet* large_live_objects = large_object_space->GetLiveObjects(); + accounting::ObjectSet* large_mark_objects = large_object_space->GetMarkObjects(); if (swap_bitmaps) { std::swap(large_live_objects, large_mark_objects); } @@ -1163,23 +1163,9 @@ void MarkSweep::Sweep(bool swap_bitmaps) { void MarkSweep::SweepLargeObjects(bool swap_bitmaps) { TimingLogger::ScopedSplit("SweepLargeObjects", &timings_); - // Sweep large objects - space::LargeObjectSpace* large_object_space = GetHeap()->GetLargeObjectsSpace(); - accounting::SpaceSetMap* large_live_objects = large_object_space->GetLiveObjects(); - accounting::SpaceSetMap* large_mark_objects = large_object_space->GetMarkObjects(); - if (swap_bitmaps) { - std::swap(large_live_objects, large_mark_objects); - } - // O(n*log(n)) but hopefully there are not too many large objects. size_t freed_objects = 0; size_t freed_bytes = 0; - Thread* self = Thread::Current(); - for (const Object* obj : large_live_objects->GetObjects()) { - if (!large_mark_objects->Test(obj)) { - freed_bytes += large_object_space->Free(self, const_cast<Object*>(obj)); - ++freed_objects; - } - } + GetHeap()->GetLargeObjectsSpace()->Sweep(swap_bitmaps, &freed_objects, &freed_bytes); freed_large_objects_.FetchAndAdd(freed_objects); freed_large_object_bytes_.FetchAndAdd(freed_bytes); GetHeap()->RecordFree(freed_objects, freed_bytes); |