From 2bdaa6398499e006f802ea4115cc294188855f6b Mon Sep 17 00:00:00 2001 From: Casper Norrbin Date: Wed, 29 Apr 2026 14:13:22 +0200 Subject: [PATCH 1/5] change print_class_layout to use external class names --- src/hotspot/share/memory/heapInspection.cpp | 20 ++++++++----------- .../inlinetypes/ClassPrintLayoutDcmd.java | 8 ++++---- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/hotspot/share/memory/heapInspection.cpp b/src/hotspot/share/memory/heapInspection.cpp index 1487a3dc9ae..62e44a8ffd0 100644 --- a/src/hotspot/share/memory/heapInspection.cpp +++ b/src/hotspot/share/memory/heapInspection.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -513,16 +513,16 @@ class HistoClosure : public KlassInfoClosure { } }; -class FindClassByNameClosure : public KlassInfoClosure { +class FindClassByExternalNameClosure : public KlassInfoClosure { private: GrowableArray* _klasses; - Symbol* _classname; + const char* _classname; public: - FindClassByNameClosure(GrowableArray* klasses, Symbol* classname) : + FindClassByExternalNameClosure(GrowableArray* klasses, const char* classname) : _klasses(klasses), _classname(classname) { } void do_cinfo(KlassInfoEntry* cie) { - if (cie->klass()->name() == _classname) { + if (strcmp(cie->klass()->external_name(), _classname) == 0) { _klasses->append(cie->klass()); } } @@ -600,13 +600,10 @@ void PrintClassLayout::print_class_layout(outputStream* st, char* class_name) { return; } - Thread* THREAD = Thread::current(); - - Symbol* classname = SymbolTable::probe(class_name, (int)strlen(class_name)); - GrowableArray* klasses = new (mtServiceability) GrowableArray(100, mtServiceability); - FindClassByNameClosure fbnc(klasses, classname); + ResourceMark rm; + FindClassByExternalNameClosure fbnc(klasses, class_name); cit.iterate(&fbnc); for(int i = 0; i < klasses->length(); i++) { @@ -614,9 +611,8 @@ void PrintClassLayout::print_class_layout(outputStream* st, char* class_name) { if (!klass->is_instance_klass()) continue; // Skip InstanceKlass* ik = InstanceKlass::cast(klass); int tab = 1; - st->print_cr("Class %s [@%s]:", klass->name()->as_C_string(), + st->print_cr("Class %s [@%s]:", klass->external_name(), klass->class_loader_data()->loader_name()); - ResourceMark rm; GrowableArray* fields = new (mtServiceability) GrowableArray(100, mtServiceability); for (AllFieldStream fd(ik); !fd.done(); fd.next()) { if (!fd.access_flags().is_static()) { diff --git a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/ClassPrintLayoutDcmd.java b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/ClassPrintLayoutDcmd.java index afbe6e2182f..e792fea3422 100644 --- a/test/hotspot/jtreg/runtime/valhalla/inlinetypes/ClassPrintLayoutDcmd.java +++ b/test/hotspot/jtreg/runtime/valhalla/inlinetypes/ClassPrintLayoutDcmd.java @@ -81,10 +81,10 @@ static void testCmd(String arg, int expectExitCode, String... expectStrings) thr } public static void main(String args[]) throws Exception { - testCmd("foo/bar", 0, ""); + testCmd("foo.bar", 0, ""); testCmd("", 1, "IllegalArgumentException", "mandatory"); - testCmd("java/lang/Object", 0, "java/lang/Object", "@bootstrap"); - testCmd("java/lang/Class", 0, "java/lang/Class", "@bootstrap"); - testCmd("runtime/valhalla/inlinetypes/ClassPrintLayoutDcmd$Line", 0, "@app", "p1", "p2"); + testCmd("java.lang.Object", 0, "java.lang.Object", "@bootstrap"); + testCmd("java.lang.Class", 0, "java.lang.Class", "@bootstrap"); + testCmd("runtime.valhalla.inlinetypes.ClassPrintLayoutDcmd$Line", 0, "@app", "p1", "p2"); } } From c8df796a48feba3f9f711e44d7adbcbf99fa7ea2 Mon Sep 17 00:00:00 2001 From: Casper Norrbin Date: Thu, 30 Apr 2026 11:18:54 +0200 Subject: [PATCH 2/5] feedback fixes --- src/hotspot/share/memory/heapInspection.cpp | 23 ++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/memory/heapInspection.cpp b/src/hotspot/share/memory/heapInspection.cpp index 62e44a8ffd0..f2cc57cbdb4 100644 --- a/src/hotspot/share/memory/heapInspection.cpp +++ b/src/hotspot/share/memory/heapInspection.cpp @@ -513,16 +513,16 @@ class HistoClosure : public KlassInfoClosure { } }; -class FindClassByExternalNameClosure : public KlassInfoClosure { +class FindClassByNameClosure : public KlassInfoClosure { private: GrowableArray* _klasses; - const char* _classname; + Symbol* _classname; public: - FindClassByExternalNameClosure(GrowableArray* klasses, const char* classname) : + FindClassByNameClosure(GrowableArray* klasses, Symbol* classname) : _klasses(klasses), _classname(classname) { } void do_cinfo(KlassInfoEntry* cie) { - if (strcmp(cie->klass()->external_name(), _classname) == 0) { + if (cie->klass()->name() == _classname) { _klasses->append(cie->klass()); } } @@ -600,10 +600,18 @@ void PrintClassLayout::print_class_layout(outputStream* st, char* class_name) { return; } - GrowableArray* klasses = new (mtServiceability) GrowableArray(100, mtServiceability); - ResourceMark rm; - FindClassByExternalNameClosure fbnc(klasses, class_name); + char* normalized_name = NEW_RESOURCE_ARRAY(char, strlen(class_name) + 1); + strcpy(normalized_name, class_name); + for (char* p = normalized_name; *p != '\0'; p++) { + if (*p == '.') { + *p = '/'; + } + } + Symbol* classname = SymbolTable::probe(normalized_name, (int)strlen(normalized_name)); + + GrowableArray* klasses = new (mtServiceability) GrowableArray(100, mtServiceability); + FindClassByNameClosure fbnc(klasses, classname); cit.iterate(&fbnc); for(int i = 0; i < klasses->length(); i++) { @@ -611,6 +619,7 @@ void PrintClassLayout::print_class_layout(outputStream* st, char* class_name) { if (!klass->is_instance_klass()) continue; // Skip InstanceKlass* ik = InstanceKlass::cast(klass); int tab = 1; + ResourceMark rm; st->print_cr("Class %s [@%s]:", klass->external_name(), klass->class_loader_data()->loader_name()); GrowableArray* fields = new (mtServiceability) GrowableArray(100, mtServiceability); From eb127d3446954dce5e016f8bc90574d4f2b7e3a0 Mon Sep 17 00:00:00 2001 From: Casper Norrbin Date: Mon, 4 May 2026 13:14:59 +0200 Subject: [PATCH 3/5] feedback --- src/hotspot/share/memory/heapInspection.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/memory/heapInspection.cpp b/src/hotspot/share/memory/heapInspection.cpp index f2cc57cbdb4..d478f7c77bf 100644 --- a/src/hotspot/share/memory/heapInspection.cpp +++ b/src/hotspot/share/memory/heapInspection.cpp @@ -600,15 +600,13 @@ void PrintClassLayout::print_class_layout(outputStream* st, char* class_name) { return; } - ResourceMark rm; - char* normalized_name = NEW_RESOURCE_ARRAY(char, strlen(class_name) + 1); - strcpy(normalized_name, class_name); - for (char* p = normalized_name; *p != '\0'; p++) { - if (*p == '.') { - *p = '/'; + for (char* p = class_name; *p != '\0'; p++) { + if (*p == JVM_SIGNATURE_DOT) { + *p = JVM_SIGNATURE_SLASH; } } - Symbol* classname = SymbolTable::probe(normalized_name, (int)strlen(normalized_name)); + + Symbol* classname = SymbolTable::probe(class_name, (int)strlen(class_name)); GrowableArray* klasses = new (mtServiceability) GrowableArray(100, mtServiceability); FindClassByNameClosure fbnc(klasses, classname); From 7a18def1cd1b9cb53f995627e608c3179f8aa198 Mon Sep 17 00:00:00 2001 From: Casper Norrbin Date: Tue, 12 May 2026 13:42:23 +0200 Subject: [PATCH 4/5] indent fix --- src/hotspot/share/memory/heapInspection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/memory/heapInspection.cpp b/src/hotspot/share/memory/heapInspection.cpp index 3d137b1e20b..2b16ec397d8 100644 --- a/src/hotspot/share/memory/heapInspection.cpp +++ b/src/hotspot/share/memory/heapInspection.cpp @@ -616,7 +616,7 @@ void PrintClassLayout::print_class_layout(outputStream* st, char* class_name) { int tab = 1; ResourceMark rm; st->print_cr("Class %s [@%s]:", klass->external_name(), - klass->class_loader_data()->loader_name()); + klass->class_loader_data()->loader_name()); GrowableArray* fields = new (mtServiceability) GrowableArray(100, mtServiceability); for (AllFieldStream fd(ik); !fd.done(); fd.next()) { if (!fd.access_flags().is_static()) { From d1ffe8a10e07cac8e008b168bbd3e7f3d17cb48c Mon Sep 17 00:00:00 2001 From: Casper Norrbin Date: Tue, 12 May 2026 13:44:03 +0200 Subject: [PATCH 5/5] merge miss --- src/hotspot/share/memory/heapInspection.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hotspot/share/memory/heapInspection.cpp b/src/hotspot/share/memory/heapInspection.cpp index 2b16ec397d8..4161035ac6c 100644 --- a/src/hotspot/share/memory/heapInspection.cpp +++ b/src/hotspot/share/memory/heapInspection.cpp @@ -613,7 +613,6 @@ void PrintClassLayout::print_class_layout(outputStream* st, char* class_name) { Klass* klass = klasses->at(i); if (!klass->is_instance_klass()) continue; // Skip InstanceKlass* ik = InstanceKlass::cast(klass); - int tab = 1; ResourceMark rm; st->print_cr("Class %s [@%s]:", klass->external_name(), klass->class_loader_data()->loader_name());