Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp
38921 views
/*1* Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"26#include "gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp"27#include "gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp"28#include "gc_implementation/parNew/parNewGeneration.hpp"29#include "gc_implementation/shared/gcPolicyCounters.hpp"30#include "gc_implementation/shared/vmGCOperations.hpp"31#include "memory/cardTableRS.hpp"32#include "memory/collectorPolicy.hpp"33#include "memory/gcLocker.inline.hpp"34#include "memory/genCollectedHeap.hpp"35#include "memory/generationSpec.hpp"36#include "memory/space.hpp"37#include "memory/universe.hpp"38#include "runtime/arguments.hpp"39#include "runtime/globals_extension.hpp"40#include "runtime/handles.inline.hpp"41#include "runtime/java.hpp"42#include "runtime/thread.inline.hpp"43#include "runtime/vmThread.hpp"4445//46// ConcurrentMarkSweepPolicy methods47//4849void ConcurrentMarkSweepPolicy::initialize_alignments() {50_space_alignment = _gen_alignment = (uintx)Generation::GenGrain;51_heap_alignment = compute_heap_alignment();52}5354void ConcurrentMarkSweepPolicy::initialize_generations() {55_generations = NEW_C_HEAP_ARRAY3(GenerationSpecPtr, number_of_generations(), mtGC,56CURRENT_PC, AllocFailStrategy::RETURN_NULL);57if (_generations == NULL)58vm_exit_during_initialization("Unable to allocate gen spec");5960if (UseParNewGC) {61if (UseAdaptiveSizePolicy) {62_generations[0] = new GenerationSpec(Generation::ASParNew,63_initial_gen0_size, _max_gen0_size);64} else {65_generations[0] = new GenerationSpec(Generation::ParNew,66_initial_gen0_size, _max_gen0_size);67}68} else {69_generations[0] = new GenerationSpec(Generation::DefNew,70_initial_gen0_size, _max_gen0_size);71}72if (UseAdaptiveSizePolicy) {73_generations[1] = new GenerationSpec(Generation::ASConcurrentMarkSweep,74_initial_gen1_size, _max_gen1_size);75} else {76_generations[1] = new GenerationSpec(Generation::ConcurrentMarkSweep,77_initial_gen1_size, _max_gen1_size);78}7980if (_generations[0] == NULL || _generations[1] == NULL) {81vm_exit_during_initialization("Unable to allocate gen spec");82}83}8485void ConcurrentMarkSweepPolicy::initialize_size_policy(size_t init_eden_size,86size_t init_promo_size,87size_t init_survivor_size) {88double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;89double max_gc_pause_sec = ((double) MaxGCPauseMillis)/1000.0;90_size_policy = new CMSAdaptiveSizePolicy(init_eden_size,91init_promo_size,92init_survivor_size,93max_gc_minor_pause_sec,94max_gc_pause_sec,95GCTimeRatio);96}9798void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {99// initialize the policy counters - 2 collectors, 3 generations100if (UseParNewGC) {101_gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 3);102}103else {104_gc_policy_counters = new GCPolicyCounters("Copy:CMS", 2, 3);105}106}107108// Returns true if the incremental mode is enabled.109bool ConcurrentMarkSweepPolicy::has_soft_ended_eden()110{111return CMSIncrementalMode;112}113114115//116// ASConcurrentMarkSweepPolicy methods117//118119void ASConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {120121assert(size_policy() != NULL, "A size policy is required");122// initialize the policy counters - 2 collectors, 3 generations123if (UseParNewGC) {124_gc_policy_counters = new CMSGCAdaptivePolicyCounters("ParNew:CMS", 2, 3,125size_policy());126}127else {128_gc_policy_counters = new CMSGCAdaptivePolicyCounters("Copy:CMS", 2, 3,129size_policy());130}131}132133134