1/*
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_VM_CLASSFILE_CLASSLOADERSTATS_HPP
26#define SHARE_VM_CLASSFILE_CLASSLOADERSTATS_HPP
27
28
29#include "classfile/classLoaderData.hpp"
30#include "oops/klass.hpp"
31#include "oops/oopsHierarchy.hpp"
32#include "runtime/vm_operations.hpp"
33#include "services/diagnosticCommand.hpp"
34#include "utilities/resourceHash.hpp"
35
36
37class ClassLoaderStatsDCmd : public DCmd {
38public:
39  ClassLoaderStatsDCmd(outputStream* output, bool heap) :
40    DCmd(output, heap) {
41  }
42
43  static const char* name() {
44    return "VM.classloader_stats";
45  }
46
47  static const char* description() {
48    return "Print statistics about all ClassLoaders.";
49  }
50
51  static const char* impact() {
52    return "Low";
53  }
54
55  virtual void execute(DCmdSource source, TRAPS);
56
57  static int num_arguments() {
58    return 0;
59  }
60
61  static const JavaPermission permission() {
62    JavaPermission p = {"java.lang.management.ManagementPermission",
63                        "monitor", NULL};
64    return p;
65  }
66};
67
68
69class ClassLoaderStats : public ResourceObj {
70public:
71  ClassLoaderData*  _cld;
72  oop               _class_loader;
73  oop               _parent;
74
75  size_t            _chunk_sz;
76  size_t            _block_sz;
77  uintx             _classes_count;
78
79  size_t            _anon_chunk_sz;
80  size_t            _anon_block_sz;
81  uintx             _anon_classes_count;
82
83  ClassLoaderStats() :
84    _cld(0),
85    _class_loader(0),
86    _parent(0),
87    _chunk_sz(0),
88    _block_sz(0),
89    _classes_count(0),
90    _anon_block_sz(0),
91    _anon_chunk_sz(0),
92    _anon_classes_count(0) {
93  }
94};
95
96
97class ClassLoaderStatsClosure : public CLDClosure {
98protected:
99  static bool oop_equals(oop const& s1, oop const& s2) {
100    return s1 == s2;
101  }
102
103  static unsigned oop_hash(oop const& s1) {
104    unsigned hash = (unsigned)((uintptr_t)&s1);
105    return hash ^ (hash >> LogMinObjAlignment);
106  }
107
108  typedef ResourceHashtable<oop, ClassLoaderStats*,
109      ClassLoaderStatsClosure::oop_hash, ClassLoaderStatsClosure::oop_equals> StatsTable;
110
111  outputStream* _out;
112  StatsTable* _stats;
113  uintx   _total_loaders;
114  uintx   _total_classes;
115  size_t  _total_chunk_sz;
116  size_t  _total_block_sz;
117
118public:
119  ClassLoaderStatsClosure(outputStream* out) :
120    _out(out),
121    _total_loaders(0),
122    _total_block_sz(0),
123    _total_chunk_sz(0),
124    _total_classes(0),
125    _stats(new StatsTable()) {
126  }
127
128  virtual void do_cld(ClassLoaderData* cld);
129  virtual bool do_entry(oop const& key, ClassLoaderStats* const& cls);
130  void print();
131
132private:
133  void addEmptyParents(oop cl);
134};
135
136
137class ClassLoaderStatsVMOperation : public VM_Operation {
138  outputStream* _out;
139
140public:
141  ClassLoaderStatsVMOperation(outputStream* out) :
142    _out(out) {
143  }
144
145  VMOp_Type type() const {
146    return VMOp_ClassLoaderStatsOperation;
147  }
148
149  void doit();
150};
151
152#endif // SHARE_VM_CLASSFILE_CLASSLOADERSTATS_HPP
153