space.h revision 1d54e73444e017d3a65234e0f193846f3e27472b
11d54e73444e017d3a65234e0f193846f3e27472bIan Rogers/*
21d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Copyright (C) 2011 The Android Open Source Project
31d54e73444e017d3a65234e0f193846f3e27472bIan Rogers *
41d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
51d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * you may not use this file except in compliance with the License.
61d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * You may obtain a copy of the License at
71d54e73444e017d3a65234e0f193846f3e27472bIan Rogers *
81d54e73444e017d3a65234e0f193846f3e27472bIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
91d54e73444e017d3a65234e0f193846f3e27472bIan Rogers *
101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Unless required by applicable law or agreed to in writing, software
111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * See the License for the specific language governing permissions and
141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * limitations under the License.
151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers */
161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#ifndef ART_SRC_GC_SPACE_SPACE_H_
181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#define ART_SRC_GC_SPACE_SPACE_H_
191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include <string>
211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "UniquePtr.h"
231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "base/macros.h"
241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "base/mutex.h"
251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/space_bitmap.h"
261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "globals.h"
271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "image.h"
281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "mem_map.h"
291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
301d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace art {
311d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace mirror {
321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  class Object;
331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace mirror
341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
351d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc {
361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
371d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace accounting {
381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  class SpaceBitmap;
391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace accounting
401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
411d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Heap;
421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
431d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space {
441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
451d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass DlMallocSpace;
461d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ImageSpace;
471d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass LargeObjectSpace;
481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
491d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstatic const bool kDebugSpaces = kIsDebugBuild;
501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// See Space::GetGcRetentionPolicy.
521d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum GcRetentionPolicy {
531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Objects are retained forever with this policy for a space.
541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  kGcRetentionPolicyNeverCollect,
551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Every GC cycle will attempt to collect objects in this space.
561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  kGcRetentionPolicyAlwaysCollect,
571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Objects will be considered for collection only in "full" GC cycles, ie faster partial
581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // collections won't scan these areas such as the Zygote.
591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  kGcRetentionPolicyFullCollect,
601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers};
611d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const GcRetentionPolicy& policy);
621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
631d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum SpaceType {
641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  kSpaceTypeImageSpace,
651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  kSpaceTypeAllocSpace,
661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  kSpaceTypeZygoteSpace,
671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  kSpaceTypeLargeObjectSpace,
681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers};
691d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const SpaceType& space_type);
701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space contains memory allocated for managed objects.
721d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Space {
731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public:
741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Dump space. Also key method for C++ vtables.
751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual void Dump(std::ostream& os) const;
761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Name of the space. May vary, for example before/after the Zygote fork.
781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  const char* GetName() const {
791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return name_.c_str();
801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // The policy of when objects are collected associated with this space.
831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  GcRetentionPolicy GetGcRetentionPolicy() const {
841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return gc_retention_policy_;
851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Does the space support allocation?
881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual bool CanAllocateInto() const {
891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return true;
901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Is the given object contained within this space?
931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual bool Contains(const mirror::Object* obj) const = 0;
941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // The kind of space this: image, alloc, zygote, large object.
961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual SpaceType GetType() const = 0;
971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Is this an image space, ie one backed by a memory mapped image file.
991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  bool IsImageSpace() const {
1001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return GetType() == kSpaceTypeImageSpace;
1011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1021d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  ImageSpace* AsImageSpace();
1031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Is this a dlmalloc backed allocation space?
1051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  bool IsDlMallocSpace() const {
1061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    SpaceType type = GetType();
1071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return type == kSpaceTypeAllocSpace || type == kSpaceTypeZygoteSpace;
1081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1091d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DlMallocSpace* AsDlMallocSpace();
1101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Is this the space allocated into by the Zygote and no-longer in use?
1121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  bool IsZygoteSpace() const {
1131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return GetType() == kSpaceTypeZygoteSpace;
1141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DlMallocSpace* AsZygoteSpace();
1161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Does this space hold large objects and implement the large object space abstraction?
1181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  bool IsLargeObjectSpace() const {
1191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return GetType() == kSpaceTypeLargeObjectSpace;
1201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  LargeObjectSpace* AsLargeObjectSpace();
1221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual ~Space() {}
1241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected:
1261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  Space(const std::string& name, GcRetentionPolicy gc_retention_policy);
1271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  void SetGcRetentionPolicy(GcRetentionPolicy gc_retention_policy) {
1291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    gc_retention_policy_ = gc_retention_policy;
1301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Name of the space that may vary due to the Zygote fork.
1331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  std::string name_;
1341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private:
1361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // When should objects within this space be reclaimed? Not constant as we vary it in the case
1371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // of Zygote forking.
1381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  GcRetentionPolicy gc_retention_policy_;
1391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  friend class art::gc::Heap;
1411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DISALLOW_COPY_AND_ASSIGN(Space);
1431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers};
1441d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const Space& space);
1451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// AllocSpace interface.
1471d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass AllocSpace {
1481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public:
1491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Number of bytes currently allocated.
1501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual uint64_t GetBytesAllocated() const = 0;
1511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Number of objects currently allocated.
1521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual uint64_t GetObjectsAllocated() const = 0;
1531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Number of bytes allocated since the space was created.
1541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual uint64_t GetTotalBytesAllocated() const = 0;
1551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Number of objects allocated since the space was created.
1561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual uint64_t GetTotalObjectsAllocated() const = 0;
1571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Allocate num_bytes without allowing growth.
1591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual mirror::Object* Alloc(Thread* self, size_t num_bytes) = 0;
1601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Return the storage space required by obj.
1621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual size_t AllocationSize(const mirror::Object* obj) = 0;
1631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Returns how many bytes were freed.
1651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual size_t Free(Thread* self, mirror::Object* ptr) = 0;
1661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Returns how many bytes were freed.
1681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual size_t FreeList(Thread* self, size_t num_ptrs, mirror::Object** ptrs) = 0;
1691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected:
1711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  AllocSpace() {}
1721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual ~AllocSpace() {}
1731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private:
1751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DISALLOW_COPY_AND_ASSIGN(AllocSpace);
1761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers};
1771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// Continuous spaces have bitmaps, and an address range. Although not required, objects within
1791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// continuous spaces can be marked in the card table.
1801d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ContinuousSpace : public Space {
1811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public:
1821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Address at which the space begins
1831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  byte* Begin() const {
1841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return begin_;
1851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Address at which the space ends, which may vary as the space is filled.
1881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  byte* End() const {
1891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return end_;
1901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Current size of space
1931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  size_t Size() const {
1941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return End() - Begin();
1951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
1961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
1971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual accounting::SpaceBitmap* GetLiveBitmap() const = 0;
1981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual accounting::SpaceBitmap* GetMarkBitmap() const = 0;
1991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Is object within this space? We check to see if the pointer is beyond the end first as
2011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // continuous spaces are iterated over from low to high.
2021d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  bool HasAddress(const mirror::Object* obj) const {
2031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    const byte* byte_ptr = reinterpret_cast<const byte*>(obj);
2041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return byte_ptr < End() && byte_ptr >= Begin();
2051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  bool Contains(const mirror::Object* obj) const {
2081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return HasAddress(obj);
2091d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual ~ContinuousSpace() {}
2121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected:
2141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  ContinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy,
2151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers                  byte* begin, byte* end) :
2161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers      Space(name, gc_retention_policy), begin_(begin), end_(end) {
2171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // The beginning of the storage for fast access.
2211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  byte* const begin_;
2221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Current end of the space.
2241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  byte* end_;
2251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private:
2271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DISALLOW_COPY_AND_ASSIGN(ContinuousSpace);
2281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers};
2291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space where objects may be allocated higgledy-piggledy throughout virtual memory. Currently
2311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// the card table can't cover these objects and so the write barrier shouldn't be triggered. This
2321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// is suitable for use for large primitive arrays.
2331d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass DiscontinuousSpace : public Space {
2341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public:
2351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  accounting::SpaceSetMap* GetLiveObjects() const {
2361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return live_objects_.get();
2371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  accounting::SpaceSetMap* GetMarkObjects() const {
2401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return mark_objects_.get();
2411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual ~DiscontinuousSpace() {}
2441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected:
2461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DiscontinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy);
2471d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  UniquePtr<accounting::SpaceSetMap> live_objects_;
2491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  UniquePtr<accounting::SpaceSetMap> mark_objects_;
2501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private:
2521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DISALLOW_COPY_AND_ASSIGN(DiscontinuousSpace);
2531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers};
2541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2551d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass MemMapSpace : public ContinuousSpace {
2561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public:
2571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Maximum which the mapped space can grow to.
2581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual size_t Capacity() const {
2591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return mem_map_->Size();
2601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Size of the space without a limit on its growth. By default this is just the Capacity, but
2631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // for the allocation space we support starting with a small heap and then extending it.
2641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  virtual size_t NonGrowthLimitCapacity() const {
2651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return Capacity();
2661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected:
2691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  MemMapSpace(const std::string& name, MemMap* mem_map, size_t initial_size,
2701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers              GcRetentionPolicy gc_retention_policy)
2711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers      : ContinuousSpace(name, gc_retention_policy,
2721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers                        mem_map->Begin(), mem_map->Begin() + initial_size),
2731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers        mem_map_(mem_map) {
2741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  MemMap* GetMemMap() {
2771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return mem_map_.get();
2781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  const MemMap* GetMemMap() const {
2811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers    return mem_map_.get();
2821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
2831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private:
2851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  // Underlying storage of the space
2861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  UniquePtr<MemMap> mem_map_;
2871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  DISALLOW_COPY_AND_ASSIGN(MemMapSpace);
2891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers};
2901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace space
2921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace gc
2931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace art
2941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers
2951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#endif  // ART_SRC_GC_SPACE_SPACE_H_
296