author | coleenp |
Fri, 28 Sep 2018 16:07:39 -0400 | |
changeset 51959 | db0c3952de52 |
parent 51698 | 74dde8b66b7f |
permissions | -rw-r--r-- |
1 | 1 |
/* |
48882
6b510cb0f14f
8187577: JVM crash during gc doing concurrent marking
poonam
parents:
47216
diff
changeset
|
2 |
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. |
1 | 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 |
* |
|
5547
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1
diff
changeset
|
21 |
* questions. |
1 | 22 |
* |
23 |
*/ |
|
24 |
||
7397 | 25 |
#include "precompiled.hpp" |
51959
db0c3952de52
8209645: Split ClassLoaderData and ClassLoaderDataGraph into separate files
coleenp
parents:
51698
diff
changeset
|
26 |
#include "classfile/classLoaderDataGraph.hpp" |
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
27 |
#include "classfile/dictionary.hpp" |
7397 | 28 |
#include "classfile/systemDictionary.hpp" |
30764 | 29 |
#include "gc/shared/collectedHeap.hpp" |
49359
59f6547e151f
8199264: Remove universe.inline.hpp to simplify include dependencies
stefank
parents:
49347
diff
changeset
|
30 |
#include "memory/universe.hpp" |
7397 | 31 |
#include "prims/jvmtiGetLoadedClasses.hpp" |
49480
d7df2dd501ce
8199809: Don't include frame.inline.hpp and other.inline.hpp from .hpp files
coleenp
parents:
49479
diff
changeset
|
32 |
#include "runtime/handles.inline.hpp" |
49192
6734eeef4283
8198474: Move JNIHandles::resolve into jniHandles.inline.hpp
kbarrett
parents:
48882
diff
changeset
|
33 |
#include "runtime/jniHandles.inline.hpp" |
7397 | 34 |
#include "runtime/thread.hpp" |
29081
c61eb4914428
8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents:
22234
diff
changeset
|
35 |
#include "utilities/stack.inline.hpp" |
1 | 36 |
|
21183
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
37 |
// The closure for GetLoadedClasses |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
38 |
class LoadedClassesClosure : public KlassClosure { |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
39 |
private: |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
40 |
Stack<jclass, mtInternal> _classStack; |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
41 |
JvmtiEnv* _env; |
46271
979ebd346ecf
8169881: Remove implicit Handle conversions oop->Handle
coleenp
parents:
30764
diff
changeset
|
42 |
Thread* _cur_thread; |
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
43 |
bool _dictionary_walk; |
21183
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
44 |
|
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
45 |
int extract(jclass* result_list) { |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
46 |
// The size of the Stack will be 0 after extract, so get it here |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
47 |
int count = (int)_classStack.size(); |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
48 |
int i = count; |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
49 |
|
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
50 |
// Pop all jclasses, fill backwards |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
51 |
while (!_classStack.is_empty()) { |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
52 |
result_list[--i] = _classStack.pop(); |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
53 |
} |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
54 |
|
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
55 |
// Return the number of elements written |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
56 |
return count; |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
57 |
} |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
58 |
|
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
59 |
// Return current size of the Stack |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
60 |
int get_count() { |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
61 |
return (int)_classStack.size(); |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
62 |
} |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
63 |
|
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
64 |
public: |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
65 |
LoadedClassesClosure(JvmtiEnv* env, bool dictionary_walk) : |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
66 |
_env(env), |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
67 |
_cur_thread(Thread::current()), |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
68 |
_dictionary_walk(dictionary_walk) { |
1 | 69 |
} |
70 |
||
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
71 |
void do_klass(Klass* k) { |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
72 |
// Collect all jclasses |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
73 |
_classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, k->java_mirror()))); |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
74 |
if (_dictionary_walk) { |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
75 |
// Collect array classes this way when walking the dictionary (because array classes are |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
76 |
// not in the dictionary). |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
77 |
for (Klass* l = k->array_klass_or_null(); l != NULL; l = l->array_klass_or_null()) { |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
78 |
_classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, l->java_mirror()))); |
1 | 79 |
} |
80 |
} |
|
81 |
} |
|
82 |
||
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
83 |
jvmtiError get_result(JvmtiEnv *env, jint* classCountPtr, jclass** classesPtr) { |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
84 |
// Return results by extracting the collected contents into a list |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
85 |
// allocated via JvmtiEnv |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
86 |
jclass* result_list; |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
87 |
jvmtiError error = env->Allocate(get_count() * sizeof(jclass), |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
88 |
(unsigned char**)&result_list); |
1 | 89 |
|
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
90 |
if (error == JVMTI_ERROR_NONE) { |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
91 |
int count = extract(result_list); |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
92 |
*classCountPtr = count; |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
93 |
*classesPtr = result_list; |
1 | 94 |
} |
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
95 |
return error; |
1 | 96 |
} |
97 |
}; |
|
98 |
||
99 |
jvmtiError |
|
100 |
JvmtiGetLoadedClasses::getLoadedClasses(JvmtiEnv *env, jint* classCountPtr, jclass** classesPtr) { |
|
101 |
||
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
102 |
LoadedClassesClosure closure(env, false); |
1 | 103 |
{ |
104 |
// To get a consistent list of classes we need MultiArray_lock to ensure |
|
21183
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
105 |
// array classes aren't created. |
1 | 106 |
MutexLocker ma(MultiArray_lock); |
21183
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
107 |
|
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
108 |
// Iterate through all classes in ClassLoaderDataGraph |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
109 |
// and collect them using the LoadedClassesClosure |
51608 | 110 |
MutexLocker mcld(ClassLoaderDataGraph_lock); |
21183
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
111 |
ClassLoaderDataGraph::loaded_classes_do(&closure); |
e148e499e5cd
8024423: JVMTI: GetLoadedClasses doesn't enumerate anonymous classes
farvidsson
parents:
14488
diff
changeset
|
112 |
} |
1 | 113 |
|
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
114 |
return closure.get_result(env, classCountPtr, classesPtr); |
1 | 115 |
} |
116 |
||
117 |
jvmtiError |
|
118 |
JvmtiGetLoadedClasses::getClassLoaderClasses(JvmtiEnv *env, jobject initiatingLoader, |
|
119 |
jint* classCountPtr, jclass** classesPtr) { |
|
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
120 |
|
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
121 |
LoadedClassesClosure closure(env, true); |
1 | 122 |
{ |
123 |
// To get a consistent list of classes we need MultiArray_lock to ensure |
|
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
124 |
// array classes aren't created during this walk. |
1 | 125 |
MutexLocker ma(MultiArray_lock); |
126 |
MutexLocker sd(SystemDictionary_lock); |
|
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
127 |
oop loader = JNIHandles::resolve(initiatingLoader); |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
128 |
// All classes loaded from this loader as initiating loader are |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
129 |
// requested, so only need to walk this loader's ClassLoaderData |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
130 |
// dictionary, or the NULL ClassLoaderData dictionary for bootstrap loader. |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
131 |
if (loader != NULL) { |
51698
74dde8b66b7f
8210422: runtime/modules/ModuleStress/ExportModuleStressTest.java - assertion failed: address not aligned: 0x00000008baadbabe
coleenp
parents:
51608
diff
changeset
|
132 |
ClassLoaderData* data = java_lang_ClassLoader::loader_data_acquire(loader); |
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
133 |
// ClassLoader may not be used yet for loading. |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
134 |
if (data != NULL && data->dictionary() != NULL) { |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
135 |
data->dictionary()->all_entries_do(&closure); |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
136 |
} |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
137 |
} else { |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
138 |
ClassLoaderData::the_null_class_loader_data()->dictionary()->all_entries_do(&closure); |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
139 |
} |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
140 |
// Get basic arrays for all loaders. |
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
141 |
Universe::basic_type_classes_do(&closure); |
1 | 142 |
} |
51530
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
143 |
|
1f0b605bdc28
8209821: Make JVMTI GetClassLoaderClasses not walk CLDG
coleenp
parents:
51334
diff
changeset
|
144 |
return closure.get_result(env, classCountPtr, classesPtr); |
1 | 145 |
} |