Commit 4e45eed9 authored by Seth Brenith's avatar Seth Brenith Committed by V8 LUCI CQ

Categorize more objects as kCode in heap snapshots

Currently, the category named “(compiled code)” contains Code,
SharedFunctionInfo, and Script objects. However, there are various other
object types that are allocated per script function, such as
BytecodeArray and FeedbackVector. There are also plain FixedArrays which
are used for function-specific data such as polymorphic feedback and
code deoptimization data. I propose we move all of this to the
“(compiled code)” category, because this memory usage is related to the
number of functions in the script, the size of those functions, and/or
the number of times those functions have been called.

Bug: v8:12769
Change-Id: Ib5e0265a9ef88063596c17419f5b65f683156c52
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3569876Reviewed-by: 's avatarBenedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Seth Brenith <seth.brenith@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#79827}
parent dac922ef
This diff is collapsed.
......@@ -402,6 +402,7 @@ class V8_EXPORT_PRIVATE V8HeapExplorer : public HeapEntriesAllocator {
const char* name);
const char* GetSystemEntryName(HeapObject object);
HeapEntry::Type GetSystemEntryType(HeapObject object);
void ExtractLocation(HeapEntry* entry, HeapObject object);
void ExtractLocationForJSFunction(HeapEntry* entry, JSFunction func);
......@@ -433,12 +434,16 @@ class V8_EXPORT_PRIVATE V8HeapExplorer : public HeapEntriesAllocator {
void ExtractAllocationSiteReferences(HeapEntry* entry, AllocationSite site);
void ExtractArrayBoilerplateDescriptionReferences(
HeapEntry* entry, ArrayBoilerplateDescription value);
void ExtractRegExpBoilerplateDescriptionReferences(
HeapEntry* entry, RegExpBoilerplateDescription value);
void ExtractJSArrayBufferReferences(HeapEntry* entry, JSArrayBuffer buffer);
void ExtractJSPromiseReferences(HeapEntry* entry, JSPromise promise);
void ExtractJSGeneratorObjectReferences(HeapEntry* entry,
JSGeneratorObject generator);
void ExtractFixedArrayReferences(HeapEntry* entry, FixedArray array);
void ExtractNumberReference(HeapEntry* entry, Object number);
void ExtractBytecodeArrayReferences(HeapEntry* entry, BytecodeArray bytecode);
void ExtractScopeInfoReferences(HeapEntry* entry, ScopeInfo info);
void ExtractFeedbackVectorReferences(HeapEntry* entry,
FeedbackVector feedback_vector);
void ExtractDescriptorArrayReferences(HeapEntry* entry,
......@@ -486,7 +491,10 @@ class V8_EXPORT_PRIVATE V8HeapExplorer : public HeapEntriesAllocator {
void SetGcSubrootReference(Root root, const char* description, bool is_weak,
Object child);
const char* GetStrongGcSubrootName(Object object);
void TagObject(Object obj, const char* tag);
void TagObject(Object obj, const char* tag,
base::Optional<HeapEntry::Type> type = {});
void RecursivelyTagConstantPool(Object obj, const char* tag,
HeapEntry::Type type, int recursion_limit);
HeapEntry* GetEntry(Object obj);
......
......@@ -465,7 +465,7 @@ TEST(HeapSnapshotCodeObjects) {
for (int i = 0, count = compiled_sfi->GetChildrenCount(); i < count; ++i) {
const v8::HeapGraphEdge* prop = compiled_sfi->GetChild(i);
const v8::HeapGraphNode* node = prop->GetToNode();
if (node->GetType() == v8::HeapGraphNode::kHidden &&
if (node->GetType() == v8::HeapGraphNode::kCode &&
!strcmp("system / ScopeInfo", GetName(node))) {
if (HasString(env->GetIsolate(), node, "x")) {
compiled_references_x = true;
......@@ -476,7 +476,7 @@ TEST(HeapSnapshotCodeObjects) {
for (int i = 0, count = lazy_sfi->GetChildrenCount(); i < count; ++i) {
const v8::HeapGraphEdge* prop = lazy_sfi->GetChild(i);
const v8::HeapGraphNode* node = prop->GetToNode();
if (node->GetType() == v8::HeapGraphNode::kHidden &&
if (node->GetType() == v8::HeapGraphNode::kCode &&
!strcmp("system / ScopeInfo", GetName(node))) {
if (HasString(env->GetIsolate(), node, "x")) {
lazy_references_x = true;
......@@ -2680,7 +2680,7 @@ TEST(AllocationSitesAreVisible) {
CHECK(feedback_cell);
const v8::HeapGraphNode* vector = GetProperty(
env->GetIsolate(), feedback_cell, v8::HeapGraphEdge::kInternal, "value");
CHECK_EQ(v8::HeapGraphNode::kHidden, vector->GetType());
CHECK_EQ(v8::HeapGraphNode::kCode, vector->GetType());
CHECK_EQ(4, vector->GetChildrenCount());
// The last value in the feedback vector should be the boilerplate,
......@@ -2698,7 +2698,7 @@ TEST(AllocationSitesAreVisible) {
GetProperty(env->GetIsolate(), transition_info,
v8::HeapGraphEdge::kInternal, "elements");
CHECK(elements);
CHECK_EQ(v8::HeapGraphNode::kArray, elements->GetType());
CHECK_EQ(v8::HeapGraphNode::kCode, elements->GetType());
CHECK_EQ(v8::internal::FixedArray::SizeFor(3),
static_cast<int>(elements->GetShallowSize()));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment