Mercurial > hg > graal-compiler
annotate src/share/vm/memory/permGen.cpp @ 1716:be3f9c242c9d
6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
Summary: GC workers now recognize an intermediate transient state of blocks which are allocated but have not yet completed initialization. blk_start() calls do not attempt to determine the size of a block in the transient state, rather waiting for the block to become initialized so that it is safe to query its size. Audited and ensured the order of initialization of object fields (klass, free bit and size) to respect block state transition protocol. Also included some new assertion checking code enabled in debug mode.
Reviewed-by: chrisphi, johnc, poonam
author | ysr |
---|---|
date | Mon, 16 Aug 2010 15:58:42 -0700 |
parents | c18cbe5936b8 |
children | e41cd7fd68a6 |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
579
diff
changeset
|
2 * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
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 | 22 * |
23 */ | |
24 | |
25 #include "incls/_precompiled.incl" | |
26 #include "incls/_permGen.cpp.incl" | |
27 | |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
28 HeapWord* PermGen::mem_allocate_in_gen(size_t size, Generation* gen) { |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
29 GCCause::Cause next_cause = GCCause::_permanent_generation_full; |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
30 GCCause::Cause prev_cause = GCCause::_no_gc; |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
31 unsigned int gc_count_before, full_gc_count_before; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
32 HeapWord* obj; |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
33 |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
34 for (;;) { |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
35 { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
36 MutexLocker ml(Heap_lock); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
37 if ((obj = gen->allocate(size, false)) != NULL) { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
38 return obj; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
39 } |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
40 if (gen->capacity() < _capacity_expansion_limit || |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
41 prev_cause != GCCause::_no_gc) { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
42 obj = gen->expand_and_allocate(size, false); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
43 } |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
44 if (obj != NULL || prev_cause == GCCause::_last_ditch_collection) { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
45 return obj; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
46 } |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
47 if (GC_locker::is_active_and_needs_gc()) { |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
48 // If this thread is not in a jni critical section, we stall |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
49 // the requestor until the critical section has cleared and |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
50 // GC allowed. When the critical section clears, a GC is |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
51 // initiated by the last thread exiting the critical section; so |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
52 // we retry the allocation sequence from the beginning of the loop, |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
53 // rather than causing more, now probably unnecessary, GC attempts. |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
54 JavaThread* jthr = JavaThread::current(); |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
55 if (!jthr->in_critical()) { |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
56 MutexUnlocker mul(Heap_lock); |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
57 // Wait for JNI critical section to be exited |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
58 GC_locker::stall_until_clear(); |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
59 continue; |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
60 } else { |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
61 if (CheckJNICalls) { |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
62 fatal("Possible deadlock due to allocating while" |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
63 " in jni critical section"); |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
64 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
65 return NULL; |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
66 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
67 } |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
68 // Read the GC count while holding the Heap_lock |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
69 gc_count_before = SharedHeap::heap()->total_collections(); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
70 full_gc_count_before = SharedHeap::heap()->total_full_collections(); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
71 } |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
72 |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
73 // Give up heap lock above, VMThread::execute below gets it back |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
74 VM_GenCollectForPermanentAllocation op(size, gc_count_before, full_gc_count_before, |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
75 next_cause); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
76 VMThread::execute(&op); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
77 if (!op.prologue_succeeded() || op.gc_locked()) { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
78 assert(op.result() == NULL, "must be NULL if gc_locked() is true"); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
79 continue; // retry and/or stall as necessary |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
80 } |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
81 obj = op.result(); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
82 assert(obj == NULL || SharedHeap::heap()->is_in_reserved(obj), |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
83 "result not in heap"); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
84 if (obj != NULL) { |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
85 return obj; |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
86 } |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
87 prev_cause = next_cause; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
88 next_cause = GCCause::_last_ditch_collection; |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
89 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
90 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
91 |
0 | 92 CompactingPermGen::CompactingPermGen(ReservedSpace rs, |
93 ReservedSpace shared_rs, | |
94 size_t initial_byte_size, | |
95 GenRemSet* remset, | |
96 PermanentGenerationSpec* perm_spec) | |
97 { | |
98 CompactingPermGenGen* g = | |
99 new CompactingPermGenGen(rs, shared_rs, initial_byte_size, -1, remset, | |
100 NULL, perm_spec); | |
101 if (g == NULL) | |
102 vm_exit_during_initialization("Could not allocate a CompactingPermGen"); | |
103 _gen = g; | |
104 | |
105 g->initialize_performance_counters(); | |
106 | |
107 _capacity_expansion_limit = g->capacity() + MaxPermHeapExpansion; | |
108 } | |
109 | |
110 HeapWord* CompactingPermGen::mem_allocate(size_t size) { | |
139
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
111 return mem_allocate_in_gen(size, _gen); |
0 | 112 } |
113 | |
114 void CompactingPermGen::compute_new_size() { | |
115 size_t desired_capacity = align_size_up(_gen->used(), MinPermHeapExpansion); | |
116 if (desired_capacity < PermSize) { | |
117 desired_capacity = PermSize; | |
118 } | |
119 if (_gen->capacity() > desired_capacity) { | |
120 _gen->shrink(_gen->capacity() - desired_capacity); | |
121 } | |
122 _capacity_expansion_limit = _gen->capacity() + MaxPermHeapExpansion; | |
123 } |