blob: 46f6dc13f7f24c0ed3988153df8232cde231ef6c [file] [log] [blame]
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef VM_HEAP_HISTOGRAM_H_
#define VM_HEAP_HISTOGRAM_H_
#include "platform/assert.h"
#include "vm/flags.h"
#include "vm/globals.h"
#include "vm/raw_object.h"
namespace dart {
class JSONStream;
DECLARE_FLAG(bool, print_object_histogram);
// ObjectHistogram is used to compute an average object histogram over
// the lifetime of an isolate and then print the histogram when the isolate
// is shut down. Information is gathered at the back-edge of each major GC
// event. When an object histogram is collected for an isolate, an extra major
// GC is performed just prior to shutdown.
class ObjectHistogram {
public:
explicit ObjectHistogram(Isolate* isolate);
~ObjectHistogram();
// Called when a new class is registered in the isolate.
void RegisterClass(const Class& cls);
// Collect sample for the histogram. Called at back-edge of major GC.
void Collect();
// Print the histogram on stdout.
void Print();
void PrintToJSONStream(JSONStream* stream);
private:
// Add obj to histogram
void Add(RawObject* obj);
// For each class an Element keeps track of the accounting.
class Element : public ValueObject {
public:
void Add(int size) {
count_++;
size_ += size;
}
intptr_t class_id_;
intptr_t count_;
intptr_t size_;
};
// Compare function for sorting result.
static int compare(const Element** a, const Element** b);
// This function returns a malloced array. Caller is responsible for calling
// free().
Element** GetSortedArray(intptr_t* array_length);
intptr_t major_gc_count_;
intptr_t table_length_;
Element* table_;
Isolate* isolate_;
friend class ObjectHistogramVisitor;
DISALLOW_COPY_AND_ASSIGN(ObjectHistogram);
};
} // namespace dart
#endif // VM_HEAP_HISTOGRAM_H_