Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(407)

Unified Diff: src/heap-profiler.h

Issue 209028: Heap profiler: count the number of back references for objects. (Closed)
Patch Set: Comments addressed Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/heap-profiler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap-profiler.h
diff --git a/src/heap-profiler.h b/src/heap-profiler.h
index 23d9502c136ac5813f7c0480265e2caaece2fa35..adc3da2b86b02f054af4d2f807193ec209797563 100644
--- a/src/heap-profiler.h
+++ b/src/heap-profiler.h
@@ -46,41 +46,11 @@ class HeapProfiler {
};
-// ConstructorHeapProfile is responsible for gathering and logging
-// "constructor profile" of JS objects allocated on heap.
-// It is run during garbage collection cycle, thus it doesn't need
-// to use handles.
-class ConstructorHeapProfile BASE_EMBEDDED {
- public:
- ConstructorHeapProfile();
- virtual ~ConstructorHeapProfile() {}
- void CollectStats(HeapObject* obj);
- void PrintStats();
- // Used by ZoneSplayTree::ForEach. Made virtual to allow overriding in tests.
- virtual void Call(String* name, const NumberAndSizeInfo& number_and_size);
-
- private:
- struct TreeConfig {
- typedef String* Key;
- typedef NumberAndSizeInfo Value;
- static const Key kNoKey;
- static const Value kNoValue;
- static int Compare(const Key& a, const Key& b) {
- // Strings are unique, so it is sufficient to compare their pointers.
- return a == b ? 0 : (a < b ? -1 : 1);
- }
- };
- typedef ZoneSplayTree<TreeConfig> JSObjectsInfoTree;
-
- ZoneScope zscope_;
- JSObjectsInfoTree js_objects_info_tree_;
-};
-
-
// JSObjectsCluster describes a group of JS objects that are
-// considered equivalent in terms of retainer profile.
+// considered equivalent in terms of a particular profile.
class JSObjectsCluster BASE_EMBEDDED {
public:
+ // These special cases are used in retainer profile.
enum SpecialCase {
ROOTS = 1,
GLOBAL_PROPERTY = 2
@@ -94,8 +64,8 @@ class JSObjectsCluster BASE_EMBEDDED {
JSObjectsCluster(String* constructor, Object* instance)
: constructor_(constructor), instance_(instance) {}
- static int CompareConstructors(
- const JSObjectsCluster& a, const JSObjectsCluster& b) {
+ static int CompareConstructors(const JSObjectsCluster& a,
+ const JSObjectsCluster& b) {
// Strings are unique, so it is sufficient to compare their pointers.
return a.constructor_ == b.constructor_ ? 0
: (a.constructor_ < b.constructor_ ? -1 : 1);
@@ -110,6 +80,7 @@ class JSObjectsCluster BASE_EMBEDDED {
bool is_null() const { return constructor_ == NULL; }
bool can_be_coarsed() const { return instance_ != NULL; }
+ String* constructor() const { return constructor_; }
void Print(StringStream* accumulator) const;
// Allows null clusters to be printed.
@@ -133,14 +104,47 @@ class JSObjectsCluster BASE_EMBEDDED {
};
-struct JSObjectsClusterTreeConfig;
+struct JSObjectsClusterTreeConfig {
+ typedef JSObjectsCluster Key;
+ typedef NumberAndSizeInfo Value;
+ static const Key kNoKey;
+ static const Value kNoValue;
+ static int Compare(const Key& a, const Key& b) {
+ return Key::Compare(a, b);
+ }
+};
typedef ZoneSplayTree<JSObjectsClusterTreeConfig> JSObjectsClusterTree;
-// JSObjectsClusterTree is used to represent retainer graphs using
-// adjacency list form. That is, the first level maps JS object
-// clusters to adjacency lists, which in their turn are degenerate
-// JSObjectsClusterTrees (their values are NULLs.)
-struct JSObjectsClusterTreeConfig {
+
+// ConstructorHeapProfile is responsible for gathering and logging
+// "constructor profile" of JS objects allocated on heap.
+// It is run during garbage collection cycle, thus it doesn't need
+// to use handles.
+class ConstructorHeapProfile BASE_EMBEDDED {
+ public:
+ ConstructorHeapProfile();
+ virtual ~ConstructorHeapProfile() {}
+ void CollectStats(HeapObject* obj);
+ void PrintStats();
+ // Used by ZoneSplayTree::ForEach. Made virtual to allow overriding in tests.
+ virtual void Call(const JSObjectsCluster& cluster,
+ const NumberAndSizeInfo& number_and_size);
+
+ private:
+ ZoneScope zscope_;
+ JSObjectsClusterTree js_objects_info_tree_;
+};
+
+
+// JSObjectsRetainerTree is used to represent retainer graphs using
+// adjacency list form:
+//
+// Cluster -> (Cluster -> NumberAndSizeInfo)
+//
+// Subordinate splay trees are stored by pointer. They are zone-allocated,
+// so it isn't needed to manage their lifetime.
+//
+struct JSObjectsRetainerTreeConfig {
typedef JSObjectsCluster Key;
typedef JSObjectsClusterTree* Value;
static const Key kNoKey;
@@ -149,6 +153,7 @@ struct JSObjectsClusterTreeConfig {
return Key::Compare(a, b);
}
};
+typedef ZoneSplayTree<JSObjectsRetainerTreeConfig> JSObjectsRetainerTree;
class ClustersCoarser BASE_EMBEDDED {
@@ -156,7 +161,7 @@ class ClustersCoarser BASE_EMBEDDED {
ClustersCoarser();
// Processes a given retainer graph.
- void Process(JSObjectsClusterTree* tree);
+ void Process(JSObjectsRetainerTree* tree);
// Returns an equivalent cluster (can be the cluster itself).
// If the given cluster doesn't have an equivalent, returns null cluster.
@@ -165,8 +170,10 @@ class ClustersCoarser BASE_EMBEDDED {
// skipped in some cases.
bool HasAnEquivalent(const JSObjectsCluster& cluster);
- // Used by ZoneSplayTree::ForEach.
+ // Used by JSObjectsRetainerTree::ForEach.
void Call(const JSObjectsCluster& cluster, JSObjectsClusterTree* tree);
+ void Call(const JSObjectsCluster& cluster,
+ const NumberAndSizeInfo& number_and_size);
private:
// Stores a list of back references for a cluster.
@@ -194,11 +201,11 @@ class ClustersCoarser BASE_EMBEDDED {
};
typedef ZoneSplayTree<ClusterEqualityConfig> EqualityTree;
- static int ClusterBackRefsCmp(
- const ClusterBackRefs* a, const ClusterBackRefs* b) {
+ static int ClusterBackRefsCmp(const ClusterBackRefs* a,
+ const ClusterBackRefs* b) {
return ClusterBackRefs::Compare(*a, *b);
}
- int DoProcess(JSObjectsClusterTree* tree);
+ int DoProcess(JSObjectsRetainerTree* tree);
int FillEqualityTree();
static const int kInitialBackrefsListCapacity = 2;
@@ -211,7 +218,7 @@ class ClustersCoarser BASE_EMBEDDED {
SimilarityList sim_list_;
EqualityTree eq_tree_;
ClusterBackRefs* current_pair_;
- JSObjectsClusterTree* current_set_;
+ JSObjectsRetainerTree* current_set_;
};
@@ -224,31 +231,31 @@ class RetainerHeapProfile BASE_EMBEDDED {
class Printer {
public:
virtual ~Printer() {}
- virtual void PrintRetainers(const StringStream& retainers) = 0;
+ virtual void PrintRetainers(const JSObjectsCluster& cluster,
+ const StringStream& retainers) = 0;
};
RetainerHeapProfile();
void CollectStats(HeapObject* obj);
void PrintStats();
void DebugPrintStats(Printer* printer);
- void StoreReference(const JSObjectsCluster& cluster, Object* ref);
+ void StoreReference(const JSObjectsCluster& cluster, HeapObject* ref);
private:
- JSObjectsCluster Clusterize(Object* obj);
-
// Limit on the number of retainers to be printed per cluster.
static const int kMaxRetainersToPrint = 50;
ZoneScope zscope_;
- JSObjectsClusterTree retainers_tree_;
+ JSObjectsRetainerTree retainers_tree_;
ClustersCoarser coarser_;
// TODO(mnaganov): Use some helper class to hold these state variables.
JSObjectsClusterTree* coarse_cluster_tree_;
- int retainers_printed_;
Printer* current_printer_;
StringStream* current_stream_;
public:
- // Used by JSObjectsClusterTree::ForEach.
+ // Used by JSObjectsRetainerTree::ForEach.
void Call(const JSObjectsCluster& cluster, JSObjectsClusterTree* tree);
+ void Call(const JSObjectsCluster& cluster,
+ const NumberAndSizeInfo& number_and_size);
};
« no previous file with comments | « no previous file | src/heap-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698