annotate src/share/vm/code/codeCache.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 2a47bd84841f
children 3e8fbc61cee8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
2 * Copyright (c) 1997, 2010, 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: 1538
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
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: 1538
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_codeCache.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // Helper class for printing in CodeCache
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 class CodeBlob_sizes {
a61af66fc99e Initial load
duke
parents:
diff changeset
31 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
32 int count;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 int total_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 int header_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 int code_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 int stub_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 int relocation_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 int scopes_oop_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 int scopes_data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 int scopes_pcs_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
43 CodeBlob_sizes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 total_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 header_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 code_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 stub_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 relocation_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 scopes_oop_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 scopes_data_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 scopes_pcs_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 }
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 int total() { return total_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 bool is_empty() { return count == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 void print(const char* title) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 tty->print_cr(" #%d %s = %dK (hdr %d%%, loc %d%%, code %d%%, stub %d%%, [oops %d%%, data %d%%, pcs %d%%])",
a61af66fc99e Initial load
duke
parents:
diff changeset
60 count,
a61af66fc99e Initial load
duke
parents:
diff changeset
61 title,
a61af66fc99e Initial load
duke
parents:
diff changeset
62 total() / K,
a61af66fc99e Initial load
duke
parents:
diff changeset
63 header_size * 100 / total_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
64 relocation_size * 100 / total_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
65 code_size * 100 / total_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
66 stub_size * 100 / total_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
67 scopes_oop_size * 100 / total_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
68 scopes_data_size * 100 / total_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
69 scopes_pcs_size * 100 / total_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 void add(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 total_size += cb->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
75 header_size += cb->header_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
76 relocation_size += cb->relocation_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
77 if (cb->is_nmethod()) {
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
78 nmethod* nm = cb->as_nmethod_or_null();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 code_size += nm->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
80 stub_size += nm->stub_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
81
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
82 scopes_oop_size += nm->oops_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 scopes_data_size += nm->scopes_data_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
84 scopes_pcs_size += nm->scopes_pcs_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
85 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 code_size += cb->instructions_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 };
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // CodeCache implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 CodeHeap * CodeCache::_heap = new CodeHeap();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 int CodeCache::_number_of_blobs = 0;
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
96 int CodeCache::_number_of_adapters = 0;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
97 int CodeCache::_number_of_nmethods = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 int CodeCache::_number_of_nmethods_with_dependencies = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 bool CodeCache::_needs_cache_clean = false;
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
100 nmethod* CodeCache::_scavenge_root_nmethods = NULL;
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
101 nmethod* CodeCache::_saved_nmethods = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 CodeBlob* CodeCache::first() {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 return (CodeBlob*)_heap->first();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 CodeBlob* CodeCache::next(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
112 return (CodeBlob*)_heap->next(cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 CodeBlob* CodeCache::alive(CodeBlob *cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 while (cb != NULL && !cb->is_alive()) cb = next(cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 return cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 nmethod* CodeCache::alive_nmethod(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
125 while (cb != NULL && (!cb->is_alive() || !cb->is_nmethod())) cb = next(cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
129 nmethod* CodeCache::first_nmethod() {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
130 assert_locked_or_safepoint(CodeCache_lock);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
131 CodeBlob* cb = first();
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
132 while (cb != NULL && !cb->is_nmethod()) {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
133 cb = next(cb);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
134 }
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
135 return (nmethod*)cb;
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
136 }
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
137
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
138 nmethod* CodeCache::next_nmethod (CodeBlob* cb) {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
139 assert_locked_or_safepoint(CodeCache_lock);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
140 cb = next(cb);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
141 while (cb != NULL && !cb->is_nmethod()) {
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
142 cb = next(cb);
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
143 }
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
144 return (nmethod*)cb;
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
145 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 CodeBlob* CodeCache::allocate(int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Do not seize the CodeCache lock here--if the caller has not
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // already done so, we are going to lose bigtime, since the code
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // cache will contain a garbage CodeBlob until the caller can
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // run the constructor for the CodeBlob subclass he is busy
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // instantiating.
a61af66fc99e Initial load
duke
parents:
diff changeset
153 guarantee(size >= 0, "allocation request must be reasonable");
a61af66fc99e Initial load
duke
parents:
diff changeset
154 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 CodeBlob* cb = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 _number_of_blobs++;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 cb = (CodeBlob*)_heap->allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 if (cb != NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 if (!_heap->expand_by(CodeCacheExpansionSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Expansion failed
a61af66fc99e Initial load
duke
parents:
diff changeset
162 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (PrintCodeCacheExtension) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 tty->print_cr("code cache extended to [" INTPTR_FORMAT ", " INTPTR_FORMAT "] (%d bytes)",
a61af66fc99e Initial load
duke
parents:
diff changeset
167 (intptr_t)_heap->begin(), (intptr_t)_heap->end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
168 (address)_heap->end() - (address)_heap->begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 verify_if_often();
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
172 print_trace("allocation", cb, size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
173 return cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void CodeCache::free(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
178 verify_if_often();
a61af66fc99e Initial load
duke
parents:
diff changeset
179
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
180 print_trace("free", cb);
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
181 if (cb->is_nmethod()) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
182 _number_of_nmethods--;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
183 if (((nmethod *)cb)->has_dependencies()) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
184 _number_of_nmethods_with_dependencies--;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
185 }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
186 }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
187 if (cb->is_adapter_blob()) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
188 _number_of_adapters--;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 _number_of_blobs--;
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 _heap->deallocate(cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 verify_if_often();
a61af66fc99e Initial load
duke
parents:
diff changeset
195 assert(_number_of_blobs >= 0, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 void CodeCache::commit(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // this is called by nmethod::nmethod, which must already own CodeCache_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
201 assert_locked_or_safepoint(CodeCache_lock);
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
202 if (cb->is_nmethod()) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
203 _number_of_nmethods++;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
204 if (((nmethod *)cb)->has_dependencies()) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
205 _number_of_nmethods_with_dependencies++;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
206 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
208 if (cb->is_adapter_blob()) {
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
209 _number_of_adapters++;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
210 }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1579
diff changeset
211
0
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // flush the hardware I-cache
a61af66fc99e Initial load
duke
parents:
diff changeset
213 ICache::invalidate_range(cb->instructions_begin(), cb->instructions_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 void CodeCache::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Iteration over CodeBlobs
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 #define FOR_ALL_BLOBS(var) for (CodeBlob *var = first() ; var != NULL; var = next(var) )
a61af66fc99e Initial load
duke
parents:
diff changeset
226 #define FOR_ALL_ALIVE_BLOBS(var) for (CodeBlob *var = alive(first()); var != NULL; var = alive(next(var)))
a61af66fc99e Initial load
duke
parents:
diff changeset
227 #define FOR_ALL_ALIVE_NMETHODS(var) for (nmethod *var = alive_nmethod(first()); var != NULL; var = alive_nmethod(next(var)))
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 bool CodeCache::contains(void *p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // It should be ok to call contains without holding a lock
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return _heap->contains(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // This method is safe to call without holding the CodeCache_lock, as long as a dead codeblob is not
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // looked up (i.e., one that has been marked for deletion). It only dependes on the _segmap to contain
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // valid indices, which it will always do, as long as the CodeBlob is not in the process of being recycled.
a61af66fc99e Initial load
duke
parents:
diff changeset
239 CodeBlob* CodeCache::find_blob(void* start) {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 CodeBlob* result = find_blob_unsafe(start);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 if (result == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // We could potientially look up non_entrant methods
a61af66fc99e Initial load
duke
parents:
diff changeset
243 guarantee(!result->is_zombie() || result->is_locked_by_vm() || is_error_reported(), "unsafe access to zombie method");
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 nmethod* CodeCache::find_nmethod(void* start) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 CodeBlob *cb = find_blob(start);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 assert(cb == NULL || cb->is_nmethod(), "did not find an nmethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
250 return (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 void CodeCache::blobs_do(void f(CodeBlob* nm)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 FOR_ALL_BLOBS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 f(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 void CodeCache::nmethods_do(void f(nmethod* nm)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 FOR_ALL_BLOBS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 if (nm->is_nmethod()) f((nmethod*)nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 int CodeCache::alignment_unit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 return (int)_heap->alignment_unit();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 int CodeCache::alignment_offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 return (int)_heap->alignment_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
280 // Mark nmethods for unloading if they contain otherwise unreachable
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
281 // oops.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
282 void CodeCache::do_unloading(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
283 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
284 bool unloading_occurred) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 assert_locked_or_safepoint(CodeCache_lock);
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
286 FOR_ALL_ALIVE_NMETHODS(nm) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
287 nm->do_unloading(is_alive, keep_alive, unloading_occurred);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
291 void CodeCache::blobs_do(CodeBlobClosure* f) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 FOR_ALL_ALIVE_BLOBS(cb) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
294 f->do_code_blob(cb);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
295
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
296 #ifdef ASSERT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
297 if (cb->is_nmethod())
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
298 ((nmethod*)cb)->verify_scavenge_root_oops();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
299 #endif //ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
303 // Walk the list of methods which might contain non-perm oops.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
304 void CodeCache::scavenge_root_nmethods_do(CodeBlobClosure* f) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
305 assert_locked_or_safepoint(CodeCache_lock);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
306 debug_only(mark_scavenge_root_nmethods());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
307
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
308 for (nmethod* cur = scavenge_root_nmethods(); cur != NULL; cur = cur->scavenge_root_link()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
309 debug_only(cur->clear_scavenge_root_marked());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
310 assert(cur->scavenge_root_not_marked(), "");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
311 assert(cur->on_scavenge_root_list(), "else shouldn't be on this list");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
312
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
313 bool is_live = (!cur->is_zombie() && !cur->is_unloaded());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
314 #ifndef PRODUCT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
315 if (TraceScavenge) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
316 cur->print_on(tty, is_live ? "scavenge root" : "dead scavenge root"); tty->cr();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
317 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
318 #endif //PRODUCT
1363
ed4f78aa9282 6940520: CodeCache::scavenge_root_nmethods_do must fix oop relocations
twisti
parents: 1202
diff changeset
319 if (is_live) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
320 // Perform cur->oops_do(f), maybe just once per nmethod.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
321 f->do_code_blob(cur);
1363
ed4f78aa9282 6940520: CodeCache::scavenge_root_nmethods_do must fix oop relocations
twisti
parents: 1202
diff changeset
322 cur->fix_oop_relocations();
ed4f78aa9282 6940520: CodeCache::scavenge_root_nmethods_do must fix oop relocations
twisti
parents: 1202
diff changeset
323 }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
324 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
325
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
326 // Check for stray marks.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
327 debug_only(verify_perm_nmethods(NULL));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
328 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
329
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
330 void CodeCache::add_scavenge_root_nmethod(nmethod* nm) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
331 assert_locked_or_safepoint(CodeCache_lock);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
332 nm->set_on_scavenge_root_list();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
333 nm->set_scavenge_root_link(_scavenge_root_nmethods);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
334 set_scavenge_root_nmethods(nm);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
335 print_trace("add_scavenge_root", nm);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
336 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
337
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
338 void CodeCache::drop_scavenge_root_nmethod(nmethod* nm) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
339 assert_locked_or_safepoint(CodeCache_lock);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
340 print_trace("drop_scavenge_root", nm);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
341 nmethod* last = NULL;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
342 nmethod* cur = scavenge_root_nmethods();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
343 while (cur != NULL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
344 nmethod* next = cur->scavenge_root_link();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
345 if (cur == nm) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
346 if (last != NULL)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
347 last->set_scavenge_root_link(next);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
348 else set_scavenge_root_nmethods(next);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
349 nm->set_scavenge_root_link(NULL);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
350 nm->clear_on_scavenge_root_list();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
351 return;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
352 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
353 last = cur;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
354 cur = next;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
355 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
356 assert(false, "should have been on list");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
357 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
358
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
359 void CodeCache::prune_scavenge_root_nmethods() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
360 assert_locked_or_safepoint(CodeCache_lock);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
361 debug_only(mark_scavenge_root_nmethods());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
362
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
363 nmethod* last = NULL;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
364 nmethod* cur = scavenge_root_nmethods();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
365 while (cur != NULL) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
366 nmethod* next = cur->scavenge_root_link();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
367 debug_only(cur->clear_scavenge_root_marked());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
368 assert(cur->scavenge_root_not_marked(), "");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
369 assert(cur->on_scavenge_root_list(), "else shouldn't be on this list");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
370
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
371 if (!cur->is_zombie() && !cur->is_unloaded()
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
372 && cur->detect_scavenge_root_oops()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
373 // Keep it. Advance 'last' to prevent deletion.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
374 last = cur;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
375 } else {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
376 // Prune it from the list, so we don't have to look at it any more.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
377 print_trace("prune_scavenge_root", cur);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
378 cur->set_scavenge_root_link(NULL);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
379 cur->clear_on_scavenge_root_list();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
380 if (last != NULL)
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
381 last->set_scavenge_root_link(next);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
382 else set_scavenge_root_nmethods(next);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
383 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
384 cur = next;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
385 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
386
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
387 // Check for stray marks.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
388 debug_only(verify_perm_nmethods(NULL));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
389 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
390
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
391 #ifndef PRODUCT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
392 void CodeCache::asserted_non_scavengable_nmethods_do(CodeBlobClosure* f) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
393 // While we are here, verify the integrity of the list.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
394 mark_scavenge_root_nmethods();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
395 for (nmethod* cur = scavenge_root_nmethods(); cur != NULL; cur = cur->scavenge_root_link()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
396 assert(cur->on_scavenge_root_list(), "else shouldn't be on this list");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
397 cur->clear_scavenge_root_marked();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
398 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
399 verify_perm_nmethods(f);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
400 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
401
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
402 // Temporarily mark nmethods that are claimed to be on the non-perm list.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
403 void CodeCache::mark_scavenge_root_nmethods() {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
404 FOR_ALL_ALIVE_BLOBS(cb) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
405 if (cb->is_nmethod()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
406 nmethod *nm = (nmethod*)cb;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
407 assert(nm->scavenge_root_not_marked(), "clean state");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
408 if (nm->on_scavenge_root_list())
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
409 nm->set_scavenge_root_marked();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
410 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
411 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
412 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
413
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
414 // If the closure is given, run it on the unlisted nmethods.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
415 // Also make sure that the effects of mark_scavenge_root_nmethods is gone.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
416 void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
417 FOR_ALL_ALIVE_BLOBS(cb) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
418 bool call_f = (f_or_null != NULL);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
419 if (cb->is_nmethod()) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
420 nmethod *nm = (nmethod*)cb;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
421 assert(nm->scavenge_root_not_marked(), "must be already processed");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
422 if (nm->on_scavenge_root_list())
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
423 call_f = false; // don't show this one to the client
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
424 nm->verify_scavenge_root_oops();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
425 } else {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
426 call_f = false; // not an nmethod
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
427 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
428 if (call_f) f_or_null->do_code_blob(cb);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
429 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
430 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
431 #endif //PRODUCT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
432
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
433
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
434 nmethod* CodeCache::find_and_remove_saved_code(methodOop m) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
435 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
436 nmethod* saved = _saved_nmethods;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
437 nmethod* prev = NULL;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
438 while (saved != NULL) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
439 if (saved->is_in_use() && saved->method() == m) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
440 if (prev != NULL) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
441 prev->set_saved_nmethod_link(saved->saved_nmethod_link());
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
442 } else {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
443 _saved_nmethods = saved->saved_nmethod_link();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
444 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
445 assert(saved->is_speculatively_disconnected(), "shouldn't call for other nmethods");
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
446 saved->set_speculatively_disconnected(false);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
447 saved->set_saved_nmethod_link(NULL);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
448 if (PrintMethodFlushing) {
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
449 saved->print_on(tty, " ### nmethod is reconnected\n");
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
450 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
451 if (LogCompilation && (xtty != NULL)) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
452 ttyLocker ttyl;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
453 xtty->begin_elem("nmethod_reconnected compile_id='%3d'", saved->compile_id());
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
454 xtty->method(methodOop(m));
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
455 xtty->stamp();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
456 xtty->end_elem();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
457 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
458 return saved;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
459 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
460 prev = saved;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
461 saved = saved->saved_nmethod_link();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
462 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
463 return NULL;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
464 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
465
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
466 void CodeCache::remove_saved_code(nmethod* nm) {
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
467 // For conc swpr this will be called with CodeCache_lock taken by caller
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
468 assert_locked_or_safepoint(CodeCache_lock);
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
469 assert(nm->is_speculatively_disconnected(), "shouldn't call for other nmethods");
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
470 nmethod* saved = _saved_nmethods;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
471 nmethod* prev = NULL;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
472 while (saved != NULL) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
473 if (saved == nm) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
474 if (prev != NULL) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
475 prev->set_saved_nmethod_link(saved->saved_nmethod_link());
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
476 } else {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
477 _saved_nmethods = saved->saved_nmethod_link();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
478 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
479 if (LogCompilation && (xtty != NULL)) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
480 ttyLocker ttyl;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
481 xtty->begin_elem("nmethod_removed compile_id='%3d'", nm->compile_id());
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
482 xtty->stamp();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
483 xtty->end_elem();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
484 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
485 return;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
486 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
487 prev = saved;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
488 saved = saved->saved_nmethod_link();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
489 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
490 ShouldNotReachHere();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
491 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
492
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
493 void CodeCache::speculatively_disconnect(nmethod* nm) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
494 assert_locked_or_safepoint(CodeCache_lock);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
495 assert(nm->is_in_use() && !nm->is_speculatively_disconnected(), "should only disconnect live nmethods");
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
496 nm->set_saved_nmethod_link(_saved_nmethods);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
497 _saved_nmethods = nm;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
498 if (PrintMethodFlushing) {
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1363
diff changeset
499 nm->print_on(tty, " ### nmethod is speculatively disconnected\n");
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
500 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
501 if (LogCompilation && (xtty != NULL)) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
502 ttyLocker ttyl;
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
503 xtty->begin_elem("nmethod_disconnected compile_id='%3d'", nm->compile_id());
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
504 xtty->method(methodOop(nm->method()));
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
505 xtty->stamp();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
506 xtty->end_elem();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
507 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
508 nm->method()->clear_code();
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
509 nm->set_speculatively_disconnected(true);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
510 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
511
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
512
0
a61af66fc99e Initial load
duke
parents:
diff changeset
513 void CodeCache::gc_prologue() {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
514 assert(!nmethod::oops_do_marking_is_active(), "oops_do_marking_epilogue must be called");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 void CodeCache::gc_epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
519 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 FOR_ALL_ALIVE_BLOBS(cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
521 if (cb->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 nmethod *nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 assert(!nm->is_unloaded(), "Tautology");
a61af66fc99e Initial load
duke
parents:
diff changeset
524 if (needs_cache_clean()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 nm->cleanup_inline_caches();
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
527 DEBUG_ONLY(nm->verify());
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
528 nm->fix_oop_relocations();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531 set_needs_cache_clean(false);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
532 prune_scavenge_root_nmethods();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
533 assert(!nmethod::oops_do_marking_is_active(), "oops_do_marking_prologue must be called");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 address CodeCache::first_address() {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 return (address)_heap->begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 address CodeCache::last_address() {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 return (address)_heap->end();
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 void icache_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void CodeCache::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
552 assert(CodeCacheSegmentSize >= (uintx)CodeEntryAlignment, "CodeCacheSegmentSize must be large enough to align entry points");
a61af66fc99e Initial load
duke
parents:
diff changeset
553 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
554 assert(CodeCacheSegmentSize >= (uintx)OptoLoopAlignment, "CodeCacheSegmentSize must be large enough to align inner loops");
a61af66fc99e Initial load
duke
parents:
diff changeset
555 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
556 assert(CodeCacheSegmentSize >= sizeof(jdouble), "CodeCacheSegmentSize must be large enough to align constants");
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // This was originally just a check of the alignment, causing failure, instead, round
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // the code cache to the page size. In particular, Solaris is moving to a larger
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // default page size.
a61af66fc99e Initial load
duke
parents:
diff changeset
560 CodeCacheExpansionSize = round_to(CodeCacheExpansionSize, os::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
561 InitialCodeCacheSize = round_to(InitialCodeCacheSize, os::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
562 ReservedCodeCacheSize = round_to(ReservedCodeCacheSize, os::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
563 if (!_heap->reserve(ReservedCodeCacheSize, InitialCodeCacheSize, CodeCacheSegmentSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 vm_exit_during_initialization("Could not reserve enough space for code cache");
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 MemoryService::add_code_heap_memory_pool(_heap);
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // Initialize ICache flush mechanism
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // This service is needed for os::register_code_area
a61af66fc99e Initial load
duke
parents:
diff changeset
571 icache_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Give OS a chance to register generated code area.
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // This is used on Windows 64 bit platforms to register
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // Structured Exception Handlers for our generated code.
a61af66fc99e Initial load
duke
parents:
diff changeset
576 os::register_code_area(_heap->low_boundary(), _heap->high_boundary());
a61af66fc99e Initial load
duke
parents:
diff changeset
577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 void codeCache_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 CodeCache::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 //------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 int CodeCache::number_of_nmethods_with_dependencies() {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 return _number_of_nmethods_with_dependencies;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 void CodeCache::clear_inline_caches() {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 FOR_ALL_ALIVE_NMETHODS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
593 nm->clear_inline_caches();
a61af66fc99e Initial load
duke
parents:
diff changeset
594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // used to keep track of how much time is spent in mark_for_deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
599 static elapsedTimer dependentCheckTime;
a61af66fc99e Initial load
duke
parents:
diff changeset
600 static int dependentCheckCount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
601 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 int CodeCache::mark_for_deoptimization(DepChange& changes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
608 dependentCheckTime.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
609 dependentCheckCount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 int number_of_marked_CodeBlobs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // search the hierarchy looking for nmethods which are affected by the loading of this class
a61af66fc99e Initial load
duke
parents:
diff changeset
615
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // then search the interfaces this class implements looking for nmethods
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // which might be dependent of the fact that an interface only had one
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // implementor.
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 { No_Safepoint_Verifier nsv;
a61af66fc99e Initial load
duke
parents:
diff changeset
621 for (DepChange::ContextStream str(changes, nsv); str.next(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
622 klassOop d = str.klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
623 number_of_marked_CodeBlobs += instanceKlass::cast(d)->mark_dependent_nmethods(changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 if (VerifyDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // Turn off dependency tracing while actually testing deps.
a61af66fc99e Initial load
duke
parents:
diff changeset
629 NOT_PRODUCT( FlagSetting fs(TraceDependencies, false) );
a61af66fc99e Initial load
duke
parents:
diff changeset
630 FOR_ALL_ALIVE_NMETHODS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 if (!nm->is_marked_for_deoptimization() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
632 nm->check_all_dependencies()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
634 tty->print_cr("Should have been marked for deoptimization:");
a61af66fc99e Initial load
duke
parents:
diff changeset
635 changes.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
636 nm->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
637 nm->print_dependencies();
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
643 dependentCheckTime.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
644 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 return number_of_marked_CodeBlobs;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 #ifdef HOTSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
651 int CodeCache::mark_for_evol_deoptimization(instanceKlassHandle dependee) {
a61af66fc99e Initial load
duke
parents:
diff changeset
652 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 int number_of_marked_CodeBlobs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // Deoptimize all methods of the evolving class itself
a61af66fc99e Initial load
duke
parents:
diff changeset
656 objArrayOop old_methods = dependee->methods();
a61af66fc99e Initial load
duke
parents:
diff changeset
657 for (int i = 0; i < old_methods->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
659 methodOop old_method = (methodOop) old_methods->obj_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 nmethod *nm = old_method->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
661 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 nm->mark_for_deoptimization();
a61af66fc99e Initial load
duke
parents:
diff changeset
663 number_of_marked_CodeBlobs++;
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 FOR_ALL_ALIVE_NMETHODS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 if (nm->is_marked_for_deoptimization()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // ...Already marked in the previous pass; don't count it again.
a61af66fc99e Initial load
duke
parents:
diff changeset
670 } else if (nm->is_evol_dependent_on(dependee())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
671 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
672 nm->mark_for_deoptimization();
a61af66fc99e Initial load
duke
parents:
diff changeset
673 number_of_marked_CodeBlobs++;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // flush caches in case they refer to a redefined methodOop
a61af66fc99e Initial load
duke
parents:
diff changeset
676 nm->clear_inline_caches();
a61af66fc99e Initial load
duke
parents:
diff changeset
677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 return number_of_marked_CodeBlobs;
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682 #endif // HOTSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Deoptimize all methods
a61af66fc99e Initial load
duke
parents:
diff changeset
686 void CodeCache::mark_all_nmethods_for_deoptimization() {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
688 FOR_ALL_ALIVE_NMETHODS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
689 nm->mark_for_deoptimization();
a61af66fc99e Initial load
duke
parents:
diff changeset
690 }
a61af66fc99e Initial load
duke
parents:
diff changeset
691 }
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 int CodeCache::mark_for_deoptimization(methodOop dependee) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 int number_of_marked_CodeBlobs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 FOR_ALL_ALIVE_NMETHODS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (nm->is_dependent_on_method(dependee)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 nm->mark_for_deoptimization();
a61af66fc99e Initial load
duke
parents:
diff changeset
702 number_of_marked_CodeBlobs++;
a61af66fc99e Initial load
duke
parents:
diff changeset
703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
705
a61af66fc99e Initial load
duke
parents:
diff changeset
706 return number_of_marked_CodeBlobs;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 void CodeCache::make_marked_nmethods_zombies() {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
711 FOR_ALL_ALIVE_NMETHODS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 if (nm->is_marked_for_deoptimization()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // If the nmethod has already been made non-entrant and it can be converted
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // then zombie it now. Otherwise make it non-entrant and it will eventually
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // be zombied when it is no longer seen on the stack. Note that the nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // might be "entrant" and not on the stack and so could be zombied immediately
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // but we can't tell because we don't track it on stack until it becomes
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // non-entrant.
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 if (nm->is_not_entrant() && nm->can_not_entrant_be_converted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 nm->make_zombie();
a61af66fc99e Initial load
duke
parents:
diff changeset
723 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
724 nm->make_not_entrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 void CodeCache::make_marked_nmethods_not_entrant() {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 assert_locked_or_safepoint(CodeCache_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
732 FOR_ALL_ALIVE_NMETHODS(nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 if (nm->is_marked_for_deoptimization()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
734 nm->make_not_entrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736 }
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 void CodeCache::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 _heap->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
741 FOR_ALL_ALIVE_BLOBS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 p->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
744 }
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 //------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // Non-product version
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 void CodeCache::verify_if_often() {
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (VerifyCodeCacheOften) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 _heap->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
757 void CodeCache::print_trace(const char* event, CodeBlob* cb, int size) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
758 if (PrintCodeCache2) { // Need to add a new flag
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
759 ResourceMark rm;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
760 if (size == 0) size = cb->size();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
761 tty->print_cr("CodeCache %s: addr: " INTPTR_FORMAT ", size: 0x%x", event, cb, size);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
762 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
763 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
764
0
a61af66fc99e Initial load
duke
parents:
diff changeset
765 void CodeCache::print_internals() {
a61af66fc99e Initial load
duke
parents:
diff changeset
766 int nmethodCount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 int runtimeStubCount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 int adapterCount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
769 int deoptimizationStubCount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 int uncommonTrapStubCount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
771 int bufferBlobCount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 int total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
773 int nmethodAlive = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
774 int nmethodNotEntrant = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
775 int nmethodZombie = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
776 int nmethodUnloaded = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
777 int nmethodJava = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
778 int nmethodNative = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
779 int maxCodeSize = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782 CodeBlob *cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 for (cb = first(); cb != NULL; cb = next(cb)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 total++;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 if (cb->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
786 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788 if (Verbose && nm->method() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
789 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 char *method_name = nm->method()->name_and_sig_as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
791 tty->print("%s", method_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 if(nm->is_alive()) { tty->print_cr(" alive"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
793 if(nm->is_not_entrant()) { tty->print_cr(" not-entrant"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
794 if(nm->is_zombie()) { tty->print_cr(" zombie"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 nmethodCount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 if(nm->is_alive()) { nmethodAlive++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
800 if(nm->is_not_entrant()) { nmethodNotEntrant++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
801 if(nm->is_zombie()) { nmethodZombie++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
802 if(nm->is_unloaded()) { nmethodUnloaded++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
803 if(nm->is_native_method()) { nmethodNative++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
804
a61af66fc99e Initial load
duke
parents:
diff changeset
805 if(nm->method() != NULL && nm->is_java_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 nmethodJava++;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 if(nm->code_size() > maxCodeSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
808 maxCodeSize = nm->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
811 } else if (cb->is_runtime_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 runtimeStubCount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
813 } else if (cb->is_deoptimization_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
814 deoptimizationStubCount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 } else if (cb->is_uncommon_trap_stub()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
816 uncommonTrapStubCount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 } else if (cb->is_adapter_blob()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 adapterCount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 } else if (cb->is_buffer_blob()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
820 bufferBlobCount++;
a61af66fc99e Initial load
duke
parents:
diff changeset
821 }
a61af66fc99e Initial load
duke
parents:
diff changeset
822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
823
a61af66fc99e Initial load
duke
parents:
diff changeset
824 int bucketSize = 512;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 int bucketLimit = maxCodeSize / bucketSize + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit);
a61af66fc99e Initial load
duke
parents:
diff changeset
827 memset(buckets,0,sizeof(int) * bucketLimit);
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 for (cb = first(); cb != NULL; cb = next(cb)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
830 if (cb->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
831 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
832 if(nm->is_java_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
833 buckets[nm->code_size() / bucketSize]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837 tty->print_cr("Code Cache Entries (total of %d)",total);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 tty->print_cr("-------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
839 tty->print_cr("nmethods: %d",nmethodCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 tty->print_cr("\talive: %d",nmethodAlive);
a61af66fc99e Initial load
duke
parents:
diff changeset
841 tty->print_cr("\tnot_entrant: %d",nmethodNotEntrant);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 tty->print_cr("\tzombie: %d",nmethodZombie);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 tty->print_cr("\tunloaded: %d",nmethodUnloaded);
a61af66fc99e Initial load
duke
parents:
diff changeset
844 tty->print_cr("\tjava: %d",nmethodJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
845 tty->print_cr("\tnative: %d",nmethodNative);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 tty->print_cr("runtime_stubs: %d",runtimeStubCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
847 tty->print_cr("adapters: %d",adapterCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
848 tty->print_cr("buffer blobs: %d",bufferBlobCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
849 tty->print_cr("deoptimization_stubs: %d",deoptimizationStubCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
850 tty->print_cr("uncommon_traps: %d",uncommonTrapStubCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
851 tty->print_cr("\nnmethod size distribution (non-zombie java)");
a61af66fc99e Initial load
duke
parents:
diff changeset
852 tty->print_cr("-------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 for(int i=0; i<bucketLimit; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
855 if(buckets[i] != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
856 tty->print("%d - %d bytes",i*bucketSize,(i+1)*bucketSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
857 tty->fill_to(40);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 tty->print_cr("%d",buckets[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
860 }
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 FREE_C_HEAP_ARRAY(int, buckets);
a61af66fc99e Initial load
duke
parents:
diff changeset
863 }
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 void CodeCache::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
866 CodeBlob_sizes live;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 CodeBlob_sizes dead;
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 FOR_ALL_BLOBS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
870 if (!p->is_alive()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
871 dead.add(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
872 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 live.add(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 tty->print_cr("CodeCache:");
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 tty->print_cr("nmethod dependency checking time %f", dependentCheckTime.seconds(),
a61af66fc99e Initial load
duke
parents:
diff changeset
880 dependentCheckTime.seconds() / dependentCheckCount);
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 if (!live.is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
883 live.print("live");
a61af66fc99e Initial load
duke
parents:
diff changeset
884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
885 if (!dead.is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 dead.print("dead");
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // print the oop_map usage
a61af66fc99e Initial load
duke
parents:
diff changeset
892 int code_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
893 int number_of_blobs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 int number_of_oop_maps = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 int map_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
896 FOR_ALL_BLOBS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
897 if (p->is_alive()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
898 number_of_blobs++;
a61af66fc99e Initial load
duke
parents:
diff changeset
899 code_size += p->instructions_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
900 OopMapSet* set = p->oop_maps();
a61af66fc99e Initial load
duke
parents:
diff changeset
901 if (set != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
902 number_of_oop_maps += set->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
903 map_size += set->heap_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
906 }
a61af66fc99e Initial load
duke
parents:
diff changeset
907 tty->print_cr("OopMaps");
a61af66fc99e Initial load
duke
parents:
diff changeset
908 tty->print_cr(" #blobs = %d", number_of_blobs);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 tty->print_cr(" code size = %d", code_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 tty->print_cr(" #oop_maps = %d", number_of_oop_maps);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 tty->print_cr(" map size = %d", map_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
912 }
a61af66fc99e Initial load
duke
parents:
diff changeset
913
a61af66fc99e Initial load
duke
parents:
diff changeset
914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 #endif // PRODUCT