From 80aa5fda4b823da9f942b95ed10f9ca6f08a19a4 Mon Sep 17 00:00:00 2001 From: Ryan Macnak Date: Fri, 6 Dec 2019 23:20:04 +0000 Subject: [PATCH] [observatory] Account for external size in the "Classes (table)" and "Classes (treemap)" views. Mechanically, this renames shallowSize to internalSize and redefines shallowSize as internalSize + externalSize. Change-Id: I734f5714ad6dff341627e3d6e51e3bdcf26c63ad Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/125993 Reviewed-by: Ben Konyi Commit-Queue: Ryan Macnak --- runtime/observatory/lib/object_graph.dart | 83 ++++++++++--------- .../lib/src/elements/heap_snapshot.dart | 3 +- .../lib/src/heap_snapshot/heap_snapshot.dart | 2 +- 3 files changed, 47 insertions(+), 41 deletions(-) diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart index a2fa1dd626fd..6aa4fe938c35 100644 --- a/runtime/observatory/lib/object_graph.dart +++ b/runtime/observatory/lib/object_graph.dart @@ -99,6 +99,7 @@ abstract class SnapshotObject { String get description; SnapshotClass get klass; int get shallowSize; + int get internalSize; int get externalSize; int get retainedSize; Iterable get successors; @@ -124,7 +125,8 @@ class _SnapshotObject implements SnapshotObject { int get hashCode => _id; - int get shallowSize => _graph._shallowSizes[_id]; + int get shallowSize => internalSize + externalSize; + int get internalSize => _graph._internalSizes[_id]; int get externalSize => _graph._externalSizes[_id]; int get retainedSize => _graph._retainedSizes[_id]; @@ -199,12 +201,14 @@ class MergedObjectVertex { SnapshotClass get klass => _graph._classes[_graph._cids[_id]]; - int get shallowSize { + int get shallowSize => internalSize + externalSize; + + int get internalSize { var cids = _graph._cids; var size = 0; var sibling = _id; while (sibling != SENTINEL && cids[sibling] == cids[_id]) { - size += _graph._shallowSizes[sibling]; + size += _graph._internalSizes[sibling]; sibling = _graph._mergedDomNext[sibling]; } return size; @@ -367,8 +371,9 @@ class _InstancesIterator implements Iterator { abstract class SnapshotClass { String get name; - int get externalSize; int get shallowSize; + int get externalSize; + int get internalSize; int get ownedSize; int get instanceCount; Iterable get instances; @@ -383,16 +388,17 @@ class _SnapshotClass implements SnapshotClass { final Map fields = new Map(); int totalExternalSize = 0; - int totalShallowSize = 0; + int totalInternalSize = 0; int totalInstanceCount = 0; int ownedSize = 0; int liveExternalSize = 0; - int liveShallowSize = 0; + int liveInternalSize = 0; int liveInstanceCount = 0; - int get shallowSize => liveShallowSize; + int get shallowSize => internalSize + externalSize; + int get internalSize => liveInternalSize; int get externalSize => liveExternalSize; int get instanceCount => liveInstanceCount; @@ -403,7 +409,7 @@ class _SnapshotClass implements SnapshotClass { } abstract class SnapshotGraph { - int get shallowSize; + int get internalSize; int get externalSize; int get size; int get capacity; @@ -434,8 +440,8 @@ const kUnknownFieldName = ""; class _SnapshotGraph implements SnapshotGraph { _SnapshotGraph(Uint8List encoded) : this._encoded = encoded; - int get size => _liveShallowSize + _liveExternalSize; - int get shallowSize => _liveShallowSize; + int get size => _liveInternalSize + _liveExternalSize; + int get internalSize => _liveInternalSize; int get externalSize => _liveExternalSize; int get capacity => _capacity; @@ -559,9 +565,9 @@ class _SnapshotGraph implements SnapshotGraph { int _E; // References in the snapshot. int _capacity; - int _liveShallowSize; + int _liveInternalSize; int _liveExternalSize; - int _totalShallowSize; + int _totalInternalSize; int _totalExternalSize; List<_SnapshotClass> _classes; @@ -570,7 +576,7 @@ class _SnapshotGraph implements SnapshotGraph { // From snapshot. List _nonReferenceData; Uint16List _cids; - Uint32List _shallowSizes; + Uint32List _internalSizes; Uint32List _externalSizes; Uint32List _firstSuccs; Uint32List _succs; @@ -595,7 +601,7 @@ class _SnapshotGraph implements SnapshotGraph { stream.readUnsigned(); // Flags stream.readUtf8(); // Name - _totalShallowSize = stream.readUnsigned(); + _totalInternalSize = stream.readUnsigned(); _capacity = stream.readUnsigned(); _totalExternalSize = stream.readUnsigned(); @@ -632,7 +638,7 @@ class _SnapshotGraph implements SnapshotGraph { _N = N; _E = E; - var shallowSizes = new Uint32List(N + 1); + var internalSizes = new Uint32List(N + 1); var cids = new Uint16List(N + 1); var nonReferenceData = new List(N + 1); var firstSuccs = new Uint32List(N + 2); @@ -642,8 +648,8 @@ class _SnapshotGraph implements SnapshotGraph { var cid = stream.readUnsigned(); cids[oid] = cid; - var shallowSize = stream.readUnsigned(); - shallowSizes[oid] = shallowSize; + var internalSize = stream.readUnsigned(); + internalSizes[oid] = internalSize; var nonReferenceDataTag = stream.readUnsigned(); switch (nonReferenceDataTag) { @@ -702,7 +708,7 @@ class _SnapshotGraph implements SnapshotGraph { assert(eid <= E); _E = eid; - _shallowSizes = shallowSizes; + _internalSizes = internalSizes; _cids = cids; _nonReferenceData = nonReferenceData; _firstSuccs = firstSuccs; @@ -728,25 +734,25 @@ class _SnapshotGraph implements SnapshotGraph { var N = _N; var classes = _classes; var cids = _cids; - var shallowSizes = _shallowSizes; + var internalSizes = _internalSizes; var externalSizes = _externalSizes; - var totalShallowSize = 0; + var totalInternalSize = 0; var totalExternalSize = 0; for (var oid = 1; oid <= N; oid++) { - var shallowSize = shallowSizes[oid]; - totalShallowSize += shallowSize; + var internalSize = internalSizes[oid]; + totalInternalSize += internalSize; var externalSize = externalSizes[oid]; totalExternalSize += externalSize; var cls = classes[cids[oid]]; - cls.totalShallowSize += shallowSize; + cls.totalInternalSize += internalSize; cls.totalExternalSize += externalSize; cls.totalInstanceCount++; } - _totalShallowSize = totalShallowSize; + _totalInternalSize = totalInternalSize; _totalExternalSize = totalExternalSize; } @@ -907,7 +913,7 @@ class _SnapshotGraph implements SnapshotGraph { var kFieldCid = _kFieldCid; var cids = _cids; - var shallowSizes = _shallowSizes; + var internalSizes = _internalSizes; var externalSizes = _externalSizes; var vertex = _vertex; var firstPreds = _firstPreds; @@ -916,7 +922,7 @@ class _SnapshotGraph implements SnapshotGraph { var ownedSizes = new Uint32List(N + 1); for (var i = 1; i <= Nconnected; i++) { var v = vertex[i]; - ownedSizes[v] = shallowSizes[v] + externalSizes[v]; + ownedSizes[v] = internalSizes[v] + externalSizes[v]; } for (var i = Nconnected; i > 1; i--) { @@ -1120,11 +1126,11 @@ class _SnapshotGraph implements SnapshotGraph { var N = _N; var Nconnected = _Nconnected; - var liveShallowSize = 0; + var liveInternalSize = 0; var liveExternalSize = 0; var classes = _classes; var cids = _cids; - var shallowSizes = _shallowSizes; + var internalSizes = _internalSizes; var externalSizes = _externalSizes; var vertex = _vertex; var doms = _doms; @@ -1132,13 +1138,13 @@ class _SnapshotGraph implements SnapshotGraph { // Sum internal and external sizes. for (var i = 1; i <= Nconnected; i++) { var v = vertex[i]; - var shallowSize = shallowSizes[v]; + var internalSize = internalSizes[v]; var externalSize = externalSizes[v]; - liveShallowSize += shallowSize; + liveInternalSize += internalSize; liveExternalSize += externalSize; var cls = classes[cids[v]]; - cls.liveShallowSize += shallowSize; + cls.liveInternalSize += internalSize; cls.liveExternalSize += externalSize; cls.liveInstanceCount++; } @@ -1146,7 +1152,7 @@ class _SnapshotGraph implements SnapshotGraph { // Start with retained size as shallow size + external size. var retainedSizes = new Uint32List(N + 1); for (var i = 0; i < N + 1; i++) { - retainedSizes[i] = shallowSizes[i] + externalSizes[i]; + retainedSizes[i] = internalSizes[i] + externalSizes[i]; } // In post order (bottom up), add retained size to dominator's retained @@ -1158,19 +1164,20 @@ class _SnapshotGraph implements SnapshotGraph { } // Root retains everything. - assert(retainedSizes[ROOT] == (liveShallowSize + liveExternalSize)); + assert(retainedSizes[ROOT] == (liveInternalSize + liveExternalSize)); _retainedSizes = retainedSizes; - _liveShallowSize = liveShallowSize; + _liveInternalSize = liveInternalSize; _liveExternalSize = liveExternalSize; Logger.root - .info("internal-garbage: ${_totalShallowSize - _liveShallowSize}"); + .info("internal-garbage: ${_totalInternalSize - _liveInternalSize}"); Logger.root .info("external-garbage: ${_totalExternalSize - _liveExternalSize}"); - Logger.root.info("fragmentation: ${_capacity - _totalShallowSize}"); - assert(_liveShallowSize <= _totalShallowSize); - assert(_totalShallowSize <= _capacity); + Logger.root.info("fragmentation: ${_capacity - _totalInternalSize}"); + assert(_liveInternalSize <= _totalInternalSize); + assert(_liveExternalSize <= _totalExternalSize); + assert(_totalInternalSize <= _capacity); } // Build linked lists of the children for each node in the dominator tree. diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart index 8460715f70dd..b2b0370c6ac9 100644 --- a/runtime/observatory/lib/src/elements/heap_snapshot.dart +++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart @@ -873,8 +873,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable { _updateLines(element.children[1].children, depth); element.children[2].text = Utils.formatPercentNormalized(node.shallowSize * 1.0 / _snapshot.size); - element.children[3].text = - Utils.formatSize(node.shallowSize + node.externalSize); + element.children[3].text = Utils.formatSize(node.shallowSize); element.children[4].text = node.instanceCount.toString(); element.children[5].text = node.name; } diff --git a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart index 1c27dbc160c8..d2ebd636879a 100644 --- a/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart +++ b/runtime/observatory/lib/src/heap_snapshot/heap_snapshot.dart @@ -11,7 +11,7 @@ part of heap_snapshot; class HeapSnapshot implements M.HeapSnapshot { SnapshotGraph graph; DateTime timestamp; - int get size => graph.shallowSize + graph.externalSize; + int get size => graph.internalSize + graph.externalSize; HeapSnapshotMergedDominatorNode mergedDominatorTree; List classes; SnapshotObject get root => graph.root;