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

Unified Diff: tracing/tracing/ui/extras/v8/gc_objects_stats_table.html

Issue 2386873002: Implement single/multi V8 GC objects statistics sub view. (Closed)
Patch Set: remove diff Created 4 years, 2 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
Index: tracing/tracing/ui/extras/v8/gc_objects_stats_table.html
diff --git a/tracing/tracing/ui/extras/v8/gc_objects_stats_table.html b/tracing/tracing/ui/extras/v8/gc_objects_stats_table.html
new file mode 100644
index 0000000000000000000000000000000000000000..e95167788583be97bde26f94471c80582eca8deb
--- /dev/null
+++ b/tracing/tracing/ui/extras/v8/gc_objects_stats_table.html
@@ -0,0 +1,558 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<link rel="import" href="/tracing/extras/v8/v8_gc_stats_thread_slice.html">
+<link rel="import" href="/tracing/ui/base/table.html">
+
+<dom-module id='tr-ui-e-v8-gc-objects-stats-table'>
+ <template>
+ <style>
+ tr-ui-b-table {
+ flex: 0 0 auto;
+ align-self: stretch;
+ margin-top: 1em;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module>
+<script>
+'use strict';
+
+tr.exportTo('tr.ui.e.v8', function() {
+
+ var InstanceTypeGroups = {
fmeawad 2016/10/04 17:50:55 We need to move those groups as well as the runtim
lpy 2016/10/05 17:44:28 Agree.
+ Rest: [
+ "ACCESSOR_INFO_TYPE",
+ "ACCESSOR_PAIR_TYPE",
+ "ACCESS_CHECK_INFO_TYPE",
+ "ALLOCATION_MEMENTO_TYPE",
+ "ALLOCATION_SITE_TYPE",
+ "CALL_HANDLER_INFO_TYPE",
+ "CELL_TYPE",
+ "FIXED_INT8_ARRAY_TYPE",
+ "FIXED_UINT8_ARRAY_TYPE",
+ "FIXED_UINT8_CLAMPED_ARRAY_TYPE",
+ "FIXED_INT16_ARRAY_TYPE",
+ "FIXED_UINT16_ARRAY_TYPE",
+ "FIXED_INT32_ARRAY_TYPE",
+ "FIXED_UINT32_ARRAY_TYPE",
+ "FIXED_FLOAT32_ARRAY_TYPE",
+ "FIXED_FLOAT64_ARRAY_TYPE",
+ "FIXED_DOUBLE_ARRAY_TYPE",
+ "FOREIGN_TYPE",
+ "FUNCTION_TEMPLATE_INFO_TYPE",
+ "HEAP_NUMBER_TYPE",
+ "INTERCEPTOR_INFO_TYPE",
+ "MUTABLE_HEAP_NUMBER_TYPE",
+ "OBJECT_TEMPLATE_INFO_TYPE",
+ "ODDBALL_TYPE",
+ "PROPERTY_CELL_TYPE",
+ "PROTOTYPE_INFO_TYPE",
+ "SCRIPT_TYPE",
+ "SYMBOL_TYPE",
+ "TRANSITION_ARRAY_TYPE",
+ "TYPE_FEEDBACK_INFO_TYPE"
+ ],
+ Strings: [
+ "CONS_ONE_BYTE_STRING_TYPE",
+ "CONS_STRING_TYPE",
+ "EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE",
+ "EXTERNAL_ONE_BYTE_STRING_TYPE",
+ "EXTERNAL_INTERNALIZED_STRING_TYPE",
+ "EXTERNAL_STRING_TYPE",
+ "INTERNALIZED_STRING_TYPE",
+ "ONE_BYTE_INTERNALIZED_STRING_TYPE",
+ "ONE_BYTE_STRING_TYPE",
+ "SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE",
+ "SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE",
+ "SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE",
+ "SHORT_EXTERNAL_STRING_TYPE",
+ "SLICED_ONE_BYTE_STRING_TYPE",
+ "SLICED_STRING_TYPE",
+ "STRING_TYPE"
+ ],
+ JS_OTHER: [
+ "JS_API_OBJECT_TYPE",
+ "JS_ARGUMENTS_TYPE",
+ "JS_ARRAY_BUFFER_TYPE",
+ "JS_ARRAY_TYPE",
+ "JS_BOUND_FUNCTION_TYPE",
+ "JS_ERROR_TYPE",
+ "JS_DATE_TYPE",
+ "JS_FUNCTION_TYPE",
+ "JS_GLOBAL_OBJECT_TYPE",
+ "JS_GLOBAL_PROXY_TYPE",
+ "JS_MAP_ITERATOR_TYPE",
+ "JS_MAP_TYPE",
+ "JS_MESSAGE_OBJECT_TYPE",
+ "JS_PROMISE_TYPE",
+ "JS_REGEXP_TYPE",
+ "JS_SPECIAL_API_OBJECT_TYPE",
+ "JS_TYPED_ARRAY_TYPE",
+ "JS_VALUE_TYPE",
+ "JS_WEAK_MAP_TYPE"
+ ],
+ FIXED_ARRAY_TYPE: [
+ "*FIXED_ARRAY_CODE_STUBS_TABLE_SUB_TYPE",
+ "*FIXED_ARRAY_COMPILATION_CACHE_TABLE_SUB_TYPE",
+ "*FIXED_ARRAY_CONTEXT_SUB_TYPE",
+ "*FIXED_ARRAY_COPY_ON_WRITE_SUB_TYPE",
+ "*FIXED_ARRAY_DEOPTIMIZATION_DATA_SUB_TYPE",
+ "*FIXED_ARRAY_DESCRIPTOR_ARRAY_SUB_TYPE",
+ "*FIXED_ARRAY_EMBEDDED_OBJECT_SUB_TYPE",
+ "*FIXED_ARRAY_ENUM_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_ENUM_INDICES_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_DEPENDENT_CODE_SUB_TYPE",
+ "*FIXED_ARRAY_DICTIONARY_ELEMENTS_SUB_TYPE",
+ "*FIXED_ARRAY_DICTIONARY_PROPERTIES_SUB_TYPE",
+ "*FIXED_ARRAY_EMPTY_PROPERTIES_DICTIONARY_SUB_TYPE",
+ "*FIXED_ARRAY_FAST_ELEMENTS_SUB_TYPE",
+ "*FIXED_ARRAY_FAST_PROPERTIES_SUB_TYPE",
+ "*FIXED_ARRAY_HANDLER_TABLE_SUB_TYPE",
+ "*FIXED_ARRAY_INTRINSIC_FUNCTION_NAMES_SUB_TYPE",
+ "*FIXED_ARRAY_JS_COLLECTION_SUB_TYPE",
+ "*FIXED_ARRAY_JS_WEAK_COLLECTION_SUB_TYPE",
+ "*FIXED_ARRAY_LITERALS_ARRAY_SUB_TYPE",
+ "*FIXED_ARRAY_MAP_CODE_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_NOSCRIPT_SHARED_FUNCTION_INFOS_SUB_TYPE",
+ "*FIXED_ARRAY_NUMBER_STRING_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_OBJECT_TO_CODE_SUB_TYPE",
+ "*FIXED_ARRAY_OPTIMIZED_CODE_LITERALS_TUB_TYPE",
+ "*FIXED_ARRAY_OPTIMIZED_CODE_MAP_SUB_TYPE",
+ "*FIXED_ARRAY_PROTOTYPE_USERS_SUB_TYPE",
+ "*FIXED_ARRAY_REGEXP_MULTIPLE_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_RETAINED_MAPS_SUB_TYPE",
+ "*FIXED_ARRAY_SCOPE_INFO_SUB_TYPE",
+ "*FIXED_ARRAY_SCRIPT_LIST_SUB_TYPE",
+ "*FIXED_ARRAY_SERIALIZED_TEMPLATES_SUB_TYPE",
+ "*FIXED_ARRAY_SHARED_FUNCTION_INFOS_SUB_TYPE",
+ "*FIXED_ARRAY_SINGLE_CHARACTER_STRING_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_STRING_SPLIT_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_STRING_TABLE_SUB_TYPE",
+ "*FIXED_ARRAY_TEMPLATE_INFO_SUB_TYPE",
+ "*FIXED_ARRAY_TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE",
+ "*FIXED_ARRAY_TYPE_FEEDBACK_VECTOR_SUB_TYPE",
+ "*FIXED_ARRAY_TYPE_FEEDBACK_METADATA_SUB_TYPE",
+ "*FIXED_ARRAY_WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE",
+ "*FIXED_ARRAY_UNKNOWN_SUB_TYPE"
+ ],
+ CODE_TYPE: [
+ "*CODE_FUNCTION",
+ "*CODE_OPTIMIZED_FUNCTION",
+ "*CODE_BYTECODE_HANDLER",
+ "*CODE_STUB",
+ "*CODE_HANDLER",
+ "*CODE_BUILTIN",
+ "*CODE_REGEXP",
+ "*CODE_WASM_FUNCTION",
+ "*CODE_WASM_TO_JS_FUNCTION",
+ "*CODE_JS_TO_WASM_FUNCTION",
+ "*CODE_LOAD_IC",
+ "*CODE_LOAD_GLOBAL_IC",
+ "*CODE_KEYED_LOAD_IC",
+ "*CODE_CALL_IC",
+ "*CODE_STORE_IC",
+ "*CODE_KEYED_STORE_IC",
+ "*CODE_BINARY_OP_IC",
+ "*CODE_COMPARE_IC",
+ "*CODE_TO_BOOLEAN_IC"
+ ],
+ CONTEXT_EXTENSION_TYPE: [
+ 'CONTEXT_EXTENSION_TYPE'
+ ],
+ MAP_TYPE: [
+ 'MAP_TYPE'
+ ],
+ BYTE_ARRAY_TYPE: [
+ 'BYTE_ARRAY_TYPE'
+ ],
+ SHARED_FUNCTION_INFO_TYPE: [
+ 'SHARED_FUNCTION_INFO_TYPE'
+ ],
+ WEAK_CELL_TYPE: [
+ 'WEAK_CELL_TYPE'
+ ],
+ JS_OBJECT_TYPE: [
+ 'JS_OBJECT_TYPE'
+ ],
+ JS_CONTEXT_EXTENSION_OBJECT_TYPE: [
+ 'JS_CONTEXT_EXTENSION_OBJECT_TYPE'
+ ]
+ };
+
+ var InstanceSubTypeNames = {
+ FIXED_ARRAY_TYPE: {
+ keyToName: key => key.slice("*FIXED_ARRAY_".length)
+ .slice(0, -("_SUB_TYPE".length)),
+ nameToKey: name => "*FIXED_ARRAY_" + name + "_SUB_TYPE"
+ },
+ CODE_TYPE: {
+ keyToName: key => key.slice("*CODE_".length),
+ nameToKey: name => "*CODE_" + name
+ },
+ Strings: {
+ keyToName: key => key,
+ nameToKey: name => name
+ },
+ Rest: {
+ keyToName: key => key,
+ nameToKey: name => name
+ },
+ JS_OTHER: {
+ keyToName: key => key,
+ nameToKey: name => name
+ }
+ };
+
+ class Entry {
+ constructor(title, count, overall, overAllocated, histogram,
+ overAllocatedHistogram) {
+ this.title_ = title;
+ this.overall_ = overall;
+ this.count_ = count;
+ this.overAllocated_ = overAllocated;
+ this.histogram_ = histogram;
+ this.overAllocatedHistogram_ = overAllocatedHistogram;
+ this.bucketSize_ = this.histogram_.length;
+ this.overallPercent_ = 100;
+ this.overAllocatedPercent_ = 100;
+ }
+
+ get title() {
+ return this.title_;
+ }
+
+ get overall() {
+ return this.overall_;
+ }
+
+ get count() {
+ return this.count_;
+ }
+
+ get overAllocated() {
+ return this.overAllocated_;
+ }
+
+ get histogram() {
+ return this.histogram_;
+ }
+
+ get overAllocatedHistogram() {
+ return this.overAllocatedHistogram_;
+ }
+
+ get bucketSize() {
+ return this.bucketSize_;
+ }
+
+ get overallPercent() {
+ return this.overallPercent_;
+ }
+
+ set overallPercent(value) {
+ this.overallPercent_ = value;
+ }
+
+ get overAllocatedPercent() {
+ return this.overAllocatedPercent_;
+ }
+
+ set overAllocatedPercent(value) {
+ this.overAllocatedPercent_ = value;
+ }
+
+ setFromObject(obj) {
+ this.count_ = obj.count;
+ this.overall_ = obj.overall;
+ this.overAllocated_ = obj.over_allocated;
+ this.histogram_ = obj.histogram;
+ this.overAllocatedHistogram_ = obj.over_allocated_histogram;
+ }
+ }
+
+ class GroupedEntry extends Entry {
+ constructor(title, count, overall, overAllocated, histogram,
+ overAllocatedHistogram) {
+ super(title, count, overall, overAllocated, histogram,
+ overAllocatedHistogram);
+ this.histogram_.fill(0);
+ this.overAllocatedHistogram_.fill(0);
+ this.entries_ = new Map();
+ }
+
+ get subRows() {
+ return Array.from(this.entries_.values());
+ }
+
+ getEntryFromTitle(title) {
+ return this.entries_.get(title);
+ }
+
+ add(entry) {
+ this.count_ += entry.count;
+ this.overall_ += entry.overall;
+ this.overAllocated_ += entry.overAllocated;
+ if (this.bucketSize_ === entry.bucketSize) {
+ for (var i = 0; i < this.bucketSize_; ++i) {
+ this.histogram_[i] += entry.histogram[i];
+ this.overAllocatedHistogram_[i] += entry.overAllocatedHistogram[i];
+ }
+ }
+ this.entries_.set(entry.title, entry);
+ }
+
+ accumulateUnknown(title) {
+ var unknownCount = this.count_;
+ var unknownOverall = this.overall_;
+ var unknownOverAllocated = this.overAllocated_;
+ var unknownHistogram = tr.b.deepCopy(this.histogram_);
+ var unknownOverAllocatedHistogram =
+ tr.b.deepCopy(this.overAllocatedHistogram_);
+ for (var entry of this.entries_.values()) {
+ unknownCount -= entry.count;
+ unknownOverall -= entry.overall;
+ unknownOverAllocated -= entry.overAllocated;
+ for (var i = 0; i < this.bucketSize_; ++i) {
+ unknownHistogram[i] -= entry.histogram[i];
+ unknownOverAllocatedHistogram[i] -= entry.overAllocatedHistogram[i];
+ }
+ }
+ this.entries_.set(title, new Entry(title, unknownCount, unknownOverall,
+ unknownOverAllocated, unknownHistogram,
+ unknownOverAllocatedHistogram));
+ }
+
+ calculatePercentage() {
+ for (var entry of this.entries_.values()) {
+ if (this.overall_ > 0) {
+ entry.overallPercent =
+ (entry.overall / this.overall_ * 100).toFixed(3);
+ } else {
+ entry.overallPercent = 0;
+ }
+
+ if (this.overAllocated_ > 0) {
+ entry.overAllocatedPercent =
+ (entry.overAllocated / this.overAllocated_ * 100).toFixed(3);
+ } else {
+ entry.overAllocatedPercent = 0;
+ }
+
+ if (entry instanceof GroupedEntry) entry.calculatePercentage();
+ }
+ }
+ }
+
+ function plusMinus(value, suffix) {
fmeawad 2016/10/04 17:50:55 Is this still used?
lpy 2016/10/05 17:44:28 Done.
+ return (value > 0 ? '+' : '') + value + suffix;
+ }
+
+ Polymer({
+ is: 'tr-ui-e-v8-gc-objects-stats-table',
+
+ ready: function() {
+ this.isolateEntries_ = [];
+ },
+
+ constructTable_: function() {
+ this.$.table.selectionMode = tr.ui.b.TableFormat.SelectionMode.ROW;
+ this.$.table.tableColumns = [
+ {
+ title: 'Component',
+ value: function(row) {
+ var typeEl = document.createElement('span');
+ typeEl.innerText = row.title;
+ return typeEl;
+ },
+ showExpandButtons: true
+ },
+ {
+ title: 'Overall Memory (KB)',
+ value: function(row) {
+ var typeEl = document.createElement('span');
+ typeEl.innerText = (row.overall / 1024).toFixed(3);
+ return typeEl;
+ },
+ cmp: function(a, b) {
+ return a.overall - b.overall;
+ }
+ },
+ {
+ title: 'Over Allocated Memory (KB)',
+ value: function(row) {
+ var typeEl = document.createElement('span');
+ typeEl.innerText = (row.overAllocated / 1024).toFixed(3);
+ return typeEl;
+ },
+ cmp: function(a, b) {
+ return a.overAllocated - b.overAllocated;
+ }
+ },
+ {
+ title: 'Overall Count',
+ value: function(row) {
+ var typeEl = document.createElement('span');
+ typeEl.innerText = row.count;
+ return typeEl;
+ },
+ cmp: function(a, b) {
+ return a.count - b.count;
+ }
+ },
+ {
+ title: 'Overall Memory Percent',
+ value: function(row) {
+ var typeEl = document.createElement('span');
+ typeEl.innerText = row.overallPercent + '%';
+ return typeEl;
+ },
+ cmp: function(a, b) {
+ return a.overall - b.overall;
+ }
+ },
+ {
+ title: 'Overall Allocated Memory Percent',
+ value: function(row) {
+ var typeEl = document.createElement('span');
+ typeEl.innerText = row.overAllocatedPercent + '%';
+ return typeEl;
+ },
+ cmp: function(a, b) {
+ return a.overAllocated - b.overAllocated;
+ }
+ }
+ ];
+
+ this.$.table.sortColumnIndex = 1;
+ this.$.table.sortDescending = true;
+ },
+
+ buildSubEntry_: function(objects, groupEntry, keyToName) {
+ var typeGroup = InstanceTypeGroups[groupEntry.title];
+ for (var instanceType of typeGroup) {
+ var e = objects[instanceType];
+ delete objects[instanceType];
+ if (e === undefined) continue;
+ var title = instanceType;
+ if (keyToName !== undefined) title = keyToName(title);
+ groupEntry.add(new Entry(title, e.count, e.overall, e.over_allocated,
+ e.histogram, e.over_allocated_histogram));
+ }
+ },
+
+ buildOthers_: function(objects, groupEntry) {
+ for (var title of Object.getOwnPropertyNames(objects)) {
+ if (title === 'END') continue;
+ var obj = objects[title];
+ groupEntry.add(new Entry(title, obj.count, obj.overall,
+ obj.over_allocated, obj.histogram,
+ obj.over_allocated_histogram))
+ }
+ },
+
+ build_: function(objects, objectEntry, bucketSize) {
+ var fixedArrayObject = objects['FIXED_ARRAY_TYPE'];
+ if (fixedArrayObject === undefined)
+ throw new Error('Fixed Array Object not found.');
+
+ var groupEntries = {
+ restEntry: new GroupedEntry('Rest', 0, 0, 0, new Array(bucketSize),
+ new Array(bucketSize)),
+ stringEntry: new GroupedEntry('Strings', 0, 0, 0, new Array(bucketSize),
+ new Array(bucketSize)),
+ jsEntry: new GroupedEntry('JS_OTHER', 0, 0, 0, new Array(bucketSize),
+ new Array(bucketSize)),
+ fixedArrayEntry: new GroupedEntry('FIXED_ARRAY_TYPE', 0, 0, 0,
+ new Array(bucketSize),
+ new Array(bucketSize)),
+ codeEntry: new GroupedEntry('CODE_TYPE', 0, 0, 0, new Array(bucketSize),
+ new Array(bucketSize)),
+ contextExtensionEntry: new GroupedEntry('CONTEXT_EXTENSION_TYPE', 0, 0,
+ 0, new Array(bucketSize),
+ new Array(bucketSize)),
+ mapEntry: new GroupedEntry('MAP_TYPE', 0, 0, 0, new Array(bucketSize),
+ new Array(bucketSize)),
+ byteArrayEntry: new GroupedEntry('BYTE_ARRAY_TYPE', 0, 0, 0,
+ new Array(bucketSize),
+ new Array(bucketSize)),
+ sharedFunctionInfoEntry: new GroupedEntry('SHARED_FUNCTION_INFO_TYPE',
+ 0, 0, 0,
+ new Array(bucketSize),
+ new Array(bucketSize)),
+ weakCellEntry: new GroupedEntry('WEAK_CELL_TYPE', 0, 0, 0,
+ new Array(bucketSize),
+ new Array(bucketSize)),
+ jsObjectEntry: new GroupedEntry('JS_OBJECT_TYPE', 0, 0, 0,
+ new Array(bucketSize),
+ new Array(bucketSize)),
+ jsContextExtensionObjectEntry: new GroupedEntry(
+ 'JS_CONTEXT_EXTENSION_OBJECT_TYPE', 0, 0, 0, new Array(bucketSize),
+ new Array(bucketSize))
+ };
+ for (var name of Object.getOwnPropertyNames(groupEntries)) {
+ var groupEntry = groupEntries[name];
+ var keyToName = undefined;
+ if (InstanceSubTypeNames[groupEntry.title] !== undefined) {
+ keyToName = InstanceSubTypeNames[groupEntry.title].keyToName;
+ }
+ this.buildSubEntry_(objects, groupEntry, keyToName);
+ if (name === 'fixedArrayEntry') {
+ groupEntry.setFromObject(fixedArrayObject);
+ groupEntry.accumulateUnknown('UNKNOWN');
+ }
+ objectEntry.add(groupEntry);
+ }
+ },
+
+ set selection(slices) {
+ slices.sortEvents(function(a, b) {
+ return b.start - a.start;
+ });
+ var previous = undefined;
+ for (let slice of slices) {
+ if (!slice instanceof tr.e.v8.V8GCStatsThreadSlice) continue;
+ var liveObjects = slice.liveObjects;
+ var deadObjects = slice.deadObjects;
+ var isolate = liveObjects.isolate;
+
+ var isolateEntry =
+ new GroupedEntry(
+ 'Isolate_' + isolate + ' at ' + slice.start.toFixed(3) + ' ms',
+ 0, 0, 0, [], []);
+ var liveEntry = new GroupedEntry('live objects', 0, 0, 0, [], []);
+ var deadEntry = new GroupedEntry('dead objects', 0, 0, 0, [], []);
+
+ var liveBucketSize = liveObjects.bucket_sizes.length;
+ var deadBucketSize = deadObjects.bucket_sizes.length;
+
+ this.build_(tr.b.deepCopy(liveObjects.type_data), liveEntry,
+ liveBucketSize);
+ isolateEntry.add(liveEntry);
+
+ this.build_(tr.b.deepCopy(deadObjects.type_data), deadEntry,
+ deadBucketSize);
+ isolateEntry.add(deadEntry);
+
+ isolateEntry.calculatePercentage();
+ this.isolateEntries_.push(isolateEntry);
+ }
+ this.updateTable_();
+ },
+
+ updateTable_: function() {
+ this.constructTable_();
+ this.$.table.tableRows = this.isolateEntries_;
+ this.$.table.rebuild();
+ },
+ });
+
+ return {};
+});
+</script>

Powered by Google App Engine
This is Rietveld 408576698