Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of heap_snapshot; | 5 part of heap_snapshot; |
| 6 | 6 |
| 7 class HeapSnapshot implements M.HeapSnapshot { | 7 class HeapSnapshot implements M.HeapSnapshot { |
| 8 ObjectGraph graph; | 8 ObjectGraph graph; |
| 9 DateTime timestamp; | 9 DateTime timestamp; |
| 10 int get objects => graph.vertexCount; | 10 int get objects => graph.vertexCount; |
| 11 int get references => graph.edgeCount; | 11 int get references => graph.edgeCount; |
| 12 int get size => graph.internalSize + graph.externalSize; | 12 int get size => graph.internalSize + graph.externalSize; |
| 13 HeapSnapshotDominatorNode dominatorTree; | 13 HeapSnapshotDominatorNode dominatorTree; |
| 14 HeapSnapshotMergedDominatorNode mergedDominatorTree; | 14 HeapSnapshotMergedDominatorNode mergedDominatorTree; |
| 15 List<MergedVertex> classReferences; | 15 List<MergedVertex> classReferences; |
| 16 List<OwnershipClass> ownershipClasses; | |
| 16 | 17 |
| 17 static Future sleep([Duration duration = const Duration(microseconds: 0)]) { | 18 static Future sleep([Duration duration = const Duration(microseconds: 0)]) { |
| 18 final Completer completer = new Completer(); | 19 final Completer completer = new Completer(); |
| 19 new Timer(duration, () => completer.complete()); | 20 new Timer(duration, () => completer.complete()); |
| 20 return completer.future; | 21 return completer.future; |
| 21 } | 22 } |
| 22 | 23 |
| 23 Stream<List> loadProgress(S.Isolate isolate, S.RawHeapSnapshot raw) { | 24 Stream<List> loadProgress(S.Isolate isolate, S.RawHeapSnapshot raw) { |
| 24 final progress = new StreamController<List>.broadcast(); | 25 final progress = new StreamController<List>.broadcast(); |
| 25 progress.add(['', 0.0]); | 26 progress.add(['', 0.0]); |
| 26 graph = new ObjectGraph(raw.chunks, raw.count); | 27 graph = new ObjectGraph(raw.chunks, raw.count); |
| 27 var signal = (String description, double p) { | 28 var signal = (String description, double p) { |
| 28 progress.add([description, p]); | 29 progress.add([description, p]); |
| 29 return sleep(); | 30 return sleep(); |
| 30 }; | 31 }; |
| 31 (() async { | 32 (() async { |
| 32 timestamp = new DateTime.now(); | 33 timestamp = new DateTime.now(); |
| 33 final stream = graph.process(); | 34 final stream = graph.process(); |
| 34 stream.listen((status) { | 35 stream.listen((status) { |
| 35 status[1] /= 2.0; | 36 status[1] /= 2.0; |
| 36 progress.add(status); | 37 progress.add(status); |
| 37 }); | 38 }); |
| 38 await stream.last; | 39 await stream.last; |
| 39 dominatorTree = new HeapSnapshotDominatorNode(isolate, graph.root); | 40 dominatorTree = new HeapSnapshotDominatorNode(isolate, graph.root); |
| 40 mergedDominatorTree = | 41 mergedDominatorTree = |
| 41 new HeapSnapshotMergedDominatorNode(isolate, graph.mergedRoot); | 42 new HeapSnapshotMergedDominatorNode(isolate, graph.mergedRoot); |
| 42 classReferences = await buildMergedVertices(isolate, graph, signal); | 43 classReferences = await buildMergedVertices(isolate, graph, signal); |
| 44 ownershipClasses = buildOwnershipClasses(isolate, graph); | |
| 43 progress.close(); | 45 progress.close(); |
| 44 }()); | 46 }()); |
| 45 return progress.stream; | 47 return progress.stream; |
| 46 } | 48 } |
| 47 | 49 |
| 48 Future<List<MergedVertex>> buildMergedVertices( | 50 Future<List<MergedVertex>> buildMergedVertices( |
| 49 S.Isolate isolate, ObjectGraph graph, signal) async { | 51 S.Isolate isolate, ObjectGraph graph, signal) async { |
| 50 final cidToMergedVertex = {}; | 52 final cidToMergedVertex = {}; |
| 51 | 53 |
| 52 int count = 0; | 54 int count = 0; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 target.incomingEdges.add(edge); | 95 target.incomingEdges.add(edge); |
| 94 } | 96 } |
| 95 edge.count++; | 97 edge.count++; |
| 96 // An over-estimate if there are multiple references to the same object. | 98 // An over-estimate if there are multiple references to the same object. |
| 97 edge.shallowSize += vertex2.shallowSize ?? 0; | 99 edge.shallowSize += vertex2.shallowSize ?? 0; |
| 98 } | 100 } |
| 99 } | 101 } |
| 100 return cidToMergedVertex.values.toList(); | 102 return cidToMergedVertex.values.toList(); |
| 101 } | 103 } |
| 102 | 104 |
| 105 buildOwnershipClasses(S.Isolate isolate, ObjectGraph graph) { | |
| 106 var numCids = graph.numCids; | |
| 107 var classes = new List(); | |
| 108 for (var cid = 0; cid < numCids; cid++) { | |
| 109 var size = graph.getOwnedByCid(cid); | |
| 110 if (size != 0) { | |
| 111 classes.add(new OwnershipClass(cid, isolate, size)); | |
| 112 } | |
| 113 } | |
| 114 return classes; | |
| 115 } | |
| 116 | |
| 103 List<Future<S.ServiceObject>> getMostRetained(S.Isolate isolate, | 117 List<Future<S.ServiceObject>> getMostRetained(S.Isolate isolate, |
| 104 {int classId, int limit}) { | 118 {int classId, int limit}) { |
| 105 var result = []; | 119 var result = []; |
| 106 for (ObjectVertex v | 120 for (ObjectVertex v |
| 107 in graph.getMostRetained(classId: classId, limit: limit)) { | 121 in graph.getMostRetained(classId: classId, limit: limit)) { |
| 108 result.add( | 122 result.add( |
| 109 isolate.getObjectByAddress(v.address).then((S.ServiceObject obj) { | 123 isolate.getObjectByAddress(v.address).then((S.ServiceObject obj) { |
| 110 if (obj is S.HeapObject) { | 124 if (obj is S.HeapObject) { |
| 111 obj.retainedSize = v.retainedSize; | 125 obj.retainedSize = v.retainedSize; |
| 112 } else { | 126 } else { |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 260 final MergedEdge edge; | 274 final MergedEdge edge; |
| 261 S.Class get target => edge.sourceVertex != vertex | 275 S.Class get target => edge.sourceVertex != vertex |
| 262 ? edge.sourceVertex.clazz | 276 ? edge.sourceVertex.clazz |
| 263 : edge.targetVertex.clazz; | 277 : edge.targetVertex.clazz; |
| 264 int get count => edge.count; | 278 int get count => edge.count; |
| 265 int get shallowSize => edge.shallowSize; | 279 int get shallowSize => edge.shallowSize; |
| 266 int get retainedSize => edge.retainedSize; | 280 int get retainedSize => edge.retainedSize; |
| 267 | 281 |
| 268 HeapSnapshotClassOutbound(this.vertex, this.edge); | 282 HeapSnapshotClassOutbound(this.vertex, this.edge); |
| 269 } | 283 } |
| 284 | |
| 285 class OwnershipClass { | |
|
cbernaschina
2017/08/29 21:07:00
ditto
rmacnak
2017/08/29 23:59:34
Done.
| |
| 286 final int cid; | |
| 287 final S.Isolate isolate; | |
| 288 S.Class get clazz => isolate.getClassByCid(cid); | |
| 289 final int size; | |
| 290 | |
| 291 OwnershipClass(this.cid, this.isolate, this.size); | |
| 292 } | |
| OLD | NEW |