%PDF- %PDF-
| Direktori : /home2/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/ |
| Current File : //home2/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/heap-layout-tracer.cc |
// Copyright 2021 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.
#include "src/heap/heap-layout-tracer.h"
#include <iostream>
#include "src/heap/new-spaces.h"
#include "src/heap/paged-spaces.h"
#include "src/heap/read-only-spaces.h"
#include "src/heap/spaces-inl.h"
namespace v8 {
namespace internal {
namespace {
constexpr const char* TypeToCollectorName(v8::GCType gc_type) {
switch (gc_type) {
case kGCTypeScavenge:
return "Scavenger";
case kGCTypeMarkSweepCompact:
return "Mark-Compact";
case kGCTypeMinorMarkSweep:
return "Minor Mark-Sweep";
default:
break;
}
return "Unknown collector";
}
} // namespace
// static
void HeapLayoutTracer::GCProloguePrintHeapLayout(v8::Isolate* isolate,
v8::GCType gc_type,
v8::GCCallbackFlags flags,
void* data) {
Heap* heap = reinterpret_cast<i::Isolate*>(isolate)->heap();
// gc_count_ will increase after this callback, manually add 1.
PrintF("Before GC:%d,", heap->gc_count() + 1);
PrintF("collector_name:%s\n", TypeToCollectorName(gc_type));
PrintHeapLayout(std::cout, heap);
}
// static
void HeapLayoutTracer::GCEpiloguePrintHeapLayout(v8::Isolate* isolate,
v8::GCType gc_type,
v8::GCCallbackFlags flags,
void* data) {
Heap* heap = reinterpret_cast<i::Isolate*>(isolate)->heap();
PrintF("After GC:%d,", heap->gc_count());
PrintF("collector_name:%s\n", TypeToCollectorName(gc_type));
PrintHeapLayout(std::cout, heap);
}
// static
void HeapLayoutTracer::PrintBasicMemoryChunk(std::ostream& os,
const BasicMemoryChunk& chunk,
const char* owner_name) {
os << "{owner:" << owner_name << ","
<< "address:" << &chunk << ","
<< "size:" << chunk.size() << ","
<< "allocated_bytes:" << chunk.allocated_bytes() << ","
<< "wasted_memory:" << chunk.wasted_memory() << "}" << std::endl;
}
// static
void HeapLayoutTracer::PrintHeapLayout(std::ostream& os, Heap* heap) {
if (v8_flags.minor_ms) {
for (const Page* page : *heap->paged_new_space()) {
PrintBasicMemoryChunk(os, *page, "new_space");
}
} else {
const SemiSpaceNewSpace* semi_space_new_space =
SemiSpaceNewSpace::From(heap->new_space());
for (const Page* page : semi_space_new_space->to_space()) {
PrintBasicMemoryChunk(os, *page, "to_space");
}
for (const Page* page : semi_space_new_space->from_space()) {
PrintBasicMemoryChunk(os, *page, "from_space");
}
}
OldGenerationMemoryChunkIterator it(heap);
MemoryChunk* chunk;
while ((chunk = it.next()) != nullptr) {
PrintBasicMemoryChunk(os, *chunk, ToString(chunk->owner()->identity()));
}
for (ReadOnlyPage* page : heap->read_only_space()->pages()) {
PrintBasicMemoryChunk(os, *page, "ro_space");
}
}
} // namespace internal
} // namespace v8