mirror of
https://github.com/dart-lang/sdk
synced 2024-10-04 16:54:55 +00:00
[vm, service] Include Smis in heap snapshots.
TEST=ci Change-Id: Iadb3bb749da0d065c46bc723c7f5a8a8951b68bd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/265562 Reviewed-by: Ben Konyi <bkonyi@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
parent
6d5c966e68
commit
2d6037a144
|
@ -92,8 +92,10 @@ var tests = <IsolateTest>[
|
|||
for (SnapshotObject instance in klass.instances) {
|
||||
if (instance == graph.root ||
|
||||
instance.klass.name.contains("Isolate") ||
|
||||
instance.klass.name.contains("Read-Only Pages")) {
|
||||
instance.klass.name.contains("Read-Only Pages") ||
|
||||
instance.klass.name.contains("_Smi")) {
|
||||
// The root and fake root subdivisions have 0 self size.
|
||||
// Immediate objects (currently only Smi) have 0 self size.
|
||||
expect(instance.internalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.externalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.shallowSize, greaterThanOrEqualTo(0));
|
||||
|
@ -126,8 +128,10 @@ var tests = <IsolateTest>[
|
|||
for (SnapshotObject instance in graph.objects) {
|
||||
if (instance == graph.root ||
|
||||
instance.klass.name.contains("Isolate") ||
|
||||
instance.klass.name.contains("Read-Only Pages")) {
|
||||
instance.klass.name.contains("Read-Only Pages") ||
|
||||
instance.klass.name.contains("_Smi")) {
|
||||
// The root and fake root subdivisions have 0 self size.
|
||||
// Immediate objects (currently only Smi) have 0 self size.
|
||||
expect(instance.internalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.externalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.shallowSize, greaterThanOrEqualTo(0));
|
||||
|
|
|
@ -92,8 +92,10 @@ var tests = <IsolateTest>[
|
|||
for (SnapshotObject instance in klass.instances) {
|
||||
if (instance == graph.root ||
|
||||
instance.klass.name.contains("Isolate") ||
|
||||
instance.klass.name.contains("Read-Only Pages")) {
|
||||
instance.klass.name.contains("Read-Only Pages") ||
|
||||
instance.klass.name.contains("_Smi")) {
|
||||
// The root and fake root subdivisions have 0 self size.
|
||||
// Immediate objects (currently only Smi) have 0 self size.
|
||||
expect(instance.internalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.externalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.shallowSize, greaterThanOrEqualTo(0));
|
||||
|
@ -126,8 +128,10 @@ var tests = <IsolateTest>[
|
|||
for (SnapshotObject instance in graph.objects) {
|
||||
if (instance == graph.root ||
|
||||
instance.klass.name.contains("Isolate") ||
|
||||
instance.klass.name.contains("Read-Only Pages")) {
|
||||
instance.klass.name.contains("Read-Only Pages") ||
|
||||
instance.klass.name.contains("_Smi")) {
|
||||
// The root and fake root subdivisions have 0 self size.
|
||||
// Immediate objects (currently only Smi) have 0 self size.
|
||||
expect(instance.internalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.externalSize, greaterThanOrEqualTo(0));
|
||||
expect(instance.shallowSize, greaterThanOrEqualTo(0));
|
||||
|
|
|
@ -189,7 +189,7 @@ size unique-size count class data
|
|||
''');
|
||||
|
||||
await run(
|
||||
'stats foobar = (follow (follow global) ^:type_arguments ^Root)');
|
||||
'stats foobar = (follow (follow global) ^:type_arguments ^Root ^Smi)');
|
||||
expectLogPattern('''
|
||||
size count class
|
||||
-------- -------- --------
|
||||
|
|
|
@ -869,7 +869,10 @@ CountingPage* HeapSnapshotWriter::FindCountingPage(ObjectPtr obj) const {
|
|||
}
|
||||
|
||||
void HeapSnapshotWriter::AssignObjectId(ObjectPtr obj) {
|
||||
ASSERT(obj->IsHeapObject());
|
||||
if (!obj->IsHeapObject()) {
|
||||
thread()->heap()->SetObjectId(obj, ++object_count_);
|
||||
return;
|
||||
}
|
||||
|
||||
CountingPage* counting_page = FindCountingPage(obj);
|
||||
if (counting_page != nullptr) {
|
||||
|
@ -883,7 +886,9 @@ void HeapSnapshotWriter::AssignObjectId(ObjectPtr obj) {
|
|||
|
||||
intptr_t HeapSnapshotWriter::GetObjectId(ObjectPtr obj) const {
|
||||
if (!obj->IsHeapObject()) {
|
||||
return 0;
|
||||
intptr_t id = thread()->heap()->GetObjectId(obj);
|
||||
ASSERT(id != 0);
|
||||
return id;
|
||||
}
|
||||
|
||||
if (FLAG_write_protect_code && obj->IsInstructions() && !OnImagePage(obj)) {
|
||||
|
@ -916,6 +921,13 @@ void HeapSnapshotWriter::CountExternalProperty() {
|
|||
external_property_count_ += 1;
|
||||
}
|
||||
|
||||
void HeapSnapshotWriter::AddSmi(SmiPtr smi) {
|
||||
if (thread()->heap()->GetObjectId(smi) == WeakTable::kNoValue) {
|
||||
thread()->heap()->SetObjectId(smi, -1);
|
||||
smis_.Add(smi);
|
||||
}
|
||||
}
|
||||
|
||||
class Pass1Visitor : public ObjectVisitor,
|
||||
public ObjectPointerVisitor,
|
||||
public HandleVisitor {
|
||||
|
@ -941,17 +953,25 @@ class Pass1Visitor : public ObjectVisitor,
|
|||
}
|
||||
|
||||
void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
|
||||
intptr_t count = to - from + 1;
|
||||
ASSERT(count >= 0);
|
||||
writer_->CountReferences(count);
|
||||
for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
|
||||
ObjectPtr obj = *ptr;
|
||||
if (!obj->IsHeapObject()) {
|
||||
writer_->AddSmi(static_cast<SmiPtr>(obj));
|
||||
}
|
||||
writer_->CountReferences(1);
|
||||
}
|
||||
}
|
||||
|
||||
void VisitCompressedPointers(uword heap_base,
|
||||
CompressedObjectPtr* from,
|
||||
CompressedObjectPtr* to) {
|
||||
intptr_t count = to - from + 1;
|
||||
ASSERT(count >= 0);
|
||||
writer_->CountReferences(count);
|
||||
for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
|
||||
ObjectPtr obj = ptr->Decompress(heap_base);
|
||||
if (!obj->IsHeapObject()) {
|
||||
writer_->AddSmi(static_cast<SmiPtr>(obj));
|
||||
}
|
||||
writer_->CountReferences(1);
|
||||
}
|
||||
}
|
||||
|
||||
void VisitHandle(uword addr) {
|
||||
|
@ -1559,6 +1579,11 @@ void HeapSnapshotWriter::Write() {
|
|||
|
||||
// External properties.
|
||||
isolate()->group()->VisitWeakPersistentHandles(&visitor);
|
||||
|
||||
// Smis.
|
||||
for (SmiPtr smi : smis_) {
|
||||
AssignObjectId(smi);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -1618,6 +1643,15 @@ void HeapSnapshotWriter::Write() {
|
|||
visitor.set_discount_sizes(false);
|
||||
iteration.IterateObjects(&visitor);
|
||||
|
||||
// Smis.
|
||||
for (SmiPtr smi : smis_) {
|
||||
WriteUnsigned(kSmiCid + kNumExtraCids);
|
||||
WriteUnsigned(0); // Heap size.
|
||||
WriteUnsigned(kIntData);
|
||||
WriteUnsigned(Smi::Value(smi));
|
||||
WriteUnsigned(0); // No slots.
|
||||
}
|
||||
|
||||
// External properties.
|
||||
WriteUnsigned(external_property_count_);
|
||||
isolate()->group()->VisitWeakPersistentHandles(&visitor);
|
||||
|
@ -1638,6 +1672,10 @@ void HeapSnapshotWriter::Write() {
|
|||
// Handle visit rest of the objects.
|
||||
iteration.IterateVMIsolateObjects(&visitor);
|
||||
iteration.IterateObjects(&visitor);
|
||||
for (SmiPtr smi : smis_) {
|
||||
USE(smi);
|
||||
WriteUnsigned(0); // No identity hash.
|
||||
}
|
||||
}
|
||||
|
||||
ClearObjectIds();
|
||||
|
|
|
@ -217,6 +217,7 @@ class HeapSnapshotWriter : public ThreadStackResource {
|
|||
void ClearObjectIds();
|
||||
void CountReferences(intptr_t count);
|
||||
void CountExternalProperty();
|
||||
void AddSmi(SmiPtr smi);
|
||||
|
||||
void Write();
|
||||
|
||||
|
@ -254,6 +255,8 @@ class HeapSnapshotWriter : public ThreadStackResource {
|
|||
static const intptr_t kMaxImagePages = 4;
|
||||
ImagePageRange image_page_ranges_[kMaxImagePages];
|
||||
|
||||
MallocGrowableArray<SmiPtr> smis_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(HeapSnapshotWriter);
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue