内存空间添加
(1) 如果space是连续的,则添加到continuous_spaces_数组。
(2) continuous_spaces_按照起始地址排序
(3) 内存不连续的,则添加到discontinuous_spaces_
(4) 对于可分配内存的space,添加到alloc_spaces_
(5) 将RegionSpace的live_bitmap,mark_bitmap添加到Heap的live_bitmap_,mark_bitmap_的continuous_space_bitmaps_。
(6) DiscontinuousSpace的live_bitmap,mark_bitmap添加到Heap的的live_bitmap_,mark_bitmap_的large_object_bitmaps_,
void Heap::AddSpace(space::Space* space) {
WriterMutexLock mu(Thread::Current(), *Locks::heap_bitmap_lock_);
if (space->IsContinuousSpace()) {
space::ContinuousSpace* continuous_space = space->AsContinuousSpace();
// Continuous spaces don't necessarily have bitmaps.
accounting::ContinuousSpaceBitmap* live_bitmap = continuous_space->GetLiveBitmap();
accounting::ContinuousSpaceBitmap* mark_bitmap = continuous_space->GetMarkBitmap();
// The region space bitmap is not added since VisitObjects visits the region space objects with
// special handling.
if (live_bitmap != nullptr && !space->IsRegionSpace()) {
//(5)
live_bitmap_->AddContinuousSpaceBitmap(live_bitmap);
mark_bitmap_->AddContinuousSpaceBitmap(mark_bitmap);
}
//(1)
continuous_spaces_.push_back(continuous_space);
// Ensure that spaces remain sorted in increasing order of start address.
//(2)
std::sort(continuous_spaces_.begin(), continuous_spaces_.end(),
[](const space::ContinuousSpace* a, const space::ContinuousSpace* b) {
return a->Begin() < b->Begin();
});
} else {
space::DiscontinuousSpace* discontinuous_space = space->AsDiscontinuousSpace();
//(6)
live_bitmap_->AddLargeObjectBitmap(discontinuous_space->GetLiveBitmap());
mark_bitmap_->AddLargeObjectBitmap(discontinuous_space->GetMarkBitmap());
//(3)
discontinuous_spaces_.push_back(discontinuous_space);
}
if (space->IsAllocSpace()) {
//(4)
alloc_spaces_.push_back(space->AsAllocSpace());
}
}
内存空间移除
void Heap::RemoveSpace(space::Space* space) {
WriterMutexLock mu(Thread::Current(), *Locks::heap_bitmap_lock_);
if (space->IsContinuousSpace()) {
space::ContinuousSpace* continuous_space = space->AsContinuousSpace();
// Continuous spaces don't necessarily have bitmaps.
accounting::ContinuousSpaceBitmap* live_bitmap = continuous_space->GetLiveBitmap();
accounting::ContinuousSpaceBitmap* mark_bitmap = continuous_space->GetMarkBitmap();
if (live_bitmap != nullptr && !space->IsRegionSpace()) {
DCHECK(mark_bitmap != nullptr);
live_bitmap_->RemoveContinuousSpaceBitmap(live_bitmap);
mark_bitmap_->RemoveContinuousSpaceBitmap(mark_bitmap);
}
auto it = std::find(continuous_spaces_.begin(), continuous_spaces_.end(), continuous_space);
DCHECK(it != continuous_spaces_.end());
continuous_spaces_.erase(it);
} else {
DCHECK(space->IsDiscontinuousSpace());
space::DiscontinuousSpace* discontinuous_space = space->AsDiscontinuousSpace();
live_bitmap_->RemoveLargeObjectBitmap(discontinuous_space->GetLiveBitmap());
mark_bitmap_->RemoveLargeObjectBitmap(discontinuous_space->GetMarkBitmap());
auto it = std::find(discontinuous_spaces_.begin(), discontinuous_spaces_.end(),
discontinuous_space);
DCHECK(it != discontinuous_spaces_.end());
discontinuous_spaces_.erase(it);
}
if (space->IsAllocSpace()) {
auto it = std::find(alloc_spaces_.begin(), alloc_spaces_.end(), space->AsAllocSpace());
DCHECK(it != alloc_spaces_.end());
alloc_spaces_.erase(it);
}
}
android java对象在堆上分配,具体保存在某个space上。art虚拟机并没有具体的数据结构表示老年代和新生代,一般情况下将ImageSpace和ZyogoteSpace作为老年代。