12b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier/* 22b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * Copyright (C) 2012 The Android Open Source Project 32b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * 42b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 52b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * you may not use this file except in compliance with the License. 62b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * You may obtain a copy of the License at 72b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * 82b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 92b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * 102b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * Unless required by applicable law or agreed to in writing, software 112b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 122b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * See the License for the specific language governing permissions and 142b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier * limitations under the License. 152b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier */ 162b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_GC_COLLECTOR_GARBAGE_COLLECTOR_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_GC_COLLECTOR_GARBAGE_COLLECTOR_H_ 192b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 2097509954404d031594b2ecbda607314d169d512eMathieu Chartier#include <stdint.h> 2197509954404d031594b2ecbda607314d169d512eMathieu Chartier#include <vector> 2297509954404d031594b2ecbda607314d169d512eMathieu Chartier 23b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier#include "base/histogram.h" 24719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers#include "base/mutex.h" 25b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier#include "base/timing_logger.h" 263e41780cb3bcade3b724908e00443a9caf6977efHiroshi Yamauchi#include "gc/collector_type.h" 276f4ffe41649f1e6381e8cda087ad3749206806e5Hiroshi Yamauchi#include "gc/gc_cause.h" 28bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier#include "gc_root.h" 291d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc_type.h" 3097509954404d031594b2ecbda607314d169d512eMathieu Chartier#include "object_callbacks.h" 312b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 322b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartiernamespace art { 3397509954404d031594b2ecbda607314d169d512eMathieu Chartier 3497509954404d031594b2ecbda607314d169d512eMathieu Chartiernamespace mirror { 3597509954404d031594b2ecbda607314d169d512eMathieu Chartierclass Class; 3697509954404d031594b2ecbda607314d169d512eMathieu Chartierclass Object; 3797509954404d031594b2ecbda607314d169d512eMathieu Chartierclass Reference; 3897509954404d031594b2ecbda607314d169d512eMathieu Chartier} // namespace mirror 3997509954404d031594b2ecbda607314d169d512eMathieu Chartier 401d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 412b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 422b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartierclass Heap; 432b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 441d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace collector { 451d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 4610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartierstruct ObjectBytePair { 4710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier ObjectBytePair(uint64_t num_objects = 0, int64_t num_bytes = 0) 4810fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier : objects(num_objects), bytes(num_bytes) {} 4910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier void Add(const ObjectBytePair& other) { 5010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier objects += other.objects; 5110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier bytes += other.bytes; 5210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 5310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Number of objects which were freed. 5410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier uint64_t objects; 5510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Freed bytes are signed since the GC can free negative bytes if it promotes objects to a space 5610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // which has a larger allocation size. 5710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier int64_t bytes; 5810fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier}; 5910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier 6010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier// A information related single garbage collector iteration. Since we only ever have one GC running 6110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier// at any given time, we can have a single iteration info. 6210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartierclass Iteration { 6310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier public: 6410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier Iteration(); 6510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Returns how long the mutators were paused in nanoseconds. 6610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier const std::vector<uint64_t>& GetPauseTimes() const { 6710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return pause_times_; 6810fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 6910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier TimingLogger* GetTimings() { 7010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return &timings_; 7110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 7210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Returns how long the GC took to complete in nanoseconds. 7310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier uint64_t GetDurationNs() const { 7410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return duration_ns_; 7510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 7610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier int64_t GetFreedBytes() const { 7710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return freed_.bytes; 7810fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 7910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier int64_t GetFreedLargeObjectBytes() const { 8010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return freed_los_.bytes; 8110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 8210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier uint64_t GetFreedObjects() const { 8310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return freed_.objects; 8410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 8510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier uint64_t GetFreedLargeObjects() const { 8610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return freed_los_.objects; 8710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 884460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi uint64_t GetFreedRevokeBytes() const { 894460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi return freed_bytes_revoke_; 904460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi } 914460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi void SetFreedRevoke(uint64_t freed) { 924460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi freed_bytes_revoke_ = freed; 934460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi } 9410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier void Reset(GcCause gc_cause, bool clear_soft_references); 9510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Returns the estimated throughput of the iteration. 9610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier uint64_t GetEstimatedThroughput() const; 9710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier bool GetClearSoftReferences() const { 9810fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return clear_soft_references_; 9910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 10010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier void SetClearSoftReferences(bool clear_soft_references) { 10110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier clear_soft_references_ = clear_soft_references; 10210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 10310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier GcCause GetGcCause() const { 10410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return gc_cause_; 10510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 10610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier 10710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier private: 10810fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier void SetDurationNs(uint64_t duration) { 10910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier duration_ns_ = duration; 11010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 11110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier 11210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier GcCause gc_cause_; 11310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier bool clear_soft_references_; 11410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier uint64_t duration_ns_; 11510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier TimingLogger timings_; 11610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier ObjectBytePair freed_; 11710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier ObjectBytePair freed_los_; 1184460a84be92b5a94ecfb5c650aef4945ab849c93Hiroshi Yamauchi uint64_t freed_bytes_revoke_; // see Heap::num_bytes_freed_revoke_. 11910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier std::vector<uint64_t> pause_times_; 12010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier 12110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier friend class GarbageCollector; 12210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier DISALLOW_COPY_AND_ASSIGN(Iteration); 12310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier}; 12410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier 12597509954404d031594b2ecbda607314d169d512eMathieu Chartierclass GarbageCollector : public RootVisitor, public IsMarkedVisitor, public MarkObjectVisitor { 1262b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier public: 1276f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier class SCOPED_LOCKABLE ScopedPause { 1286f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier public: 1296f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier explicit ScopedPause(GarbageCollector* collector) EXCLUSIVE_LOCK_FUNCTION(Locks::mutator_lock_); 1306f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier ~ScopedPause() UNLOCK_FUNCTION(); 1316f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier 1326f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier private: 1336f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier const uint64_t start_time_; 1346f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier GarbageCollector* const collector_; 1356f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier }; 1366f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier 1371d54e73444e017d3a65234e0f193846f3e27472bIan Rogers GarbageCollector(Heap* heap, const std::string& name); 1381d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual ~GarbageCollector() { } 1391d54e73444e017d3a65234e0f193846f3e27472bIan Rogers const char* GetName() const { 1401d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return name_.c_str(); 1411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 1421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers virtual GcType GetGcType() const = 0; 1433e41780cb3bcade3b724908e00443a9caf6977efHiroshi Yamauchi virtual CollectorType GetCollectorType() const = 0; 1442b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier // Run the garbage collector. 14590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void Run(GcCause gc_cause, bool clear_soft_references) REQUIRES(!pause_histogram_lock_); 1461d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Heap* GetHeap() const { 1472b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier return heap_; 1482b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier } 1491d54e73444e017d3a65234e0f193846f3e27472bIan Rogers void RegisterPause(uint64_t nano_length); 150afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier const CumulativeLogger& GetCumulativeTimings() const { 1511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers return cumulative_timings_; 1521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 15390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void ResetCumulativeStatistics() REQUIRES(!pause_histogram_lock_); 1541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Swap the live and mark bitmaps of spaces that are active for the collector. For partial GC, 1551d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // this is the allocation space, for full GC then we swap the zygote bitmaps too. 156a9d82fe8bc6960b565245b920e99107a824ca515Mathieu Chartier void SwapBitmaps() 157a9d82fe8bc6960b565245b920e99107a824ca515Mathieu Chartier REQUIRES(Locks::heap_bitmap_lock_) 158a9d82fe8bc6960b565245b920e99107a824ca515Mathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 15990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier uint64_t GetTotalPausedTimeNs() REQUIRES(!pause_histogram_lock_); 160e76e70f424468f311c2061c291e8384263f3968cMathieu Chartier int64_t GetTotalFreedBytes() const { 161590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return total_freed_bytes_; 162590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 163590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier uint64_t GetTotalFreedObjects() const { 164590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier return total_freed_objects_; 165590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier } 1665a48719b516a52d1a6800d8ae6f7dcba3d883bdcMathieu Chartier // Reset the cumulative timings and pause histogram. 16790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void ResetMeasurements() REQUIRES(!pause_histogram_lock_); 168afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier // Returns the estimated throughput in bytes / second. 169afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier uint64_t GetEstimatedMeanThroughput() const; 170afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier // Returns how many GC iterations have been run. 17110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier size_t NumberOfIterations() const { 172afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier return GetCumulativeTimings().GetIterations(); 173afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier } 17410fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Returns the current GC iteration and assocated info. 17510fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier Iteration* GetCurrentIteration(); 17610fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier const Iteration* GetCurrentIteration() const; 17710fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier TimingLogger* GetTimings() { 17810fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier return &GetCurrentIteration()->timings_; 17910fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier } 18010fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Record a free of normal objects. 18110fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier void RecordFree(const ObjectBytePair& freed); 18210fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier // Record a free of large objects. 18310fb83ad7442c8cf3356a89ec918e0786f110981Mathieu Chartier void RecordFreeLOS(const ObjectBytePair& freed); 18490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void DumpPerformanceInfo(std::ostream& os) REQUIRES(!pause_histogram_lock_); 185afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier 1868118781ebc9659f806716c451bdb3fe9b77ae32bMathieu Chartier // Helper functions for querying if objects are marked. These are used for processing references, 1878118781ebc9659f806716c451bdb3fe9b77ae32bMathieu Chartier // and will be used for reading system weaks while the GC is running. 18897509954404d031594b2ecbda607314d169d512eMathieu Chartier virtual mirror::Object* IsMarked(mirror::Object* obj) 18990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) = 0; 19097509954404d031594b2ecbda607314d169d512eMathieu Chartier virtual bool IsMarkedHeapReference(mirror::HeapReference<mirror::Object>* obj) 19190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) = 0; 19297509954404d031594b2ecbda607314d169d512eMathieu Chartier // Used by reference processor. 19390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier virtual void ProcessMarkStack() SHARED_REQUIRES(Locks::mutator_lock_) = 0; 19497509954404d031594b2ecbda607314d169d512eMathieu Chartier // Force mark an object. 19597509954404d031594b2ecbda607314d169d512eMathieu Chartier virtual mirror::Object* MarkObject(mirror::Object* obj) 19690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) = 0; 19797509954404d031594b2ecbda607314d169d512eMathieu Chartier virtual void MarkHeapReference(mirror::HeapReference<mirror::Object>* obj) 19890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) = 0; 19997509954404d031594b2ecbda607314d169d512eMathieu Chartier virtual void DelayReferenceReferent(mirror::Class* klass, mirror::Reference* reference) 20090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) = 0; 20197509954404d031594b2ecbda607314d169d512eMathieu Chartier 2022b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier protected: 2036f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier // Run all of the GC phases. 2046f365cc033654a5a3b45eaa1379d4b5f156b0ceeMathieu Chartier virtual void RunPhases() = 0; 205c93c530efc175954160c3834c93961a1a946a35aHiroshi Yamauchi // Revoke all the thread-local buffers. 206c93c530efc175954160c3834c93961a1a946a35aHiroshi Yamauchi virtual void RevokeAllThreadLocalBuffers() = 0; 207d6534315596326f1a65aa2d300144c09205c5122Mathieu Chartier 208b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier static constexpr size_t kPauseBucketSize = 500; 209b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier static constexpr size_t kPauseBucketCount = 32; 210b2f9936cab87a187f078187c22d9b29d4a188a62Mathieu Chartier 2111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers Heap* const heap_; 2121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers std::string name_; 2131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers // Cumulative statistics. 214104fa0c0c7dad925d9f4d5c101a8064cd6830da7Mathieu Chartier Histogram<uint64_t> pause_histogram_ GUARDED_BY(pause_histogram_lock_); 2151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_time_ns_; 2161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers uint64_t total_freed_objects_; 217e76e70f424468f311c2061c291e8384263f3968cMathieu Chartier int64_t total_freed_bytes_; 2181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers CumulativeLogger cumulative_timings_; 219104fa0c0c7dad925d9f4d5c101a8064cd6830da7Mathieu Chartier mutable Mutex pause_histogram_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 2203130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier 2213130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier private: 2223130cdf29eb203be0c38d1107a65d920ec39c106Mathieu Chartier DISALLOW_IMPLICIT_CONSTRUCTORS(GarbageCollector); 2232b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier}; 2242b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 2251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace collector 2261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 2272b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier} // namespace art 2282b82db45c09450022199376c3a5420eacf2aa81eMathieu Chartier 229fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_GC_COLLECTOR_GARBAGE_COLLECTOR_H_ 230