space.h revision 2ffb703bf431d74326c88266b4ddaf225eb3c6ad
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 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_GC_SPACE_SPACE_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_GC_SPACE_SPACE_H_ 191d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 20700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory> 211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include <string> 221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 23be2a1df15a31a5223ee9af3015a00c31d2ad2e10Ian Rogers#include "atomic.h" 241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "base/macros.h" 251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "base/mutex.h" 261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/space_bitmap.h" 27d49012909625c3bf87bf51138fe79315ce1b1bdcAndreas Gampe#include "gc/collector/object_byte_pair.h" 281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "globals.h" 291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "mem_map.h" 301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 311d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace art { 321d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace mirror { 332ffb703bf431d74326c88266b4ddaf225eb3c6adIgor Murashkinclass Object; 341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace mirror 351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 361d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 381d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Heap; 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space { 411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 42590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass AllocSpace; 437410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartierclass BumpPointerSpace; 44a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartierclass ContinuousMemMapAllocSpace; 45590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass ContinuousSpace; 46590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass DiscontinuousSpace; 47cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchiclass MallocSpace; 48cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchiclass DlMallocSpace; 49cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchiclass RosAllocSpace; 501d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ImageSpace; 511d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass LargeObjectSpace; 522cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchiclass RegionSpace; 53a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartierclass ZygoteSpace; 541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 550f72e4136aecaf6976fdb55916bbd7b6d5c9c77bMathieu Chartierstatic constexpr bool kDebugSpaces = kIsDebugBuild; 561d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// See Space::GetGcRetentionPolicy. 581d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum GcRetentionPolicy { 591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Objects are retained forever with this policy for a space. 601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyNeverCollect, 611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Every GC cycle will attempt to collect objects in this space. 621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyAlwaysCollect, 631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Objects will be considered for collection only in "full" GC cycles, ie faster partial 641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // collections won't scan these areas such as the Zygote. 651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyFullCollect, 661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 671d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const GcRetentionPolicy& policy); 681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 691d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum SpaceType { 701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeImageSpace, 71a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier kSpaceTypeMallocSpace, 721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeZygoteSpace, 73590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier kSpaceTypeBumpPointerSpace, 741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeLargeObjectSpace, 752cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi kSpaceTypeRegionSpace, 761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 771d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const SpaceType& space_type); 781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space contains memory allocated for managed objects. 801d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Space { 811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Dump space. Also key method for C++ vtables. 831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual void Dump(std::ostream& os) const; 841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Name of the space. May vary, for example before/after the Zygote fork. 861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const char* GetName() const { 871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return name_.c_str(); 881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The policy of when objects are collected associated with this space. 911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GcRetentionPolicy GetGcRetentionPolicy() const { 921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return gc_retention_policy_; 931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is the given object contained within this space? 961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual bool Contains(const mirror::Object* obj) const = 0; 971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The kind of space this: image, alloc, zygote, large object. 991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual SpaceType GetType() const = 0; 1001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this an image space, ie one backed by a memory mapped image file. 1021d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsImageSpace() const { 1031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeImageSpace; 1041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers ImageSpace* AsImageSpace(); 1061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this a dlmalloc backed allocation space? 108cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi bool IsMallocSpace() const { 1091d54e73444e017d3a65234e0f193846f3e27472bIan Rogers SpaceType type = GetType(); 110a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return type == kSpaceTypeMallocSpace; 1111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 112cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi MallocSpace* AsMallocSpace(); 113cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 114cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi virtual bool IsDlMallocSpace() const { 115cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi return false; 116cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 1176fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual DlMallocSpace* AsDlMallocSpace(); 1186fac447555dc94a935b78198479cce645c837b89Ian Rogers 119cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi virtual bool IsRosAllocSpace() const { 120cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi return false; 121cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 1226fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual RosAllocSpace* AsRosAllocSpace(); 1231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1246fac447555dc94a935b78198479cce645c837b89Ian Rogers // Is this the space allocated into by the Zygote and no-longer in use for allocation? 1251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsZygoteSpace() const { 1261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeZygoteSpace; 1271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1286fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual ZygoteSpace* AsZygoteSpace(); 1291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 130590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Is this space a bump pointer space? 131590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool IsBumpPointerSpace() const { 132590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return GetType() == kSpaceTypeBumpPointerSpace; 133590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 1346fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual BumpPointerSpace* AsBumpPointerSpace(); 135590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 1362cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi bool IsRegionSpace() const { 1372cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi return GetType() == kSpaceTypeRegionSpace; 1382cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi } 1392cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi virtual RegionSpace* AsRegionSpace(); 1402cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi 1411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Does this space hold large objects and implement the large object space abstraction? 1421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsLargeObjectSpace() const { 1431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeLargeObjectSpace; 1441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers LargeObjectSpace* AsLargeObjectSpace(); 1461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 147590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsContinuousSpace() const { 148590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return false; 149590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 150590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ContinuousSpace* AsContinuousSpace(); 151590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 152590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsDiscontinuousSpace() const { 153590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return false; 154590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 155590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier DiscontinuousSpace* AsDiscontinuousSpace(); 156590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 157590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsAllocSpace() const { 158590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return false; 159590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 1606fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual AllocSpace* AsAllocSpace(); 161590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 162a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual bool IsContinuousMemMapAllocSpace() const { 163a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return false; 164a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 1656fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual ContinuousMemMapAllocSpace* AsContinuousMemMapAllocSpace(); 166a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 16731f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier // Returns true if objects in the space are movable. 16831f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier virtual bool CanMoveObjects() const = 0; 16931f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier 1701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~Space() {} 1711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 1731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Space(const std::string& name, GcRetentionPolicy gc_retention_policy); 1741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void SetGcRetentionPolicy(GcRetentionPolicy gc_retention_policy) { 1761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers gc_retention_policy_ = gc_retention_policy; 1771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Name of the space that may vary due to the Zygote fork. 1801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers std::string name_; 1811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 182590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier protected: 1831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // When should objects within this space be reclaimed? Not constant as we vary it in the case 1841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // of Zygote forking. 1851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GcRetentionPolicy gc_retention_policy_; 1861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 187590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 1881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers friend class art::gc::Heap; 1893130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(Space); 1901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 1911d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const Space& space); 1921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// AllocSpace interface. 1941d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass AllocSpace { 1951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 1961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of bytes currently allocated. 197be031fff278799984166ec866c2dd202447e0f23Hiroshi Yamauchi virtual uint64_t GetBytesAllocated() = 0; 1981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of objects currently allocated. 199be031fff278799984166ec866c2dd202447e0f23Hiroshi Yamauchi virtual uint64_t GetObjectsAllocated() = 0; 2001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 20150b2928501fe489c108472e7648ec98cdca62e10Hiroshi Yamauchi // Allocate num_bytes without allowing growth. If the allocation 20250b2928501fe489c108472e7648ec98cdca62e10Hiroshi Yamauchi // succeeds, the output parameter bytes_allocated will be set to the 20350b2928501fe489c108472e7648ec98cdca62e10Hiroshi Yamauchi // actually allocated bytes which is >= num_bytes. 2040651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier // Alloc can be called from multiple threads at the same time and must be thread-safe. 2054460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 2064460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // bytes_tl_bulk_allocated - bytes allocated in bulk ahead of time for a thread local allocation, 2074460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // if applicable. It can be 2084460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 1) equal to bytes_allocated if it's not a thread local allocation, 2094460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 2) greater than bytes_allocated if it's a thread local 2104460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // allocation that required a new buffer, or 2114460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 3) zero if it's a thread local allocation in an existing 2124460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // buffer. 2134460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // This is what is to be added to Heap::num_bytes_allocated_. 2146fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual mirror::Object* Alloc(Thread* self, size_t num_bytes, size_t* bytes_allocated, 2154460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, size_t* bytes_tl_bulk_allocated) = 0; 2161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2170651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier // Thread-unsafe allocation for when mutators are suspended, used by the semispace collector. 2180651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier virtual mirror::Object* AllocThreadUnsafe(Thread* self, size_t num_bytes, size_t* bytes_allocated, 2194460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, 2204460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* bytes_tl_bulk_allocated) 22190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier REQUIRES(Locks::mutator_lock_) { 2224460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return Alloc(self, num_bytes, bytes_allocated, usable_size, bytes_tl_bulk_allocated); 2230651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier } 2240651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier 2251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Return the storage space required by obj. 2266fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual size_t AllocationSize(mirror::Object* obj, size_t* usable_size) = 0; 2271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Returns how many bytes were freed. 2291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t Free(Thread* self, mirror::Object* ptr) = 0; 2301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Returns how many bytes were freed. 2321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t FreeList(Thread* self, size_t num_ptrs, mirror::Object** ptrs) = 0; 2331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2346fac447555dc94a935b78198479cce645c837b89Ian Rogers // Revoke any sort of thread-local buffers that are used to speed up allocations for the given 2356fac447555dc94a935b78198479cce645c837b89Ian Rogers // thread, if the alloc space implementation uses any. 2364460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // Returns the total free bytes in the revoked thread local runs that's to be subtracted 2374460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // from Heap::num_bytes_allocated_ or zero if unnecessary. 2384460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi virtual size_t RevokeThreadLocalBuffers(Thread* thread) = 0; 239cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 2406fac447555dc94a935b78198479cce645c837b89Ian Rogers // Revoke any sort of thread-local buffers that are used to speed up allocations for all the 2416fac447555dc94a935b78198479cce645c837b89Ian Rogers // threads, if the alloc space implementation uses any. 2424460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // Returns the total free bytes in the revoked thread local runs that's to be subtracted 2434460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // from Heap::num_bytes_allocated_ or zero if unnecessary. 2444460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi virtual size_t RevokeAllThreadLocalBuffers() = 0; 245cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 246b363f666883860d40823d5528df3c98c897f74f4Mathieu Chartier virtual void LogFragmentationAllocFailure(std::ostream& os, size_t failed_alloc_bytes) = 0; 247b363f666883860d40823d5528df3c98c897f74f4Mathieu Chartier 2481d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 24910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier struct SweepCallbackContext { 25010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier SweepCallbackContext(bool swap_bitmaps, space::Space* space); 25110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier const bool swap_bitmaps; 25210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier space::Space* const space; 25310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier Thread* const self; 25410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier collector::ObjectBytePair freed; 25510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier }; 25610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier 2571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers AllocSpace() {} 2581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~AllocSpace() {} 2591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 2611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DISALLOW_COPY_AND_ASSIGN(AllocSpace); 2621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 2631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// Continuous spaces have bitmaps, and an address range. Although not required, objects within 2651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// continuous spaces can be marked in the card table. 2661d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ContinuousSpace : public Space { 2671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 268590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Address at which the space begins. 26913735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* Begin() const { 2701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return begin_; 2711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 273590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Current address at which the space ends, which may vary as the space is filled. 27413735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* End() const { 275be2a1df15a31a5223ee9af3015a00c31d2ad2e10Ian Rogers return end_.LoadRelaxed(); 2761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 278590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // The end of the address range covered by the space. 27913735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* Limit() const { 280590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return limit_; 281590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 282590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 283590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Change the end of the space. Be careful with use since changing the end of a space to an 284590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // invalid value may break the GC. 28513735955f39b3b304c37d2b2840663c131262c18Ian Rogers void SetEnd(uint8_t* end) { 286be2a1df15a31a5223ee9af3015a00c31d2ad2e10Ian Rogers end_.StoreRelaxed(end); 287590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 288590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 28913735955f39b3b304c37d2b2840663c131262c18Ian Rogers void SetLimit(uint8_t* limit) { 290590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier limit_ = limit; 291590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 292590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 2931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Current size of space 2941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers size_t Size() const { 2951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return End() - Begin(); 2961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 298a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier virtual accounting::ContinuousSpaceBitmap* GetLiveBitmap() const = 0; 299a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier virtual accounting::ContinuousSpaceBitmap* GetMarkBitmap() const = 0; 3001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 301590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Maximum which the mapped space can grow to. 302590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual size_t Capacity() const { 303590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return Limit() - Begin(); 304590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 305590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is object within this space? We check to see if the pointer is beyond the end first as 3071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // continuous spaces are iterated over from low to high. 3081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool HasAddress(const mirror::Object* obj) const { 30913735955f39b3b304c37d2b2840663c131262c18Ian Rogers const uint8_t* byte_ptr = reinterpret_cast<const uint8_t*>(obj); 310590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return byte_ptr >= Begin() && byte_ptr < Limit(); 3111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool Contains(const mirror::Object* obj) const { 3141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return HasAddress(obj); 3151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 317590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsContinuousSpace() const { 318590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return true; 319590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 320590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~ContinuousSpace() {} 3221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 3241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers ContinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy, 32513735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* begin, uint8_t* end, uint8_t* limit) : 326590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier Space(name, gc_retention_policy), begin_(begin), end_(end), limit_(limit) { 3271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The beginning of the storage for fast access. 33013735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* begin_; 3311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Current end of the space. 33313735955f39b3b304c37d2b2840663c131262c18Ian Rogers Atomic<uint8_t*> end_; 334590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 335590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Limit of the space. 33613735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* limit_; 3371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 3393130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(ContinuousSpace); 3401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 3411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space where objects may be allocated higgledy-piggledy throughout virtual memory. Currently 3431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// the card table can't cover these objects and so the write barrier shouldn't be triggered. This 3441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// is suitable for use for large primitive arrays. 3451d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass DiscontinuousSpace : public Space { 3461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 347bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier accounting::LargeObjectBitmap* GetLiveBitmap() const { 348bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier return live_bitmap_.get(); 3491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 351bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier accounting::LargeObjectBitmap* GetMarkBitmap() const { 352bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier return mark_bitmap_.get(); 3531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 355bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier virtual bool IsDiscontinuousSpace() const OVERRIDE { 356590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return true; 357590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 358590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~DiscontinuousSpace() {} 3601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 3621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DiscontinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy); 3631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 364700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::LargeObjectBitmap> live_bitmap_; 365700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::LargeObjectBitmap> mark_bitmap_; 3661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 3683130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(DiscontinuousSpace); 3691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 3701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3711d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass MemMapSpace : public ContinuousSpace { 3721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 3731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Size of the space without a limit on its growth. By default this is just the Capacity, but 3741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // for the allocation space we support starting with a small heap and then extending it. 3751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t NonGrowthLimitCapacity() const { 3761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return Capacity(); 3771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers MemMap* GetMemMap() { 3801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mem_map_.get(); 3811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const MemMap* GetMemMap() const { 3841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mem_map_.get(); 3851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 387e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier MemMap* ReleaseMemMap() { 388e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier return mem_map_.release(); 389e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier } 390e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier 391590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier protected: 39213735955f39b3b304c37d2b2840663c131262c18Ian Rogers MemMapSpace(const std::string& name, MemMap* mem_map, uint8_t* begin, uint8_t* end, uint8_t* limit, 393590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier GcRetentionPolicy gc_retention_policy) 394590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier : ContinuousSpace(name, gc_retention_policy, begin, end, limit), 395590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mem_map_(mem_map) { 396590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 397590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Underlying storage of the space 399700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<MemMap> mem_map_; 4001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 401590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 4023130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(MemMapSpace); 4031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 4041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 405590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier// Used by the heap compaction interface to enable copying from one type of alloc space to another. 406590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass ContinuousMemMapAllocSpace : public MemMapSpace, public AllocSpace { 407590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier public: 4086fac447555dc94a935b78198479cce645c837b89Ian Rogers bool IsAllocSpace() const OVERRIDE { 409590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return true; 410590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 4116fac447555dc94a935b78198479cce645c837b89Ian Rogers AllocSpace* AsAllocSpace() OVERRIDE { 412590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return this; 413590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 414590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 4156fac447555dc94a935b78198479cce645c837b89Ian Rogers bool IsContinuousMemMapAllocSpace() const OVERRIDE { 416a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return true; 417a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 4186fac447555dc94a935b78198479cce645c837b89Ian Rogers ContinuousMemMapAllocSpace* AsContinuousMemMapAllocSpace() { 419a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return this; 420a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 421a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 42290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier bool HasBoundBitmaps() const REQUIRES(Locks::heap_bitmap_lock_); 42390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void BindLiveToMarkBitmap() REQUIRES(Locks::heap_bitmap_lock_); 42490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void UnBindBitmaps() REQUIRES(Locks::heap_bitmap_lock_); 4251f3b5358b28a83f0929bdd8ce738f06908677fb7Mathieu Chartier // Swap the live and mark bitmaps of this space. This is used by the GC for concurrent sweeping. 4261f3b5358b28a83f0929bdd8ce738f06908677fb7Mathieu Chartier void SwapBitmaps(); 427a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 428a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier // Clear the space back to an empty space. 4296fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual void Clear() = 0; 430590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 4314c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier accounting::ContinuousSpaceBitmap* GetLiveBitmap() const OVERRIDE { 432a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return live_bitmap_.get(); 433a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 4346fac447555dc94a935b78198479cce645c837b89Ian Rogers 4354c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier accounting::ContinuousSpaceBitmap* GetMarkBitmap() const OVERRIDE { 436a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return mark_bitmap_.get(); 437a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 438a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 43910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier collector::ObjectBytePair Sweep(bool swap_bitmaps); 440a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier virtual accounting::ContinuousSpaceBitmap::SweepCallback* GetSweepCallback() = 0; 441a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 442590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier protected: 443700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::ContinuousSpaceBitmap> live_bitmap_; 444700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::ContinuousSpaceBitmap> mark_bitmap_; 445700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::ContinuousSpaceBitmap> temp_bitmap_; 446a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 44713735955f39b3b304c37d2b2840663c131262c18Ian Rogers ContinuousMemMapAllocSpace(const std::string& name, MemMap* mem_map, uint8_t* begin, 44813735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* end, uint8_t* limit, GcRetentionPolicy gc_retention_policy) 449590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier : MemMapSpace(name, mem_map, begin, end, limit, gc_retention_policy) { 450590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 451590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 452590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 453a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier friend class gc::Heap; 4543130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(ContinuousMemMapAllocSpace); 455590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier}; 456590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 4571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace space 4581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 4591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace art 4601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 461fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_GC_SPACE_SPACE_H_ 462