src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp

Wed, 23 Dec 2009 09:23:54 -0800

author
ysr
date
Wed, 23 Dec 2009 09:23:54 -0800
changeset 1580
e018e6884bd8
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6631166: CMS: better heuristics when combatting fragmentation
Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking.
Reviewed-by: jmasa

duke@435 1 /*
duke@435 2 * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 # include "incls/_precompiled.incl"
duke@435 26 # include "incls/_cmsCollectorPolicy.cpp.incl"
duke@435 27
duke@435 28 //
duke@435 29 // ConcurrentMarkSweepPolicy methods
duke@435 30 //
duke@435 31
duke@435 32 ConcurrentMarkSweepPolicy::ConcurrentMarkSweepPolicy() {
duke@435 33 initialize_all();
duke@435 34 }
duke@435 35
duke@435 36 void ConcurrentMarkSweepPolicy::initialize_generations() {
duke@435 37 initialize_perm_generation(PermGen::ConcurrentMarkSweep);
duke@435 38 _generations = new GenerationSpecPtr[number_of_generations()];
duke@435 39 if (_generations == NULL)
duke@435 40 vm_exit_during_initialization("Unable to allocate gen spec");
duke@435 41
duke@435 42 if (UseParNewGC && ParallelGCThreads > 0) {
duke@435 43 if (UseAdaptiveSizePolicy) {
duke@435 44 _generations[0] = new GenerationSpec(Generation::ASParNew,
duke@435 45 _initial_gen0_size, _max_gen0_size);
duke@435 46 } else {
duke@435 47 _generations[0] = new GenerationSpec(Generation::ParNew,
duke@435 48 _initial_gen0_size, _max_gen0_size);
duke@435 49 }
duke@435 50 } else {
duke@435 51 _generations[0] = new GenerationSpec(Generation::DefNew,
duke@435 52 _initial_gen0_size, _max_gen0_size);
duke@435 53 }
duke@435 54 if (UseAdaptiveSizePolicy) {
duke@435 55 _generations[1] = new GenerationSpec(Generation::ASConcurrentMarkSweep,
duke@435 56 _initial_gen1_size, _max_gen1_size);
duke@435 57 } else {
duke@435 58 _generations[1] = new GenerationSpec(Generation::ConcurrentMarkSweep,
duke@435 59 _initial_gen1_size, _max_gen1_size);
duke@435 60 }
duke@435 61
duke@435 62 if (_generations[0] == NULL || _generations[1] == NULL) {
duke@435 63 vm_exit_during_initialization("Unable to allocate gen spec");
duke@435 64 }
duke@435 65 }
duke@435 66
duke@435 67 void ConcurrentMarkSweepPolicy::initialize_size_policy(size_t init_eden_size,
duke@435 68 size_t init_promo_size,
duke@435 69 size_t init_survivor_size) {
duke@435 70 double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;
duke@435 71 double max_gc_pause_sec = ((double) MaxGCPauseMillis)/1000.0;
duke@435 72 _size_policy = new CMSAdaptiveSizePolicy(init_eden_size,
duke@435 73 init_promo_size,
duke@435 74 init_survivor_size,
duke@435 75 max_gc_minor_pause_sec,
duke@435 76 max_gc_pause_sec,
duke@435 77 GCTimeRatio);
duke@435 78 }
duke@435 79
duke@435 80 void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
duke@435 81 // initialize the policy counters - 2 collectors, 3 generations
duke@435 82 if (UseParNewGC && ParallelGCThreads > 0) {
duke@435 83 _gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 3);
duke@435 84 }
duke@435 85 else {
duke@435 86 _gc_policy_counters = new GCPolicyCounters("Copy:CMS", 2, 3);
duke@435 87 }
duke@435 88 }
duke@435 89
duke@435 90 // Returns true if the incremental mode is enabled.
duke@435 91 bool ConcurrentMarkSweepPolicy::has_soft_ended_eden()
duke@435 92 {
duke@435 93 return CMSIncrementalMode;
duke@435 94 }
duke@435 95
duke@435 96
duke@435 97 //
duke@435 98 // ASConcurrentMarkSweepPolicy methods
duke@435 99 //
duke@435 100
duke@435 101 void ASConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
duke@435 102
duke@435 103 assert(size_policy() != NULL, "A size policy is required");
duke@435 104 // initialize the policy counters - 2 collectors, 3 generations
duke@435 105 if (UseParNewGC && ParallelGCThreads > 0) {
duke@435 106 _gc_policy_counters = new CMSGCAdaptivePolicyCounters("ParNew:CMS", 2, 3,
duke@435 107 size_policy());
duke@435 108 }
duke@435 109 else {
duke@435 110 _gc_policy_counters = new CMSGCAdaptivePolicyCounters("Copy:CMS", 2, 3,
duke@435 111 size_policy());
duke@435 112 }
duke@435 113 }

mercurial