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" 2710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier#include "gc/collector/garbage_collector.h" 281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "globals.h" 291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "image.h" 301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "mem_map.h" 311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 321d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace art { 331d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace mirror { 341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers class Object; 351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace mirror 361d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 371d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 391d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Heap; 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 411d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace space { 421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 43590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass AllocSpace; 447410f29b4dae223befac036ea567d7f33351dad1Mathieu Chartierclass BumpPointerSpace; 45a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartierclass ContinuousMemMapAllocSpace; 46590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass ContinuousSpace; 47590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass DiscontinuousSpace; 48cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchiclass MallocSpace; 49cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchiclass DlMallocSpace; 50cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchiclass RosAllocSpace; 511d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ImageSpace; 521d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass LargeObjectSpace; 532cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchiclass RegionSpace; 54a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartierclass ZygoteSpace; 551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 560f72e4136aecaf6976fdb55916bbd7b6d5c9c77bMathieu Chartierstatic constexpr bool kDebugSpaces = kIsDebugBuild; 571d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// See Space::GetGcRetentionPolicy. 591d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum GcRetentionPolicy { 601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Objects are retained forever with this policy for a space. 611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyNeverCollect, 621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Every GC cycle will attempt to collect objects in this space. 631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyAlwaysCollect, 641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Objects will be considered for collection only in "full" GC cycles, ie faster partial 651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // collections won't scan these areas such as the Zygote. 661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kGcRetentionPolicyFullCollect, 671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 681d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const GcRetentionPolicy& policy); 691d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 701d54e73444e017d3a65234e0f193846f3e27472bIan Rogersenum SpaceType { 711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeImageSpace, 72a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier kSpaceTypeMallocSpace, 731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeZygoteSpace, 74590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier kSpaceTypeBumpPointerSpace, 751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers kSpaceTypeLargeObjectSpace, 762cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi kSpaceTypeRegionSpace, 771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 781d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const SpaceType& space_type); 791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space contains memory allocated for managed objects. 811d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass Space { 821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Dump space. Also key method for C++ vtables. 841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual void Dump(std::ostream& os) const; 851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Name of the space. May vary, for example before/after the Zygote fork. 871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const char* GetName() const { 881d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return name_.c_str(); 891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 901d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The policy of when objects are collected associated with this space. 921d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GcRetentionPolicy GetGcRetentionPolicy() const { 931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return gc_retention_policy_; 941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is the given object contained within this space? 971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual bool Contains(const mirror::Object* obj) const = 0; 981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The kind of space this: image, alloc, zygote, large object. 1001d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual SpaceType GetType() const = 0; 1011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1021d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this an image space, ie one backed by a memory mapped image file. 1031d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsImageSpace() const { 1041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeImageSpace; 1051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1061d54e73444e017d3a65234e0f193846f3e27472bIan Rogers ImageSpace* AsImageSpace(); 1071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is this a dlmalloc backed allocation space? 109cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi bool IsMallocSpace() const { 1101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers SpaceType type = GetType(); 111a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return type == kSpaceTypeMallocSpace; 1121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 113cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi MallocSpace* AsMallocSpace(); 114cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 115cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi virtual bool IsDlMallocSpace() const { 116cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi return false; 117cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 1186fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual DlMallocSpace* AsDlMallocSpace(); 1196fac447555dc94a935b78198479cce645c837b89Ian Rogers 120cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi virtual bool IsRosAllocSpace() const { 121cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi return false; 122cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi } 1236fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual RosAllocSpace* AsRosAllocSpace(); 1241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1256fac447555dc94a935b78198479cce645c837b89Ian Rogers // Is this the space allocated into by the Zygote and no-longer in use for allocation? 1261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsZygoteSpace() const { 1271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeZygoteSpace; 1281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1296fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual ZygoteSpace* AsZygoteSpace(); 1301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 131590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Is this space a bump pointer space? 132590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier bool IsBumpPointerSpace() const { 133590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return GetType() == kSpaceTypeBumpPointerSpace; 134590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 1356fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual BumpPointerSpace* AsBumpPointerSpace(); 136590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 1372cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi bool IsRegionSpace() const { 1382cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi return GetType() == kSpaceTypeRegionSpace; 1392cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi } 1402cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi virtual RegionSpace* AsRegionSpace(); 1412cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi 1421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Does this space hold large objects and implement the large object space abstraction? 1431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool IsLargeObjectSpace() const { 1441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return GetType() == kSpaceTypeLargeObjectSpace; 1451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers LargeObjectSpace* AsLargeObjectSpace(); 1471d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 148590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsContinuousSpace() const { 149590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return false; 150590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 151590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier ContinuousSpace* AsContinuousSpace(); 152590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 153590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsDiscontinuousSpace() const { 154590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return false; 155590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 156590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier DiscontinuousSpace* AsDiscontinuousSpace(); 157590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 158590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsAllocSpace() const { 159590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return false; 160590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 1616fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual AllocSpace* AsAllocSpace(); 162590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 163a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier virtual bool IsContinuousMemMapAllocSpace() const { 164a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return false; 165a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 1666fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual ContinuousMemMapAllocSpace* AsContinuousMemMapAllocSpace(); 167a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 16831f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier // Returns true if objects in the space are movable. 16931f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier virtual bool CanMoveObjects() const = 0; 17031f441464c0c8f840aba37e236ad133f30308d70Mathieu Chartier 1711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~Space() {} 1721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 1741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Space(const std::string& name, GcRetentionPolicy gc_retention_policy); 1751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void SetGcRetentionPolicy(GcRetentionPolicy gc_retention_policy) { 1771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers gc_retention_policy_ = gc_retention_policy; 1781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Name of the space that may vary due to the Zygote fork. 1811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers std::string name_; 1821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 183590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier protected: 1841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // When should objects within this space be reclaimed? Not constant as we vary it in the case 1851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // of Zygote forking. 1861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GcRetentionPolicy gc_retention_policy_; 1871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 188590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 1891d54e73444e017d3a65234e0f193846f3e27472bIan Rogers friend class art::gc::Heap; 1903130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(Space); 1911d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 1921d54e73444e017d3a65234e0f193846f3e27472bIan Rogersstd::ostream& operator<<(std::ostream& os, const Space& space); 1931d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 1941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// AllocSpace interface. 1951d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass AllocSpace { 1961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 1971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of bytes currently allocated. 198be031fff278799984166ec866c2dd202447e0f23Hiroshi Yamauchi virtual uint64_t GetBytesAllocated() = 0; 1991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Number of objects currently allocated. 200be031fff278799984166ec866c2dd202447e0f23Hiroshi Yamauchi virtual uint64_t GetObjectsAllocated() = 0; 2011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 20250b2928501fe489c108472e7648ec98cdca62e10Hiroshi Yamauchi // Allocate num_bytes without allowing growth. If the allocation 20350b2928501fe489c108472e7648ec98cdca62e10Hiroshi Yamauchi // succeeds, the output parameter bytes_allocated will be set to the 20450b2928501fe489c108472e7648ec98cdca62e10Hiroshi Yamauchi // actually allocated bytes which is >= num_bytes. 2050651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier // Alloc can be called from multiple threads at the same time and must be thread-safe. 2064460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 2074460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // bytes_tl_bulk_allocated - bytes allocated in bulk ahead of time for a thread local allocation, 2084460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // if applicable. It can be 2094460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 1) equal to bytes_allocated if it's not a thread local allocation, 2104460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 2) greater than bytes_allocated if it's a thread local 2114460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // allocation that required a new buffer, or 2124460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // 3) zero if it's a thread local allocation in an existing 2134460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // buffer. 2144460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // This is what is to be added to Heap::num_bytes_allocated_. 2156fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual mirror::Object* Alloc(Thread* self, size_t num_bytes, size_t* bytes_allocated, 2164460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, size_t* bytes_tl_bulk_allocated) = 0; 2171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2180651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier // Thread-unsafe allocation for when mutators are suspended, used by the semispace collector. 2190651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier virtual mirror::Object* AllocThreadUnsafe(Thread* self, size_t num_bytes, size_t* bytes_allocated, 2204460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* usable_size, 2214460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi size_t* bytes_tl_bulk_allocated) 22290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier REQUIRES(Locks::mutator_lock_) { 2234460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return Alloc(self, num_bytes, bytes_allocated, usable_size, bytes_tl_bulk_allocated); 2240651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier } 2250651d41e41341fb2e9ef3ee41dc1f1bfc832dbbbMathieu Chartier 2261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Return the storage space required by obj. 2276fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual size_t AllocationSize(mirror::Object* obj, size_t* usable_size) = 0; 2281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Returns how many bytes were freed. 2301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t Free(Thread* self, mirror::Object* ptr) = 0; 2311d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Returns how many bytes were freed. 2331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t FreeList(Thread* self, size_t num_ptrs, mirror::Object** ptrs) = 0; 2341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2356fac447555dc94a935b78198479cce645c837b89Ian Rogers // Revoke any sort of thread-local buffers that are used to speed up allocations for the given 2366fac447555dc94a935b78198479cce645c837b89Ian Rogers // thread, if the alloc space implementation uses any. 2374460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // Returns the total free bytes in the revoked thread local runs that's to be subtracted 2384460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // from Heap::num_bytes_allocated_ or zero if unnecessary. 2394460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi virtual size_t RevokeThreadLocalBuffers(Thread* thread) = 0; 240cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 2416fac447555dc94a935b78198479cce645c837b89Ian Rogers // Revoke any sort of thread-local buffers that are used to speed up allocations for all the 2426fac447555dc94a935b78198479cce645c837b89Ian Rogers // threads, if the alloc space implementation uses any. 2434460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // Returns the total free bytes in the revoked thread local runs that's to be subtracted 2444460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi // from Heap::num_bytes_allocated_ or zero if unnecessary. 2454460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi virtual size_t RevokeAllThreadLocalBuffers() = 0; 246cf58d4adf461eb9b8e84baa8019054c88cd8acc6Hiroshi Yamauchi 247b363f666883860d40823d5528df3c98c897f74f4Mathieu Chartier virtual void LogFragmentationAllocFailure(std::ostream& os, size_t failed_alloc_bytes) = 0; 248b363f666883860d40823d5528df3c98c897f74f4Mathieu Chartier 2491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 25010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier struct SweepCallbackContext { 25110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier SweepCallbackContext(bool swap_bitmaps, space::Space* space); 25210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier const bool swap_bitmaps; 25310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier space::Space* const space; 25410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier Thread* const self; 25510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier collector::ObjectBytePair freed; 25610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier }; 25710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier 2581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers AllocSpace() {} 2591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~AllocSpace() {} 2601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 2621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DISALLOW_COPY_AND_ASSIGN(AllocSpace); 2631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 2641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 2651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// Continuous spaces have bitmaps, and an address range. Although not required, objects within 2661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// continuous spaces can be marked in the card table. 2671d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass ContinuousSpace : public Space { 2681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 269590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Address at which the space begins. 27013735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* Begin() const { 2711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return begin_; 2721d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 274590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Current address at which the space ends, which may vary as the space is filled. 27513735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* End() const { 276be2a1df15a31a5223ee9af3015a00c31d2ad2e10Ian Rogers return end_.LoadRelaxed(); 2771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 279590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // The end of the address range covered by the space. 28013735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* Limit() const { 281590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return limit_; 282590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 283590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 284590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Change the end of the space. Be careful with use since changing the end of a space to an 285590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // invalid value may break the GC. 28613735955f39b3b304c37d2b2840663c131262c18Ian Rogers void SetEnd(uint8_t* end) { 287be2a1df15a31a5223ee9af3015a00c31d2ad2e10Ian Rogers end_.StoreRelaxed(end); 288590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 289590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 29013735955f39b3b304c37d2b2840663c131262c18Ian Rogers void SetLimit(uint8_t* limit) { 291590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier limit_ = limit; 292590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 293590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 2941d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Current size of space 2951d54e73444e017d3a65234e0f193846f3e27472bIan Rogers size_t Size() const { 2961d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return End() - Begin(); 2971d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 2981d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 299a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier virtual accounting::ContinuousSpaceBitmap* GetLiveBitmap() const = 0; 300a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier virtual accounting::ContinuousSpaceBitmap* GetMarkBitmap() const = 0; 3011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 302590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Maximum which the mapped space can grow to. 303590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual size_t Capacity() const { 304590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return Limit() - Begin(); 305590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 306590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3071d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Is object within this space? We check to see if the pointer is beyond the end first as 3081d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // continuous spaces are iterated over from low to high. 3091d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool HasAddress(const mirror::Object* obj) const { 31013735955f39b3b304c37d2b2840663c131262c18Ian Rogers const uint8_t* byte_ptr = reinterpret_cast<const uint8_t*>(obj); 311590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return byte_ptr >= Begin() && byte_ptr < Limit(); 3121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers bool Contains(const mirror::Object* obj) const { 3151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return HasAddress(obj); 3161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 318590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier virtual bool IsContinuousSpace() const { 319590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return true; 320590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 321590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3221d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~ContinuousSpace() {} 3231d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3241d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 3251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers ContinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy, 32613735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* begin, uint8_t* end, uint8_t* limit) : 327590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier Space(name, gc_retention_policy), begin_(begin), end_(end), limit_(limit) { 3281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3301d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // The beginning of the storage for fast access. 33113735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* begin_; 3321d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Current end of the space. 33413735955f39b3b304c37d2b2840663c131262c18Ian Rogers Atomic<uint8_t*> end_; 335590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 336590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier // Limit of the space. 33713735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* limit_; 3381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 3403130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(ContinuousSpace); 3411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 3421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3431d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// A space where objects may be allocated higgledy-piggledy throughout virtual memory. Currently 3441d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// the card table can't cover these objects and so the write barrier shouldn't be triggered. This 3451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers// is suitable for use for large primitive arrays. 3461d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass DiscontinuousSpace : public Space { 3471d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 348bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier accounting::LargeObjectBitmap* GetLiveBitmap() const { 349bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier return live_bitmap_.get(); 3501d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 352bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier accounting::LargeObjectBitmap* GetMarkBitmap() const { 353bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier return mark_bitmap_.get(); 3541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 356bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier virtual bool IsDiscontinuousSpace() const OVERRIDE { 357590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return true; 358590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 359590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~DiscontinuousSpace() {} 3611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3621d54e73444e017d3a65234e0f193846f3e27472bIan Rogers protected: 3631d54e73444e017d3a65234e0f193846f3e27472bIan Rogers DiscontinuousSpace(const std::string& name, GcRetentionPolicy gc_retention_policy); 3641d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 365700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::LargeObjectBitmap> live_bitmap_; 366700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::LargeObjectBitmap> mark_bitmap_; 3671d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3681d54e73444e017d3a65234e0f193846f3e27472bIan Rogers private: 3693130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(DiscontinuousSpace); 3701d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 3711d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3721d54e73444e017d3a65234e0f193846f3e27472bIan Rogersclass MemMapSpace : public ContinuousSpace { 3731d54e73444e017d3a65234e0f193846f3e27472bIan Rogers public: 3741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Size of the space without a limit on its growth. By default this is just the Capacity, but 3751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // for the allocation space we support starting with a small heap and then extending it. 3761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual size_t NonGrowthLimitCapacity() const { 3771d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return Capacity(); 3781d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3791d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3801d54e73444e017d3a65234e0f193846f3e27472bIan Rogers MemMap* GetMemMap() { 3811d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mem_map_.get(); 3821d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3831d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 3841d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const MemMap* GetMemMap() const { 3851d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return mem_map_.get(); 3861d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 3871d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 388e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier MemMap* ReleaseMemMap() { 389e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier return mem_map_.release(); 390e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier } 391e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier 392590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier protected: 39313735955f39b3b304c37d2b2840663c131262c18Ian Rogers MemMapSpace(const std::string& name, MemMap* mem_map, uint8_t* begin, uint8_t* end, uint8_t* limit, 394590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier GcRetentionPolicy gc_retention_policy) 395590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier : ContinuousSpace(name, gc_retention_policy, begin, end, limit), 396590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier mem_map_(mem_map) { 397590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 398590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 3991d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Underlying storage of the space 400700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<MemMap> mem_map_; 4011d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 402590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 4033130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(MemMapSpace); 4041d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}; 4051d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 406590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier// Used by the heap compaction interface to enable copying from one type of alloc space to another. 407590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartierclass ContinuousMemMapAllocSpace : public MemMapSpace, public AllocSpace { 408590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier public: 4096fac447555dc94a935b78198479cce645c837b89Ian Rogers bool IsAllocSpace() const OVERRIDE { 410590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return true; 411590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 4126fac447555dc94a935b78198479cce645c837b89Ian Rogers AllocSpace* AsAllocSpace() OVERRIDE { 413590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return this; 414590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 415590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 4166fac447555dc94a935b78198479cce645c837b89Ian Rogers bool IsContinuousMemMapAllocSpace() const OVERRIDE { 417a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return true; 418a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 4196fac447555dc94a935b78198479cce645c837b89Ian Rogers ContinuousMemMapAllocSpace* AsContinuousMemMapAllocSpace() { 420a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return this; 421a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 422a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 42390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier bool HasBoundBitmaps() const REQUIRES(Locks::heap_bitmap_lock_); 42490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void BindLiveToMarkBitmap() REQUIRES(Locks::heap_bitmap_lock_); 42590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void UnBindBitmaps() REQUIRES(Locks::heap_bitmap_lock_); 4261f3b5358b28a83f0929bdd8ce738f06908677fb7Mathieu Chartier // Swap the live and mark bitmaps of this space. This is used by the GC for concurrent sweeping. 4271f3b5358b28a83f0929bdd8ce738f06908677fb7Mathieu Chartier void SwapBitmaps(); 428a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 429a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier // Clear the space back to an empty space. 4306fac447555dc94a935b78198479cce645c837b89Ian Rogers virtual void Clear() = 0; 431590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 4324c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier accounting::ContinuousSpaceBitmap* GetLiveBitmap() const OVERRIDE { 433a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return live_bitmap_.get(); 434a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 4356fac447555dc94a935b78198479cce645c837b89Ian Rogers 4364c13a3ff475f206c4d0a86ee2595c45392fd942fMathieu Chartier accounting::ContinuousSpaceBitmap* GetMarkBitmap() const OVERRIDE { 437a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier return mark_bitmap_.get(); 438a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier } 439a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 44010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier collector::ObjectBytePair Sweep(bool swap_bitmaps); 441a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier virtual accounting::ContinuousSpaceBitmap::SweepCallback* GetSweepCallback() = 0; 442a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 443590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier protected: 444700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::ContinuousSpaceBitmap> live_bitmap_; 445700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::ContinuousSpaceBitmap> mark_bitmap_; 446700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers std::unique_ptr<accounting::ContinuousSpaceBitmap> temp_bitmap_; 447a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier 44813735955f39b3b304c37d2b2840663c131262c18Ian Rogers ContinuousMemMapAllocSpace(const std::string& name, MemMap* mem_map, uint8_t* begin, 44913735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* end, uint8_t* limit, GcRetentionPolicy gc_retention_policy) 450590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier : MemMapSpace(name, mem_map, begin, end, limit, gc_retention_policy) { 451590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 452590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 453590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier private: 454a1602f28c0e3127ad511712d4b08db89737ae901Mathieu Chartier friend class gc::Heap; 4553130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(ContinuousMemMapAllocSpace); 456590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier}; 457590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier 4581d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace space 4591d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 4601d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace art 4611d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 462fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_GC_SPACE_SPACE_H_ 463