< prev index next >

src/hotspot/share/gc/shared/adaptiveSizePolicy.cpp

Print this page
rev 52689 : 8213224: Move code related to GC threads calculation out of AdaptiveSizePolicy
Summary: Consolidate code related to GC threads calculation into a single class

*** 1,7 **** /* ! * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 22,43 **** * */ #include "precompiled.hpp" #include "gc/shared/adaptiveSizePolicy.hpp" - #include "gc/shared/collectorPolicy.hpp" #include "gc/shared/gcCause.hpp" #include "gc/shared/gcUtil.inline.hpp" #include "gc/shared/softRefPolicy.hpp" - #include "gc/shared/workgroup.hpp" #include "logging/log.hpp" #include "runtime/timer.hpp" - #include "utilities/ostream.hpp" elapsedTimer AdaptiveSizePolicy::_minor_timer; elapsedTimer AdaptiveSizePolicy::_major_timer; - bool AdaptiveSizePolicy::_debug_perturbation = false; // The throughput goal is implemented as // _throughput_goal = 1 - ( 1 / (1 + gc_cost_ratio)) // gc_cost_ratio is the ratio // application cost / gc cost --- 22,39 ----
*** 92,224 **** _minor_timer.start(); _young_gen_policy_is_ready = false; } - // If the number of GC threads was set on the command line, - // use it. - // Else - // Calculate the number of GC threads based on the number of Java threads. - // Calculate the number of GC threads based on the size of the heap. - // Use the larger. - - uint AdaptiveSizePolicy::calc_default_active_workers(uintx total_workers, - const uintx min_workers, - uintx active_workers, - uintx application_workers) { - // If the user has specifically set the number of - // GC threads, use them. - - // If the user has turned off using a dynamic number of GC threads - // or the users has requested a specific number, set the active - // number of workers to all the workers. - - uintx new_active_workers = total_workers; - uintx prev_active_workers = active_workers; - uintx active_workers_by_JT = 0; - uintx active_workers_by_heap_size = 0; - - // Always use at least min_workers but use up to - // GCThreadsPerJavaThreads * application threads. - active_workers_by_JT = - MAX2((uintx) GCWorkersPerJavaThread * application_workers, - min_workers); - - // Choose a number of GC threads based on the current size - // of the heap. This may be complicated because the size of - // the heap depends on factors such as the throughput goal. - // Still a large heap should be collected by more GC threads. - active_workers_by_heap_size = - MAX2((size_t) 2U, Universe::heap()->capacity() / HeapSizePerGCThread); - - uintx max_active_workers = - MAX2(active_workers_by_JT, active_workers_by_heap_size); - - new_active_workers = MIN2(max_active_workers, (uintx) total_workers); - - // Increase GC workers instantly but decrease them more - // slowly. - if (new_active_workers < prev_active_workers) { - new_active_workers = - MAX2(min_workers, (prev_active_workers + new_active_workers) / 2); - } - - // Check once more that the number of workers is within the limits. - assert(min_workers <= total_workers, "Minimum workers not consistent with total workers"); - assert(new_active_workers >= min_workers, "Minimum workers not observed"); - assert(new_active_workers <= total_workers, "Total workers not observed"); - - if (ForceDynamicNumberOfGCThreads) { - // Assume this is debugging and jiggle the number of GC threads. - if (new_active_workers == prev_active_workers) { - if (new_active_workers < total_workers) { - new_active_workers++; - } else if (new_active_workers > min_workers) { - new_active_workers--; - } - } - if (new_active_workers == total_workers) { - if (_debug_perturbation) { - new_active_workers = min_workers; - } - _debug_perturbation = !_debug_perturbation; - } - assert((new_active_workers <= ParallelGCThreads) && - (new_active_workers >= min_workers), - "Jiggled active workers too much"); - } - - log_trace(gc, task)("GCTaskManager::calc_default_active_workers() : " - "active_workers(): " UINTX_FORMAT " new_active_workers: " UINTX_FORMAT " " - "prev_active_workers: " UINTX_FORMAT "\n" - " active_workers_by_JT: " UINTX_FORMAT " active_workers_by_heap_size: " UINTX_FORMAT, - active_workers, new_active_workers, prev_active_workers, - active_workers_by_JT, active_workers_by_heap_size); - assert(new_active_workers > 0, "Always need at least 1"); - return new_active_workers; - } - - uint AdaptiveSizePolicy::calc_active_workers(uintx total_workers, - uintx active_workers, - uintx application_workers) { - // If the user has specifically set the number of - // GC threads, use them. - - // If the user has turned off using a dynamic number of GC threads - // or the users has requested a specific number, set the active - // number of workers to all the workers. - - uint new_active_workers; - if (!UseDynamicNumberOfGCThreads || - (!FLAG_IS_DEFAULT(ParallelGCThreads) && !ForceDynamicNumberOfGCThreads)) { - new_active_workers = total_workers; - } else { - uintx min_workers = (total_workers == 1) ? 1 : 2; - new_active_workers = calc_default_active_workers(total_workers, - min_workers, - active_workers, - application_workers); - } - assert(new_active_workers > 0, "Always need at least 1"); - return new_active_workers; - } - - uint AdaptiveSizePolicy::calc_active_conc_workers(uintx total_workers, - uintx active_workers, - uintx application_workers) { - if (!UseDynamicNumberOfGCThreads || - (!FLAG_IS_DEFAULT(ConcGCThreads) && !ForceDynamicNumberOfGCThreads)) { - return ConcGCThreads; - } else { - uint no_of_gc_threads = calc_default_active_workers(total_workers, - 1, /* Minimum number of workers */ - active_workers, - application_workers); - return no_of_gc_threads; - } - } - bool AdaptiveSizePolicy::tenuring_threshold_change() const { return decrement_tenuring_threshold_for_gc_cost() || increment_tenuring_threshold_for_gc_cost() || decrement_tenuring_threshold_for_survivor_limit(); } --- 88,97 ----
< prev index next >