annotate src/share/vm/code/codeCache.cpp @ 20543:e7d0505c8a30

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