diff options
-rw-r--r-- | runtime/gc/accounting/space_bitmap.cc | 12 | ||||
-rw-r--r-- | runtime/gc/accounting/space_bitmap.h | 18 | ||||
-rw-r--r-- | runtime/gc/space/large_object_space_test.cc | 9 |
3 files changed, 30 insertions, 9 deletions
diff --git a/runtime/gc/accounting/space_bitmap.cc b/runtime/gc/accounting/space_bitmap.cc index 92b4360123..280c0b1d69 100644 --- a/runtime/gc/accounting/space_bitmap.cc +++ b/runtime/gc/accounting/space_bitmap.cc @@ -48,16 +48,21 @@ SpaceBitmap<kAlignment>* SpaceBitmap<kAlignment>::CreateFromMemMap( CHECK(mem_map != nullptr); uintptr_t* bitmap_begin = reinterpret_cast<uintptr_t*>(mem_map->Begin()); const size_t bitmap_size = ComputeBitmapSize(heap_capacity); - return new SpaceBitmap(name, mem_map, bitmap_begin, bitmap_size, heap_begin); + return new SpaceBitmap(name, mem_map, bitmap_begin, bitmap_size, heap_begin, heap_capacity); } template<size_t kAlignment> -SpaceBitmap<kAlignment>::SpaceBitmap(const std::string& name, MemMap* mem_map, uintptr_t* bitmap_begin, - size_t bitmap_size, const void* heap_begin) +SpaceBitmap<kAlignment>::SpaceBitmap(const std::string& name, + MemMap* mem_map, + uintptr_t* bitmap_begin, + size_t bitmap_size, + const void* heap_begin, + size_t heap_capacity) : mem_map_(mem_map), bitmap_begin_(reinterpret_cast<Atomic<uintptr_t>*>(bitmap_begin)), bitmap_size_(bitmap_size), heap_begin_(reinterpret_cast<uintptr_t>(heap_begin)), + heap_limit_(reinterpret_cast<uintptr_t>(heap_begin) + heap_capacity), name_(name) { CHECK(bitmap_begin_ != nullptr); CHECK_NE(bitmap_size, 0U); @@ -89,6 +94,7 @@ void SpaceBitmap<kAlignment>::SetHeapLimit(uintptr_t new_end) { if (new_size < bitmap_size_) { bitmap_size_ = new_size; } + heap_limit_ = new_end; // Not sure if doing this trim is necessary, since nothing past the end of the heap capacity // should be marked. } diff --git a/runtime/gc/accounting/space_bitmap.h b/runtime/gc/accounting/space_bitmap.h index 2fe6394c0f..b49e0b7f89 100644 --- a/runtime/gc/accounting/space_bitmap.h +++ b/runtime/gc/accounting/space_bitmap.h @@ -163,6 +163,7 @@ class SpaceBitmap { void SetHeapSize(size_t bytes) { // TODO: Un-map the end of the mem map. + heap_limit_ = heap_begin_ + bytes; bitmap_size_ = OffsetToIndex(bytes) * sizeof(intptr_t); CHECK_EQ(HeapSize(), bytes); } @@ -173,7 +174,7 @@ class SpaceBitmap { // The maximum address which the bitmap can span. (HeapBegin() <= object < HeapLimit()). uint64_t HeapLimit() const { - return static_cast<uint64_t>(HeapBegin()) + HeapSize(); + return heap_limit_; } // Set the max address which can covered by the bitmap. @@ -196,8 +197,12 @@ class SpaceBitmap { private: // TODO: heap_end_ is initialized so that the heap bitmap is empty, this doesn't require the -1, // however, we document that this is expected on heap_end_ - SpaceBitmap(const std::string& name, MemMap* mem_map, uintptr_t* bitmap_begin, size_t bitmap_size, - const void* heap_begin); + SpaceBitmap(const std::string& name, + MemMap* mem_map, + uintptr_t* bitmap_begin, + size_t bitmap_size, + const void* heap_begin, + size_t heap_capacity); template<bool kSetBit> bool Modify(const mirror::Object* obj); @@ -211,10 +216,13 @@ class SpaceBitmap { // Size of this bitmap. size_t bitmap_size_; - // The base address of the heap, which corresponds to the word containing the first bit in the - // bitmap. + // The start address of the memory covered by the bitmap, which corresponds to the word + // containing the first bit in the bitmap. const uintptr_t heap_begin_; + // The end address of the memory covered by the bitmap. This may not be on a word boundary. + uintptr_t heap_limit_; + // Name of this bitmap. std::string name_; }; diff --git a/runtime/gc/space/large_object_space_test.cc b/runtime/gc/space/large_object_space_test.cc index 79b775a510..9baa016dcd 100644 --- a/runtime/gc/space/large_object_space_test.cc +++ b/runtime/gc/space/large_object_space_test.cc @@ -38,12 +38,19 @@ void LargeObjectSpaceTest::LargeObjectTest() { Thread* const self = Thread::Current(); for (size_t i = 0; i < 2; ++i) { LargeObjectSpace* los = nullptr; + const size_t capacity = 128 * MB; if (i == 0) { los = space::LargeObjectMapSpace::Create("large object space"); } else { - los = space::FreeListSpace::Create("large object space", nullptr, 128 * MB); + los = space::FreeListSpace::Create("large object space", nullptr, capacity); } + // Make sure the bitmap is not empty and actually covers at least how much we expect. + CHECK_LT(static_cast<uintptr_t>(los->GetLiveBitmap()->HeapBegin()), + static_cast<uintptr_t>(los->GetLiveBitmap()->HeapLimit())); + CHECK_LE(static_cast<uintptr_t>(los->GetLiveBitmap()->HeapBegin() + capacity), + static_cast<uintptr_t>(los->GetLiveBitmap()->HeapLimit())); + static const size_t num_allocations = 64; static const size_t max_allocation_size = 0x100000; std::vector<std::pair<mirror::Object*, size_t>> requests; |