annotate src/share/vm/prims/jvmtiGetLoadedClasses.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 55fb97c4c58d
children 4ca6dc0799b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 12995
diff changeset
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "prims/jvmtiGetLoadedClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "runtime/thread.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31
12995
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
32 // The closure for GetLoadedClasses
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
33 class LoadedClassesClosure : public KlassClosure {
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
34 private:
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
35 Stack<jclass, mtInternal> _classStack;
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
36 JvmtiEnv* _env;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37
12995
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
38 public:
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
39 LoadedClassesClosure(JvmtiEnv* env) {
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
40 _env = env;
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
41 }
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
42
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
43 void do_klass(Klass* k) {
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
44 // Collect all jclasses
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
45 _classStack.push((jclass) _env->jni_reference(k->java_mirror()));
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
46 }
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
47
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
48 int extract(jclass* result_list) {
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
49 // The size of the Stack will be 0 after extract, so get it here
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
50 int count = (int)_classStack.size();
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
51 int i = count;
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
52
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
53 // Pop all jclasses, fill backwards
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
54 while (!_classStack.is_empty()) {
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
55 result_list[--i] = _classStack.pop();
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
56 }
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
57
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
58 // Return the number of elements written
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
59 return count;
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
60 }
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
61
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
62 // Return current size of the Stack
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
63 int get_count() {
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
64 return (int)_classStack.size();
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
65 }
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
66 };
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
67
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
68 // The closure for GetClassLoaderClasses
0
a61af66fc99e Initial load
duke
parents:
diff changeset
69 class JvmtiGetLoadedClassesClosure : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Since the SystemDictionary::classes_do callback
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // doesn't pass a closureData pointer,
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // we use a thread-local slot to hold a pointer to
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // a stack allocated instance of this structure.
a61af66fc99e Initial load
duke
parents:
diff changeset
74 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
75 jobject _initiatingLoader;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 int _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 Handle* _list;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 int _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Getting and setting the thread local pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static JvmtiGetLoadedClassesClosure* get_this() {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 JvmtiGetLoadedClassesClosure* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
85 result = thread->get_jvmti_get_loaded_classes_closure();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 static void set_this(JvmtiGetLoadedClassesClosure* that) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
90 thread->set_jvmti_get_loaded_classes_closure(that);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Constructor/Destructor
a61af66fc99e Initial load
duke
parents:
diff changeset
95 JvmtiGetLoadedClassesClosure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 JvmtiGetLoadedClassesClosure* that = get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 assert(that == NULL, "JvmtiGetLoadedClassesClosure in use");
a61af66fc99e Initial load
duke
parents:
diff changeset
98 _initiatingLoader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 _list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 set_this(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 JvmtiGetLoadedClassesClosure(jobject initiatingLoader) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 JvmtiGetLoadedClassesClosure* that = get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert(that == NULL, "JvmtiGetLoadedClassesClosure in use");
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _initiatingLoader = initiatingLoader;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 _list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 set_this(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 ~JvmtiGetLoadedClassesClosure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 JvmtiGetLoadedClassesClosure* that = get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
117 assert(that != NULL, "JvmtiGetLoadedClassesClosure not found");
a61af66fc99e Initial load
duke
parents:
diff changeset
118 set_this(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _initiatingLoader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 if (_list != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
122 FreeHeap(_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 _list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 jobject get_initiatingLoader() {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 return _initiatingLoader;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 int get_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 return _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 void set_count(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _count = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 Handle* get_list() {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return _list;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 void set_list(Handle* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 _list = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 int get_index() {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 void set_index(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 _index = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 Handle get_element(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 if ((_list != NULL) && (index < _count)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 return _list[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
160 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 assert(false, "empty get_element");
a61af66fc99e Initial load
duke
parents:
diff changeset
162 return Handle();
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 void set_element(int index, Handle value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 if ((_list != NULL) && (index < _count)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _list[index] = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 assert(false, "bad set_element");
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Other predicates
a61af66fc99e Initial load
duke
parents:
diff changeset
175 bool available() {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 return (_list != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // For debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void check(int limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 for (int i = 0; i < limit; i += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 assert(Universe::heap()->is_in(get_element(i)()), "check fails");
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Public methods that get called within the scope of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
189 void allocate() {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
190 _list = NEW_C_HEAP_ARRAY(Handle, _count, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 assert(_list != NULL, "Out of memory");
a61af66fc99e Initial load
duke
parents:
diff changeset
192 if (_list == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void extract(JvmtiEnv *env, jclass* result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 for (int index = 0; index < _count; index += 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 result[index] = (jclass) env->jni_reference(get_element(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
203 static void increment_with_loader(Klass* k, ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
204 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
205 oop class_loader = loader_data->class_loader();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
206 if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
207 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
208 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
213 static void prim_array_increment_with_loader(Klass* array, ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
215 oop class_loader = loader_data->class_loader();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
216 if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
217 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
221 static void add_with_loader(Klass* k, ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
222 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
223 if (that->available()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
224 oop class_loader = loader_data->class_loader();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
225 if (class_loader == JNIHandles::resolve(that->get_initiatingLoader())) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
226 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
227 oop mirror = l->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 that->set_element(that->get_index(), mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 that->set_index(that->get_index() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // increment the count for the given basic type array class (and any
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // multi-dimensional arrays). For example, for [B we check for
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // [[B, [[[B, .. and the count is incremented for each one that exists.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
238 static void increment_for_basic_type_arrays(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
239 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 assert(that != NULL, "no JvmtiGetLoadedClassesClosure");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
241 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242 that->set_count(that->get_count() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // add the basic type array class and its multi-dimensional array classes to the list
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
247 static void add_for_basic_type_arrays(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 JvmtiGetLoadedClassesClosure* that = JvmtiGetLoadedClassesClosure::get_this();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 assert(that != NULL, "no JvmtiGetLoadedClassesClosure");
a61af66fc99e Initial load
duke
parents:
diff changeset
250 assert(that->available(), "no list");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
251 for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6725
diff changeset
252 oop mirror = l->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 that->set_element(that->get_index(), mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
254 that->set_index(that->get_index() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 };
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
261 JvmtiGetLoadedClasses::getLoadedClasses(JvmtiEnv *env, jint* classCountPtr, jclass** classesPtr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262
12995
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
263 LoadedClassesClosure closure(env);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // To get a consistent list of classes we need MultiArray_lock to ensure
12995
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
266 // array classes aren't created.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
267 MutexLocker ma(MultiArray_lock);
12995
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
268
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
269 // Iterate through all classes in ClassLoaderDataGraph
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
270 // and collect them using the LoadedClassesClosure
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
271 ClassLoaderDataGraph::loaded_classes_do(&closure);
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
272 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
273
12995
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
274 // Return results by extracting the collected contents into a list
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
275 // allocated via JvmtiEnv
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
276 jclass* result_list;
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
277 jvmtiError error = env->Allocate(closure.get_count() * sizeof(jclass),
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
278 (unsigned char**)&result_list);
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
279
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
280 if (error == JVMTI_ERROR_NONE) {
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
281 int count = closure.extract(result_list);
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
282 *classCountPtr = count;
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
283 *classesPtr = result_list;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
12995
e64f1fe9756b 8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents: 6983
diff changeset
285 return error;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 jvmtiError
a61af66fc99e Initial load
duke
parents:
diff changeset
289 JvmtiGetLoadedClasses::getClassLoaderClasses(JvmtiEnv *env, jobject initiatingLoader,
a61af66fc99e Initial load
duke
parents:
diff changeset
290 jint* classCountPtr, jclass** classesPtr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Since SystemDictionary::classes_do only takes a function pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // and doesn't call back with a closure data pointer,
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // we can only pass static methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
294 JvmtiGetLoadedClassesClosure closure(initiatingLoader);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // To get a consistent list of classes we need MultiArray_lock to ensure
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // array classes aren't created, and SystemDictionary_lock to ensure that
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // classes aren't added to the system dictionary,
a61af66fc99e Initial load
duke
parents:
diff changeset
299 MutexLocker ma(MultiArray_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 MutexLocker sd(SystemDictionary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // First, count the classes in the system dictionary which have this loader recorded
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // as an initiating loader. For basic type arrays this information is not recorded
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // so GetClassLoaderClasses will return all of the basic type arrays. This is okay
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // because the defining loader for basic type arrays is always the boot class loader
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // and these classes are "visible" to all loaders.
a61af66fc99e Initial load
duke
parents:
diff changeset
306 SystemDictionary::classes_do(&JvmtiGetLoadedClassesClosure::increment_with_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 Universe::basic_type_classes_do(&JvmtiGetLoadedClassesClosure::increment_for_basic_type_arrays);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Next, fill in the classes
a61af66fc99e Initial load
duke
parents:
diff changeset
309 closure.allocate();
a61af66fc99e Initial load
duke
parents:
diff changeset
310 SystemDictionary::classes_do(&JvmtiGetLoadedClassesClosure::add_with_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 Universe::basic_type_classes_do(&JvmtiGetLoadedClassesClosure::add_for_basic_type_arrays);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // Drop the SystemDictionary_lock, so the results could be wrong from here,
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // but we still have a snapshot.
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Post results
a61af66fc99e Initial load
duke
parents:
diff changeset
316 jclass* result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 jvmtiError err = env->Allocate(closure.get_count() * sizeof(jclass),
a61af66fc99e Initial load
duke
parents:
diff changeset
318 (unsigned char**)&result_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 if (err != JVMTI_ERROR_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 return err;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 closure.extract(env, result_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 *classCountPtr = closure.get_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 *classesPtr = result_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 return JVMTI_ERROR_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }