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