8024954: CMS: CMSClassUnloadingMaxInterval is not implemented correctly. This change is also part of the fix for 8024483.
Reviewed-by: mgerdin, brutisso, tschatzl
Contributed-by: jwha@google.com
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Nov 07 15:17:10 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Oct 16 15:14:37 2013 -0700
@@ -594,9 +594,9 @@
_verification_mark_bm(0, Mutex::leaf + 1, "CMS_verification_mark_bm_lock"),
_completed_initialization(false),
_collector_policy(cp),
- _should_unload_classes(false),
+ _should_unload_classes(CMSClassUnloadingEnabled),
_concurrent_cycles_since_last_unload(0),
- _roots_scanning_options(0),
+ _roots_scanning_options(SharedHeap::SO_None),
_inter_sweep_estimate(CMS_SweepWeight, CMS_SweepPadding),
_intra_sweep_estimate(CMS_SweepWeight, CMS_SweepPadding),
_gc_tracer_cm(new (ResourceObj::C_HEAP, mtGC) CMSTracer()),
@@ -788,14 +788,6 @@
&& _survivor_chunk_index == 0),
"Error");
- // Choose what strong roots should be scanned depending on verification options
- if (!CMSClassUnloadingEnabled) {
- // If class unloading is disabled we want to include all classes into the root set.
- add_root_scanning_option(SharedHeap::SO_AllClasses);
- } else {
- add_root_scanning_option(SharedHeap::SO_SystemClasses);
- }
-
NOT_PRODUCT(_overflow_counter = CMSMarkStackOverflowInterval;)
_gc_counters = new CollectorCounters("CMS", 1);
_completed_initialization = true;
@@ -3310,7 +3302,10 @@
|| VerifyBeforeExit;
const int rso = SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
+ // We set the proper root for this CMS cycle here.
if (should_unload_classes()) { // Should unload classes this cycle
+ remove_root_scanning_option(SharedHeap::SO_AllClasses);
+ add_root_scanning_option(SharedHeap::SO_SystemClasses);
remove_root_scanning_option(rso); // Shrink the root set appropriately
set_verifying(should_verify); // Set verification state for this cycle
return; // Nothing else needs to be done at this time
@@ -3318,6 +3313,9 @@
// Not unloading classes this cycle
assert(!should_unload_classes(), "Inconsitency!");
+ remove_root_scanning_option(SharedHeap::SO_SystemClasses);
+ add_root_scanning_option(SharedHeap::SO_AllClasses);
+
if ((!verifying() || unloaded_classes_last_cycle()) && should_verify) {
// Include symbols, strings and code cache elements to prevent their resurrection.
add_root_scanning_option(rso);