annotate src/share/vm/gc_interface/collectedHeap.inline.hpp @ 4181:319860ae697a

Simplify FrameMap: make offsets of spill slots and outgoing parameters independent so that they can be allocated at the same time, eliminating the separate phases. This makes the separate StackBlock unnecesary. Change CiStackSlot to use byte offsets instead of spill slot index. This makes CiTarget.spillSlotSize unnecessary.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Mon, 02 Jan 2012 14:16:08 -0800
parents a92cdbac8b9e
children 9a9bb0010c91
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
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: 579
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "memory/threadLocalAllocBuffer.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/universe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "oops/arrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/thread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "services/lowMemoryDetector.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "utilities/copy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
43 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
45 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3892
diff changeset
46 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3892
diff changeset
47 # include "thread_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3892
diff changeset
48 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
49
0
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Inline allocation implementations.
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 void CollectedHeap::post_allocation_setup_common(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
53 HeapWord* obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
54 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 post_allocation_setup_no_klass_install(klass, obj, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 post_allocation_install_obj_klass(klass, oop(obj), (int) size);
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 void CollectedHeap::post_allocation_setup_no_klass_install(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
60 HeapWord* objPtr,
a61af66fc99e Initial load
duke
parents:
diff changeset
61 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
62 oop obj = (oop)objPtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 assert(obj != NULL, "NULL object pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
65 if (UseBiasedLocking && (klass() != NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 obj->set_mark(klass->prototype_header());
a61af66fc99e Initial load
duke
parents:
diff changeset
67 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // May be bootstrapping
a61af66fc99e Initial load
duke
parents:
diff changeset
69 obj->set_mark(markOopDesc::prototype());
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void CollectedHeap::post_allocation_install_obj_klass(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
74 oop obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
75 int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // These asserts are kind of complicated because of klassKlass
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // and the beginning of the world.
a61af66fc99e Initial load
duke
parents:
diff changeset
78 assert(klass() != NULL || !Universe::is_fully_initialized(), "NULL klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
79 assert(klass() == NULL || klass()->is_klass(), "not a klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
80 assert(klass() == NULL || klass()->klass_part() != NULL, "not a klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
81 assert(obj != NULL, "NULL object pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
82 obj->set_klass(klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
83 assert(!Universe::is_fully_initialized() || obj->blueprint() != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
84 "missing blueprint");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
85 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
86
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
87 // Support for jvmti and dtrace
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
88 inline void post_allocation_notify(KlassHandle klass, oop obj) {
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
89 // support low memory notifications (no-op if not enabled)
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
90 LowMemoryDetector::detect_low_memory_for_collected_pools();
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
91
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // support for JVMTI VMObjectAlloc event (no-op if not enabled)
a61af66fc99e Initial load
duke
parents:
diff changeset
93 JvmtiExport::vm_object_alloc_event_collector(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 if (DTraceAllocProbes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // support for Dtrace object alloc event (no-op most of the time)
a61af66fc99e Initial load
duke
parents:
diff changeset
97 if (klass() != NULL && klass()->klass_part()->name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 SharedRuntime::dtrace_object_alloc(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 void CollectedHeap::post_allocation_setup_obj(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
104 HeapWord* obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
105 size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 post_allocation_setup_common(klass, obj, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert(Universe::is_bootstrapping() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
108 !((oop)obj)->blueprint()->oop_is_array(), "must not be an array");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
109 // notify jvmti and dtrace
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
110 post_allocation_notify(klass, (oop)obj);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void CollectedHeap::post_allocation_setup_array(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 HeapWord* obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
116 int length) {
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
117 // Set array length before setting the _klass field
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
118 // in post_allocation_setup_common() because the klass field
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
119 // indicates that the object is parsable by concurrent GC.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 assert(length >= 0, "length should be non-negative");
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
121 ((arrayOop)obj)->set_length(length);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
122 post_allocation_setup_common(klass, obj, size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 assert(((oop)obj)->blueprint()->oop_is_array(), "must be an array");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
124 // notify jvmti and dtrace (must be after length is set for dtrace)
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
125 post_allocation_notify(klass, (oop)obj);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127
3774
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 2100
diff changeset
128 HeapWord* CollectedHeap::common_mem_allocate_noinit(size_t size, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Clear unhandled oops for memory allocation. Memory allocation might
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // not take out a lock if from tlab, so clear here.
a61af66fc99e Initial load
duke
parents:
diff changeset
132 CHECK_UNHANDLED_OOPS_ONLY(THREAD->clear_unhandled_oops();)
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 NOT_PRODUCT(guarantee(false, "Should not allocate with exception pending"));
a61af66fc99e Initial load
duke
parents:
diff changeset
136 return NULL; // caller does a CHECK_0 too
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 HeapWord* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 if (UseTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 result = CollectedHeap::allocate_from_tlab(THREAD, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
142 if (result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 assert(!HAS_PENDING_EXCEPTION,
a61af66fc99e Initial load
duke
parents:
diff changeset
144 "Unexpected exception, will result in uninitialized storage");
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
148 bool gc_overhead_limit_was_exceeded = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
149 result = Universe::heap()->mem_allocate(size,
a61af66fc99e Initial load
duke
parents:
diff changeset
150 &gc_overhead_limit_was_exceeded);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 if (result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 NOT_PRODUCT(Universe::heap()->
a61af66fc99e Initial load
duke
parents:
diff changeset
153 check_for_non_bad_heap_word_value(result, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
154 assert(!HAS_PENDING_EXCEPTION,
a61af66fc99e Initial load
duke
parents:
diff changeset
155 "Unexpected exception, will result in uninitialized storage");
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
156 THREAD->incr_allocated_bytes(size * HeapWordSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 if (!gc_overhead_limit_was_exceeded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
a61af66fc99e Initial load
duke
parents:
diff changeset
163 report_java_out_of_memory("Java heap space");
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if (JvmtiExport::should_post_resource_exhausted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 JvmtiExport::post_resource_exhausted(
a61af66fc99e Initial load
duke
parents:
diff changeset
167 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 "Java heap space");
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 THROW_OOP_0(Universe::out_of_memory_error_java_heap());
a61af66fc99e Initial load
duke
parents:
diff changeset
172 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
a61af66fc99e Initial load
duke
parents:
diff changeset
174 report_java_out_of_memory("GC overhead limit exceeded");
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 if (JvmtiExport::should_post_resource_exhausted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 JvmtiExport::post_resource_exhausted(
a61af66fc99e Initial load
duke
parents:
diff changeset
178 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
a61af66fc99e Initial load
duke
parents:
diff changeset
179 "GC overhead limit exceeded");
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 THROW_OOP_0(Universe::out_of_memory_error_gc_overhead_limit());
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185
3774
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 2100
diff changeset
186 HeapWord* CollectedHeap::common_mem_allocate_init(size_t size, TRAPS) {
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 2100
diff changeset
187 HeapWord* obj = common_mem_allocate_noinit(size, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 init_obj(obj, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Need to investigate, do we really want to throw OOM exception here?
a61af66fc99e Initial load
duke
parents:
diff changeset
193 HeapWord* CollectedHeap::common_permanent_mem_allocate_noinit(size_t size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 NOT_PRODUCT(guarantee(false, "Should not allocate with exception pending"));
a61af66fc99e Initial load
duke
parents:
diff changeset
196 return NULL; // caller does a CHECK_NULL too
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (CIFireOOMAt > 0 && THREAD->is_Compiler_thread() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
201 ++_fire_out_of_memory_count >= CIFireOOMAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // For testing of OOM handling in the CI throw an OOM and see how
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // it does. Historically improper handling of these has resulted
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // in crashes which we really don't want to have in the CI.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 THROW_OOP_0(Universe::out_of_memory_error_perm_gen());
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 HeapWord* result = Universe::heap()->permanent_mem_allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if (result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 NOT_PRODUCT(Universe::heap()->
a61af66fc99e Initial load
duke
parents:
diff changeset
212 check_for_non_bad_heap_word_value(result, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
213 assert(!HAS_PENDING_EXCEPTION,
a61af66fc99e Initial load
duke
parents:
diff changeset
214 "Unexpected exception, will result in uninitialized storage");
a61af66fc99e Initial load
duke
parents:
diff changeset
215 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
a61af66fc99e Initial load
duke
parents:
diff changeset
218 report_java_out_of_memory("PermGen space");
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 if (JvmtiExport::should_post_resource_exhausted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 JvmtiExport::post_resource_exhausted(
a61af66fc99e Initial load
duke
parents:
diff changeset
222 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR,
a61af66fc99e Initial load
duke
parents:
diff changeset
223 "PermGen space");
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 THROW_OOP_0(Universe::out_of_memory_error_perm_gen());
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 HeapWord* CollectedHeap::common_permanent_mem_allocate_init(size_t size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 HeapWord* obj = common_permanent_mem_allocate_noinit(size, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 init_obj(obj, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 HeapWord* CollectedHeap::allocate_from_tlab(Thread* thread, size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 assert(UseTLAB, "should use UseTLAB");
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 HeapWord* obj = thread->tlab().allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 if (obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
243 return allocate_from_tlab_slow(thread, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void CollectedHeap::init_obj(HeapWord* obj, size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 assert(obj != NULL, "cannot initialize NULL object");
a61af66fc99e Initial load
duke
parents:
diff changeset
248 const size_t hs = oopDesc::header_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 assert(size >= hs, "unexpected object size");
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
250 ((oop)obj)->set_klass_gap(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
251 Copy::fill_to_aligned_words(obj + hs, size - hs);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 oop CollectedHeap::obj_allocate(KlassHandle klass, int size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 debug_only(check_for_valid_allocation_state());
a61af66fc99e Initial load
duke
parents:
diff changeset
256 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
257 assert(size >= 0, "int won't convert to size_t");
3774
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 2100
diff changeset
258 HeapWord* obj = common_mem_allocate_init(size, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 post_allocation_setup_obj(klass, obj, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
261 return (oop)obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 oop CollectedHeap::array_allocate(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
265 int size,
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int length,
a61af66fc99e Initial load
duke
parents:
diff changeset
267 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 debug_only(check_for_valid_allocation_state());
a61af66fc99e Initial load
duke
parents:
diff changeset
269 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
270 assert(size >= 0, "int won't convert to size_t");
3774
c9ca3f51cf41 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 2100
diff changeset
271 HeapWord* obj = common_mem_allocate_init(size, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 post_allocation_setup_array(klass, obj, size, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
274 return (oop)obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
3961
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
277 oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
278 int size,
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
279 int length,
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
280 TRAPS) {
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
281 debug_only(check_for_valid_allocation_state());
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
282 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
283 assert(size >= 0, "int won't convert to size_t");
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
284 HeapWord* obj = common_mem_allocate_noinit(size, CHECK_NULL);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
285 ((oop)obj)->set_klass_gap(0);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
286 post_allocation_setup_array(klass, obj, size, length);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
287 #ifndef PRODUCT
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
288 const size_t hs = oopDesc::header_size()+1;
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
289 Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs);
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
290 #endif
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
291 return (oop)obj;
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
292 }
a92cdbac8b9e 7081933: Use zeroing elimination optimization for large array
kvn
parents: 3960
diff changeset
293
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294 oop CollectedHeap::permanent_obj_allocate(KlassHandle klass, int size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 oop obj = permanent_obj_allocate_no_klass_install(klass, size, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
296 post_allocation_install_obj_klass(klass, obj, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
297 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value((HeapWord*) obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
298 size));
a61af66fc99e Initial load
duke
parents:
diff changeset
299 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 oop CollectedHeap::permanent_obj_allocate_no_klass_install(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
303 int size,
a61af66fc99e Initial load
duke
parents:
diff changeset
304 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 debug_only(check_for_valid_allocation_state());
a61af66fc99e Initial load
duke
parents:
diff changeset
306 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
307 assert(size >= 0, "int won't convert to size_t");
a61af66fc99e Initial load
duke
parents:
diff changeset
308 HeapWord* obj = common_permanent_mem_allocate_init(size, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 post_allocation_setup_no_klass_install(klass, obj, size);
3892
baf763f388e6 7059037: Use BIS for zeroing on T4
kvn
parents: 3774
diff changeset
310 #ifndef PRODUCT
baf763f388e6 7059037: Use BIS for zeroing on T4
kvn
parents: 3774
diff changeset
311 const size_t hs = oopDesc::header_size();
baf763f388e6 7059037: Use BIS for zeroing on T4
kvn
parents: 3774
diff changeset
312 Universe::heap()->check_for_bad_heap_word_value(obj+hs, size-hs);
baf763f388e6 7059037: Use BIS for zeroing on T4
kvn
parents: 3774
diff changeset
313 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314 return (oop)obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 oop CollectedHeap::permanent_array_allocate(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
318 int size,
a61af66fc99e Initial load
duke
parents:
diff changeset
319 int length,
a61af66fc99e Initial load
duke
parents:
diff changeset
320 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 debug_only(check_for_valid_allocation_state());
a61af66fc99e Initial load
duke
parents:
diff changeset
322 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
323 assert(size >= 0, "int won't convert to size_t");
a61af66fc99e Initial load
duke
parents:
diff changeset
324 HeapWord* obj = common_permanent_mem_allocate_init(size, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 post_allocation_setup_array(klass, obj, size, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
327 return (oop)obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Returns "TRUE" if "p" is a method oop in the
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // current heap with high probability. NOTE: The main
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // current consumers of this interface are Forte::
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // and ThreadProfiler::. In these cases, the
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // interpreter frame from which "p" came, may be
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // under construction when sampled asynchronously, so
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // the clients want to check that it represents a
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // valid method before using it. Nonetheless since
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // the clients do not typically lock out GC, the
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // predicate is_valid_method() is not stable, so
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // it is possible that by the time "p" is used, it
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // is no longer valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
342 inline bool CollectedHeap::is_valid_method(oop p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
343 return
a61af66fc99e Initial load
duke
parents:
diff changeset
344 p != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // Check whether it is aligned at a HeapWord boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
347 Space::is_aligned(p) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // Check whether "method" is in the allocated part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // permanent generation -- this needs to be checked before
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // p->klass() below to avoid a SEGV (but see below
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // for a potential window of vulnerability).
a61af66fc99e Initial load
duke
parents:
diff changeset
353 is_permanent((void*)p) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // See if GC is active; however, there is still an
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // apparently unavoidable window after this call
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // and before the client of this interface uses "p".
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // If the client chooses not to lock out GC, then
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // it's a risk the client must accept.
a61af66fc99e Initial load
duke
parents:
diff changeset
360 !is_gc_active() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // Check that p is a methodOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
363 p->klass() == Universe::methodKlassObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 inline bool
a61af66fc99e Initial load
duke
parents:
diff changeset
370 CollectedHeap::promotion_should_fail(volatile size_t* count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // Access to count is not atomic; the value does not have to be exact.
a61af66fc99e Initial load
duke
parents:
diff changeset
372 if (PromotionFailureALot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 const size_t gc_num = total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
374 const size_t elapsed_gcs = gc_num - _promotion_failure_alot_gc_number;
a61af66fc99e Initial load
duke
parents:
diff changeset
375 if (elapsed_gcs >= PromotionFailureALotInterval) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Test for unsigned arithmetic wrap-around.
a61af66fc99e Initial load
duke
parents:
diff changeset
377 if (++*count >= PromotionFailureALotCount) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 *count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 inline bool CollectedHeap::promotion_should_fail() {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 return promotion_should_fail(&_promotion_failure_alot_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 inline void CollectedHeap::reset_promotion_should_fail(volatile size_t* count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (PromotionFailureALot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 _promotion_failure_alot_gc_number = total_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
393 *count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 inline void CollectedHeap::reset_promotion_should_fail() {
a61af66fc99e Initial load
duke
parents:
diff changeset
398 reset_promotion_should_fail(&_promotion_failure_alot_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 #endif // #ifndef PRODUCT
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
401
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
402 #endif // SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_INLINE_HPP