565dc5b6a2
This reverts commit7083692624in order to reland commit8d99d295da. TEST=N/A Change-Id: I06c80a666a9307caf0313fef1fde212ec801203c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182600 Reviewed-by: Nate Bosch <nbosch@google.com>
192 lines
4.2 KiB
Markdown
192 lines
4.2 KiB
Markdown
# Dart VM Service Heap Snapshot
|
|
|
|
A snapshot of a heap in the Dart VM that allows for arbitrary analysis of memory usage.
|
|
|
|
## Object IDs
|
|
|
|
An object id is a 1-origin index into SnapshotGraph.objects.
|
|
|
|
Object id 0 is a sentinel value. It indicates target of a reference has been omitted from the snapshot.
|
|
|
|
The root object is has object id 1.
|
|
|
|
This notion of id is unrelated to the id used by the rest of the VM service and cannot, for example, be used as a argument to getObject.
|
|
|
|
## Class IDs
|
|
|
|
A class id is a 1-origin index into SnapshotGraph.classes.
|
|
|
|
Class id 0 is a sentinel value.
|
|
|
|
This notion of id is unrelated to the id used by the rest of the VM service and cannot, for example, be used as a argument to getObject.
|
|
|
|
## Graph properties
|
|
|
|
The graph may contain unreachable objects.
|
|
|
|
The graph may references without a corresponding SnapshotField.
|
|
|
|
## Format
|
|
|
|
```
|
|
type SnapshotGraph {
|
|
magic : uint8[8] = "dartheap",
|
|
|
|
flags : uleb128,
|
|
name : Utf8String,
|
|
|
|
// The sum of shallow sizes of all objects in this graph.
|
|
shallowSize : uleb128,
|
|
|
|
// The amount of memory reserved for this heap. At least as large as |shallowSize|.
|
|
capacity : uleb128,
|
|
|
|
// The sum of sizes of all external properties in this graph.
|
|
externalSize : uleb128,
|
|
|
|
classCount : uleb128,
|
|
classes : SnapshotClass[classCount],
|
|
|
|
// At least as big as the sum of SnapshotObject.referenceCount.
|
|
referenceCount : uleb128,
|
|
objectCount : uleb128,
|
|
objects : SnapshotObject[objectCount],
|
|
|
|
externalPropertyCount : uleb128,
|
|
externalProperties : SnapshotExternalProperty[externalPropertyCount],
|
|
|
|
// The list of identity hash codes corresponding to each entry in objects.
|
|
// A hash code of zero is invalid and cannot be used to determine equality
|
|
// between objects. If the same object is included in multiple
|
|
// HeapSnapshots, it will report the same identityHashCode. The converse is
|
|
// not true: two different objects may report the same identityHashCode
|
|
// (with low probability).
|
|
identityHashCodes: uint32[objectCount],
|
|
}
|
|
```
|
|
|
|
```
|
|
type SnapshotClass {
|
|
// Reserved.
|
|
flags : uleb128,
|
|
|
|
// The simple (not qualified) name of the class.
|
|
name : Utf8String,
|
|
|
|
// The name of the class's library.
|
|
libraryName : Utf8String,
|
|
|
|
// The URI of the class's library.
|
|
libraryUri : Utf8String,
|
|
|
|
reserved : Utf8String,
|
|
|
|
fieldCount : uleb128,
|
|
fields : SnapshotField[fieldCount],
|
|
}
|
|
```
|
|
|
|
```
|
|
type SnapshotField {
|
|
// Reserved.
|
|
flags : uleb128,
|
|
|
|
// A 0-origin index into SnapshotObject.references.
|
|
index : uleb128,
|
|
|
|
name : Utf8String,
|
|
|
|
reserved : Utf8String,
|
|
}
|
|
```
|
|
|
|
```
|
|
type SnapshotObject {
|
|
// A 1-origin index into SnapshotGraph.classes.
|
|
classId : uleb128,
|
|
|
|
// The space used by this object in bytes.
|
|
shallowSize : uleb128,
|
|
|
|
data : NonReferenceData,
|
|
|
|
referenceCount : uleb128,
|
|
// A list of 1-origin indicies into SnapshotGraph.objects
|
|
references : uleb128[referenceCount],
|
|
}
|
|
```
|
|
|
|
```
|
|
type NonReferenceData {
|
|
tag : uleb128,
|
|
}
|
|
|
|
type NoData extends NonReferenceData {
|
|
tag : uleb128 = 0,
|
|
}
|
|
|
|
type NullData extends NonReferenceData {
|
|
tag : uleb128 = 1,
|
|
}
|
|
|
|
type BoolData extends NonReferenceData {
|
|
tag : uleb128 = 2,
|
|
value : uleb128,
|
|
}
|
|
|
|
type IntegerData extends NonReferenceData {
|
|
tag : uleb128 = 3,
|
|
value : uleb128,
|
|
}
|
|
|
|
type DoubleData extends NonReferenceData {
|
|
tag: uleb128 = 4,
|
|
value: float64,
|
|
}
|
|
|
|
type Latin1StringData extends NonReferenceData {
|
|
tag : uleb128 = 5,
|
|
length : uleb128,
|
|
truncatedLength : uleb128,
|
|
codeUnits : uint8[truncatedLength],
|
|
}
|
|
|
|
type Utf16StringData extends NonReferenceData {
|
|
tag : uleb128 = 6,
|
|
length : uleb128,
|
|
truncatedLength : uleb128,
|
|
codeUnits : uint16[truncatedLength],
|
|
}
|
|
|
|
// Indicates the object is variable length, such as a known implementation
|
|
// of List, Map or Set.
|
|
type LengthData extends NonReferenceData {
|
|
tag : uleb128 = 7,
|
|
length : uleb128,
|
|
}
|
|
|
|
// Indicates the object has some name, such as Function, Field, Class or Library.
|
|
type NameData extends NonReferenceData {
|
|
tag : uleb128 = 7,
|
|
name : Utf8String,
|
|
}
|
|
```
|
|
|
|
```
|
|
type SnapshotExternalProperty {
|
|
// A 1-origin index into SnapshotGraph.objects.
|
|
object : uleb128,
|
|
|
|
externalSize : uleb128,
|
|
|
|
name : Utf8String,
|
|
}
|
|
```
|
|
|
|
```
|
|
type Utf8String {
|
|
length : uleb128,
|
|
codeUnits : uint8[length],
|
|
}
|
|
```
|