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

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

author
ysr
date
Wed, 23 Dec 2009 09:23:54 -0800
changeset 1580
e018e6884bd8
parent 574
c0492d52d55b
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/_cmsPermGen.cpp.incl"
duke@435 27
duke@435 28 CMSPermGen::CMSPermGen(ReservedSpace rs, size_t initial_byte_size,
duke@435 29 CardTableRS* ct,
duke@435 30 FreeBlockDictionary::DictionaryChoice dictionaryChoice) {
duke@435 31 CMSPermGenGen* g =
duke@435 32 new CMSPermGenGen(rs, initial_byte_size, -1, ct);
duke@435 33 if (g == NULL) {
duke@435 34 vm_exit_during_initialization("Could not allocate a CompactingPermGen");
duke@435 35 }
duke@435 36
duke@435 37 g->initialize_performance_counters();
duke@435 38
duke@435 39 _gen = g;
duke@435 40 }
duke@435 41
duke@435 42 HeapWord* CMSPermGen::mem_allocate(size_t size) {
duke@435 43 Mutex* lock = _gen->freelistLock();
duke@435 44 bool lock_owned = lock->owned_by_self();
duke@435 45 if (lock_owned) {
duke@435 46 MutexUnlocker mul(lock);
apetrusenko@574 47 return mem_allocate_in_gen(size, _gen);
duke@435 48 } else {
apetrusenko@574 49 return mem_allocate_in_gen(size, _gen);
duke@435 50 }
duke@435 51 }
duke@435 52
duke@435 53 void CMSPermGen::compute_new_size() {
duke@435 54 _gen->compute_new_size();
duke@435 55 }
duke@435 56
duke@435 57 void CMSPermGenGen::initialize_performance_counters() {
duke@435 58
duke@435 59 const char* gen_name = "perm";
duke@435 60
duke@435 61 // Generation Counters - generation 2, 1 subspace
duke@435 62 _gen_counters = new GenerationCounters(gen_name, 2, 1, &_virtual_space);
duke@435 63
duke@435 64 _gc_counters = NULL;
duke@435 65
duke@435 66 _space_counters = new GSpaceCounters(gen_name, 0,
duke@435 67 _virtual_space.reserved_size(),
duke@435 68 this, _gen_counters);
duke@435 69 }

mercurial