| <!DOCTYPE html> | |
| <!-- Copyright 2018 the V8 project authors. All rights reserved. | |
| Use of this source code is governed by a BSD-style license that can be | |
| found in the LICENSE file. --> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>V8 Heap Statistics</title> | |
| <link href='https://fonts.googleapis.com/css?family=Roboto' rel='stylesheet'> | |
| <script | |
| src="https://www.gstatic.com/charts/loader.js"></script> | |
| <script | |
| src="https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako_inflate.min.js" | |
| integrity="sha256-N1z6ddQzX83fjw8v7uSNe7/MgOmMKdwFUv1+AJMDqNM=" | |
| crossorigin="anonymous"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/oboe.js/2.1.5/oboe-browser.min.js" | |
| crossorigin="anonymous"></script> | |
| <script src="helper.js"></script> | |
| <script type="module" src="details-selection.js"></script> | |
| <script type="module" src="global-timeline.js"></script> | |
| <script type="module" src="histogram-viewer.js"></script> | |
| <script type="module" src="trace-file-reader.js"></script> | |
| <style> | |
| body { | |
| font-family: 'Roboto', sans-serif; | |
| margin-left: 5%; | |
| margin-right: 5%; | |
| } | |
| </style> | |
| <script> | |
| 'use strict'; | |
| google.charts.load('current', {'packages':['line', 'corechart', 'bar']}); | |
| function $(id) { return document.querySelector(id); } | |
| function removeAllChildren(node) { | |
| while (node.firstChild) { | |
| node.removeChild(node.firstChild); | |
| } | |
| } | |
| let state = Object.create(null); | |
| function globalDataChanged(e) { | |
| state.data = e.detail; | |
| // Emit one entry with the whole model for debugging purposes. | |
| console.log(state.data); | |
| state.selection = null; | |
| $('#global-timeline').selection = state.selection; | |
| $('#global-timeline').data = state.data; | |
| $('#histogram-viewer').selection = state.selection; | |
| $('#histogram-viewer').data = state.data; | |
| $('#details-selection').data = state.data; | |
| } | |
| function globalSelectionChangedA(e) { | |
| state.selection = e.detail; | |
| console.log(state.selection); | |
| $('#global-timeline').selection = state.selection; | |
| $('#histogram-viewer').selection = state.selection; | |
| } | |
| </script> | |
| </head> | |
| <body> | |
| <h1>V8 Heap Statistics</h1> | |
| <trace-file-reader onchange="globalDataChanged(event)"></trace-file-reader> | |
| <details-selection id="details-selection" onchange="globalSelectionChangedA(event)"></details-selection> | |
| <global-timeline id="global-timeline"></global-timeline> | |
| <histogram-viewer id="histogram-viewer"></histogram-viewer> | |
| <p>Visualize object statistics that have been gathered using</p> | |
| <ul> | |
| <li><code>--trace-gc-object-stats</code> on V8</li> | |
| <li> | |
| <a | |
| href="https://www.chromium.org/developers/how-tos/trace-event-profiling-tool">Chrome's | |
| tracing infrastructure</a> collecting data for the category | |
| <code>v8.gc_stats</code>. | |
| </li> | |
| </ul> | |
| <p> | |
| Note that you only get a data point on major GCs. You can enforce this by | |
| using the <code>--gc-global</code> flag. | |
| </p> | |
| <p> | |
| Note that the visualizer needs to run on a web server due to HTML imports | |
| requiring <a | |
| href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing">CORS</a>. | |
| </p> | |
| </body> | |
| </html> |