diff options
| -rw-r--r-- | runtime/gc/collector/mark_compact.cc | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/runtime/gc/collector/mark_compact.cc b/runtime/gc/collector/mark_compact.cc index 3c2606a6d7..1751994b08 100644 --- a/runtime/gc/collector/mark_compact.cc +++ b/runtime/gc/collector/mark_compact.cc @@ -1434,6 +1434,7 @@ void MarkCompact::CompactPage(mirror::Object* obj, uint32_t offset, uint8_t* addr, bool needs_memset_zero) { + mirror::Object* first_obj = obj; DCHECK(moving_space_bitmap_->Test(obj) && live_words_bitmap_->Test(obj)); DCHECK(live_words_bitmap_->Test(offset)) << "obj=" << obj @@ -1525,7 +1526,25 @@ void MarkCompact::CompactPage(mirror::Object* obj, + kPageSize)); } obj_size = RoundUp(obj_size, kAlignment); - DCHECK_GT(obj_size, offset_within_obj); + CHECK_GT(obj_size, offset_within_obj) + << "obj:" << obj + << " class:" + << obj->GetClass<kDefaultVerifyFlags, kWithFromSpaceBarrier>() + << " to_addr:" << to_ref + << " first-obj:" << first_obj + << " black-allocation-begin:" << reinterpret_cast<void*>(black_allocations_begin_) + << " post-compact-end:" << reinterpret_cast<void*>(post_compact_end_) + << " offset:" << offset * kAlignment + << " class-after-obj-iter:" + << (class_after_obj_iter_ != class_after_obj_ordered_map_.rend() ? + class_after_obj_iter_->first.AsMirrorPtr() : nullptr) + << " last-reclaimed-page:" << reinterpret_cast<void*>(last_reclaimed_page_) + << " last-checked-reclaim-page-idx:" << last_checked_reclaim_page_idx_ + << " offset-of-last-idx:" + << pre_compact_offset_moving_space_[last_checked_reclaim_page_idx_] * kAlignment + << " first-obj-of-last-idx:" + << first_objs_moving_space_[last_checked_reclaim_page_idx_].AsMirrorPtr(); + obj_size -= offset_within_obj; // If there is only one stride, then adjust last_stride_begin to the // end of the first object. @@ -1571,6 +1590,26 @@ void MarkCompact::CompactPage(mirror::Object* obj, MemberOffset(0), MemberOffset(end_addr - (addr + bytes_done))); obj_size = RoundUp(obj_size, kAlignment); + CHECK_GT(obj_size, 0u) + << "from_addr:" << obj + << " from-space-class:" + << obj->GetClass<kDefaultVerifyFlags, kWithFromSpaceBarrier>() + << " to_addr:" << ref + << " first-obj:" << first_obj + << " black-allocation-begin:" << reinterpret_cast<void*>(black_allocations_begin_) + << " post-compact-end:" << reinterpret_cast<void*>(post_compact_end_) + << " offset:" << offset * kAlignment + << " bytes_done:" << bytes_done + << " class-after-obj-iter:" + << (class_after_obj_iter_ != class_after_obj_ordered_map_.rend() ? + class_after_obj_iter_->first.AsMirrorPtr() : nullptr) + << " last-reclaimed-page:" << reinterpret_cast<void*>(last_reclaimed_page_) + << " last-checked-reclaim-page-idx:" << last_checked_reclaim_page_idx_ + << " offset-of-last-idx:" + << pre_compact_offset_moving_space_[last_checked_reclaim_page_idx_] * kAlignment + << " first-obj-of-last-idx:" + << first_objs_moving_space_[last_checked_reclaim_page_idx_].AsMirrorPtr(); + from_addr += obj_size; bytes_done += obj_size; } @@ -1959,6 +1998,13 @@ void MarkCompact::FreeFromSpacePages(size_t cur_page_idx, int mode) { (state == PageState::kUnprocessed && (mode == kFallbackMode || idx > moving_first_objs_count_))); } + DCHECK_LE(idx, last_checked_reclaim_page_idx_); + if (idx == last_checked_reclaim_page_idx_) { + // Nothing to do. Also, this possibly avoids freeing from-space pages too + // soon. TODO: Update the comment if returning here indeed fixed NPE like + // in b/272272332. + return; + } uint8_t* reclaim_begin; uint8_t* idx_addr; |