97ef50a1b2
R=asiva@google.com Review URL: https://codereview.chromium.org//19870006 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@25726 260f80e4-7a28-3924-810f-c04153c831b5
77 lines
2.0 KiB
C++
77 lines
2.0 KiB
C++
// 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_
|
|
|