annotate src/share/vm/code/codeCache.cpp @ 3992:d1bdeef3e3e2

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