< prev index next >

src/hotspot/share/classfile/classLoaderStats.cpp

Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com

*** 1,7 **** /* ! * Copyright (c) 2014, 2018, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2014, 2020, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 24,33 **** --- 24,34 ---- #include "precompiled.hpp" #include "classfile/classLoaderData.inline.hpp" #include "classfile/classLoaderDataGraph.hpp" #include "classfile/classLoaderStats.hpp" + #include "oops/objArrayKlass.hpp" #include "oops/oop.inline.hpp" #include "utilities/globalDefinitions.hpp" class ClassStatsClosure : public KlassClosure {
*** 57,67 **** _total_loaders++; } else { cls = *cls_ptr; } ! if (!cld->is_unsafe_anonymous()) { cls->_cld = cld; } cls->_class_loader = cl; if (cl != NULL) { --- 58,68 ---- _total_loaders++; } else { cls = *cls_ptr; } ! if (!cld->has_class_mirror_holder()) { cls->_cld = cld; } cls->_class_loader = cl; if (cl != NULL) {
*** 69,90 **** addEmptyParents(cls->_parent); } ClassStatsClosure csc; cld->classes_do(&csc); ! if(cld->is_unsafe_anonymous()) { cls->_anon_classes_count += csc._num_classes; } else { cls->_classes_count = csc._num_classes; } _total_classes += csc._num_classes; ClassLoaderMetaspace* ms = cld->metaspace_or_null(); if (ms != NULL) { ! if(cld->is_unsafe_anonymous()) { cls->_anon_chunk_sz += ms->allocated_chunks_bytes(); cls->_anon_block_sz += ms->allocated_blocks_bytes(); } else { cls->_chunk_sz = ms->allocated_chunks_bytes(); cls->_block_sz = ms->allocated_blocks_bytes(); } _total_chunk_sz += ms->allocated_chunks_bytes(); --- 70,108 ---- addEmptyParents(cls->_parent); } ClassStatsClosure csc; cld->classes_do(&csc); ! bool is_hidden = false; ! if(cld->has_class_mirror_holder()) { ! // if cld has a class holder then it must be either hidden or unsafe anonymous. ! Klass* k = cld->klasses(); ! // if it's an array class then need to see if bottom class is hidden. ! if (k->is_array_klass()) { ! k = ObjArrayKlass::cast(k)->bottom_klass(); ! } ! is_hidden = k->is_hidden(); ! if (is_hidden) { ! cls->_hidden_classes_count += csc._num_classes; ! } else { cls->_anon_classes_count += csc._num_classes; + } } else { cls->_classes_count = csc._num_classes; } _total_classes += csc._num_classes; ClassLoaderMetaspace* ms = cld->metaspace_or_null(); if (ms != NULL) { ! if(cld->has_class_mirror_holder()) { ! if (is_hidden) { ! cls->_hidden_chunk_sz += ms->allocated_chunks_bytes(); ! cls->_hidden_block_sz += ms->allocated_blocks_bytes(); ! } else { cls->_anon_chunk_sz += ms->allocated_chunks_bytes(); cls->_anon_block_sz += ms->allocated_blocks_bytes(); + } } else { cls->_chunk_sz = ms->allocated_chunks_bytes(); cls->_block_sz = ms->allocated_blocks_bytes(); } _total_chunk_sz += ms->allocated_chunks_bytes();
*** 119,128 **** --- 137,152 ---- _out->print_cr(SPACE SPACE SPACE " " UINTX_FORMAT_W(6) " " SIZE_FORMAT_W(8) " " SIZE_FORMAT_W(8) " + unsafe anonymous classes", "", "", "", cls->_anon_classes_count, cls->_anon_chunk_sz, cls->_anon_block_sz); } + if (cls->_hidden_classes_count > 0) { + _out->print_cr(SPACE SPACE SPACE " " UINTX_FORMAT_W(6) " " SIZE_FORMAT_W(8) " " SIZE_FORMAT_W(8) " + hidden classes", + "", "", "", + cls->_hidden_classes_count, + cls->_hidden_chunk_sz, cls->_hidden_block_sz); + } return true; } void ClassLoaderStatsClosure::print() {
< prev index next >