# HG changeset patch # User hseigel # Date 1461865476 14400 # Node ID 7babe39983c010c7c2571e3e1c7d3e2016cc4af1 # Parent 02d1ce4fb721646f737d0501daa845b491fc5c92 8151342: Add module name/version to class histogram output Summary: Add additional column to histogram containing module@version Reviewed-by: sundar, gtriantafill diff -r 02d1ce4fb721 -r 7babe39983c0 hotspot/src/share/vm/memory/heapInspection.cpp --- a/hotspot/src/share/vm/memory/heapInspection.cpp Thu Apr 28 09:10:10 2016 +0000 +++ b/hotspot/src/share/vm/memory/heapInspection.cpp Thu Apr 28 13:44:36 2016 -0400 @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "classfile/classLoaderData.hpp" +#include "classfile/moduleEntry.hpp" #include "classfile/systemDictionary.hpp" #include "gc/shared/collectedHeap.hpp" #include "gc/shared/genCollectedHeap.hpp" @@ -105,10 +106,20 @@ ResourceMark rm; // simplify the formatting (ILP32 vs LP64) - always cast the numbers to 64-bit - st->print_cr(INT64_FORMAT_W(13) " " UINT64_FORMAT_W(13) " %s", - (int64_t)_instance_count, - (uint64_t)_instance_words * HeapWordSize, - name()); + ModuleEntry* module = _klass->module(); + if (module->is_named()) { + st->print_cr(INT64_FORMAT_W(13) " " UINT64_FORMAT_W(13) " %s (%s@%s)", + (int64_t)_instance_count, + (uint64_t)_instance_words * HeapWordSize, + name(), + module->name()->as_C_string(), + module->version() != NULL ? module->version()->as_C_string() : ""); + } else { + st->print_cr(INT64_FORMAT_W(13) " " UINT64_FORMAT_W(13) " %s", + (int64_t)_instance_count, + (uint64_t)_instance_words * HeapWordSize, + name()); + } } KlassInfoEntry* KlassInfoBucket::lookup(Klass* const k) { @@ -647,8 +658,8 @@ if (print_stats) { print_class_stats(st, csv_format, columns); } else { - st->print_cr(" num #instances #bytes class name"); - st->print_cr("----------------------------------------------"); + st->print_cr(" num #instances #bytes class name (module)"); + st->print_cr("-------------------------------------------------------"); print_elements(st); } } diff -r 02d1ce4fb721 -r 7babe39983c0 hotspot/test/serviceability/dcmd/gc/ClassHistogramTest.java --- a/hotspot/test/serviceability/dcmd/gc/ClassHistogramTest.java Thu Apr 28 09:10:10 2016 +0000 +++ b/hotspot/test/serviceability/dcmd/gc/ClassHistogramTest.java Thu Apr 28 13:44:36 2016 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -57,33 +57,34 @@ /* * example output: - * num #instances #bytes class name - * ---------------------------------------------- - * 1: 1647 1133752 [B - * 2: 6198 383168 [C - * 3: 1464 165744 java.lang.Class - * 4: 6151 147624 java.lang.String - * 5: 2304 73728 java.util.concurrent.ConcurrentHashMap$Node - * 6: 1199 64280 [Ljava.lang.Object; + * num #instances #bytes class name (module) + * ------------------------------------------------------- + * 1: 7991 757792 [B (java.base@9-internal) + * 2: 1811 217872 java.lang.Class (java.base@9-internal) + * 3: 6724 215168 java.util.HashMap$Node (java.base@9-internal) + * 4: 7852 188448 java.lang.String (java.base@9-internal) + * 5: 1378 105040 [Ljava.util.HashMap$Node; (java.base@9-internal) + * 6: 1863 95096 [Ljava.lang.Object; (java.base@9-internal) + * ... */ /* Require at least one java.lang.Class */ - output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.Class\\s*$"); + output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.Class \\(java.base@\\S*\\)\\s*$"); /* Require at least one java.lang.String */ - output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.String\\s*$"); + output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.String \\(java.base@\\S*\\)\\s*$"); /* Require at least one java.lang.Object */ - output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.Object\\s*$"); + output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.Object \\(java.base@\\S*\\)\\s*$"); /* Require at exactly one TestClass[] */ output.shouldMatch("^\\s+\\d+:\\s+1\\s+\\d+\\s+" + - Pattern.quote(TestClass[].class.getName()) + "\\s*$"); + Pattern.quote(TestClass[].class.getName()) + "\\s*$"); /* Require at exactly 1024 TestClass */ output.shouldMatch("^\\s+\\d+:\\s+1024\\s+\\d+\\s+" + - Pattern.quote(TestClass.class.getName()) + "\\s*$"); + Pattern.quote(TestClass.class.getName()) + "\\s*$"); } @Test