Mercurial > hg > truffle
annotate src/share/vm/memory/permGen.cpp @ 2368:dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
6627787: CMS: JVM refuses to start up with -Xms16m -Xmx16m
7000125: CMS: Anti-monotone young gen sizing with respect to maximum whole heap size specification
7027529: CMS: retire CMSUseOldDefaults flag
Summary: Simplify CMS heap sizing code, relying on ergonomic initial sizing consistent with other collectors for the most part, controlling only young gen sizing to rein in pause times. Make CMS young gen sizing default statically cpu-dependant. Remove inconsistencies wrt generation sizing and policy code, allowing for the fixing for 6627787 and 7000125. For 7027529, retire the flag CMSUseOldDefaults which had been introduced as a bridge from JDK 5 to JDK 6 a number of years ago.
Reviewed-by: brutisso, poonam
author | ysr |
---|---|
date | Wed, 16 Mar 2011 10:37:08 -0700 |
parents | f95d63e2154a |
children |
rev | line source |
---|---|
0 | 1 /* |
1839
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
2 * Copyright (c) 2000, 2010, 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 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "gc_implementation/shared/cSpaceCounters.hpp" | |
27 #include "gc_implementation/shared/vmGCOperations.hpp" | |
28 #include "gc_interface/collectedHeap.inline.hpp" | |
29 #include "memory/blockOffsetTable.inline.hpp" | |
30 #include "memory/compactPermGen.hpp" | |
31 #include "memory/gcLocker.hpp" | |
32 #include "memory/gcLocker.inline.hpp" | |
33 #include "memory/genCollectedHeap.hpp" | |
34 #include "memory/generation.inline.hpp" | |
35 #include "memory/permGen.hpp" | |
36 #include "memory/universe.hpp" | |
37 #include "oops/oop.inline.hpp" | |
38 #include "runtime/java.hpp" | |
39 #include "runtime/vmThread.hpp" | |
0 | 40 |
1839
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
41 HeapWord* PermGen::request_expand_and_allocate(Generation* gen, size_t size, |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
42 GCCause::Cause prev_cause) { |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
43 if (gen->capacity() < _capacity_expansion_limit || |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
44 prev_cause != GCCause::_no_gc || UseG1GC) { // last disjunct is a temporary hack for G1 |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
45 return gen->expand_and_allocate(size, false); |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
46 } |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
47 // We have reached the limit of capacity expansion where |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
48 // we will not expand further until a GC is done; request denied. |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
49 return NULL; |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
50 } |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
51 |
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
|
52 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
|
53 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
|
54 GCCause::Cause prev_cause = GCCause::_no_gc; |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
55 unsigned int gc_count_before, full_gc_count_before; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
56 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
|
57 |
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 for (;;) { |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
59 { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
60 MutexLocker ml(Heap_lock); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
61 if ((obj = gen->allocate(size, false)) != NULL) { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
62 return obj; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
63 } |
1839
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
64 // Attempt to expand and allocate the requested space: |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
65 // specific subtypes may use specific policy to either expand |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
66 // or not. The default policy (see above) is to expand until |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
67 // _capacity_expansion_limit, and no further unless a GC is done. |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
68 // Concurrent collectors may decide to kick off a concurrent |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
69 // collection under appropriate conditions. |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
70 obj = request_expand_and_allocate(gen, size, prev_cause); |
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
71 |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
72 if (obj != NULL || prev_cause == GCCause::_last_ditch_collection) { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
73 return obj; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
74 } |
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
|
75 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
|
76 // 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
|
77 // 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
|
78 // 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
|
79 // 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
|
80 // 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
|
81 // 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
|
82 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
|
83 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
|
84 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
|
85 // 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
|
86 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
|
87 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
|
88 } 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
|
89 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
|
90 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
|
91 " 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
|
92 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
93 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
|
94 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
95 } |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
96 // Read the GC count while holding the Heap_lock |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
97 gc_count_before = SharedHeap::heap()->total_collections(); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
98 full_gc_count_before = SharedHeap::heap()->total_full_collections(); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
99 } |
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
|
100 |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
101 // Give up heap lock above, VMThread::execute below gets it back |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
102 VM_GenCollectForPermanentAllocation op(size, gc_count_before, full_gc_count_before, |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
103 next_cause); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
104 VMThread::execute(&op); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
105 if (!op.prologue_succeeded() || op.gc_locked()) { |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
106 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
|
107 continue; // retry and/or stall as necessary |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
108 } |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
109 obj = op.result(); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
110 assert(obj == NULL || SharedHeap::heap()->is_in_reserved(obj), |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
111 "result not in heap"); |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
112 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
|
113 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
|
114 } |
480
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
115 prev_cause = next_cause; |
d249b360e026
6782457: CMS: Livelock in CompactibleFreeListSpace::block_size()
ysr
parents:
196
diff
changeset
|
116 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
|
117 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
118 } |
c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents:
0
diff
changeset
|
119 |
0 | 120 CompactingPermGen::CompactingPermGen(ReservedSpace rs, |
121 ReservedSpace shared_rs, | |
122 size_t initial_byte_size, | |
123 GenRemSet* remset, | |
124 PermanentGenerationSpec* perm_spec) | |
125 { | |
126 CompactingPermGenGen* g = | |
127 new CompactingPermGenGen(rs, shared_rs, initial_byte_size, -1, remset, | |
128 NULL, perm_spec); | |
129 if (g == NULL) | |
130 vm_exit_during_initialization("Could not allocate a CompactingPermGen"); | |
131 _gen = g; | |
132 | |
133 g->initialize_performance_counters(); | |
134 | |
135 _capacity_expansion_limit = g->capacity() + MaxPermHeapExpansion; | |
136 } | |
137 | |
138 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
|
139 return mem_allocate_in_gen(size, _gen); |
0 | 140 } |
141 | |
142 void CompactingPermGen::compute_new_size() { | |
143 size_t desired_capacity = align_size_up(_gen->used(), MinPermHeapExpansion); | |
144 if (desired_capacity < PermSize) { | |
145 desired_capacity = PermSize; | |
146 } | |
147 if (_gen->capacity() > desired_capacity) { | |
148 _gen->shrink(_gen->capacity() - desired_capacity); | |
149 } | |
1839
e41cd7fd68a6
6794422: Perm gen expansion policy for concurrent collectors
ysr
parents:
1552
diff
changeset
|
150 set_capacity_expansion_limit(_gen->capacity() + MaxPermHeapExpansion); |
0 | 151 } |