--- old/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp 2019-12-05 11:25:08.958283920 +0100 +++ new/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp 2019-12-05 11:25:08.601272844 +0100 @@ -48,119 +48,91 @@ { assert(max_gc_threads > 0, "Must have some GC threads"); - _gc_par_phases[GCWorkerStart] = new WorkerDataArray(max_gc_threads, "GC Worker Start (ms):"); - _gc_par_phases[ExtRootScan] = new WorkerDataArray(max_gc_threads, "Ext Root Scanning (ms):"); + _gc_par_phases[GCWorkerStart] = new WorkerDataArray("GC Worker Start (ms):", max_gc_threads); + _gc_par_phases[ExtRootScan] = new WorkerDataArray("Ext Root Scanning (ms):", max_gc_threads); // Root scanning phases - _gc_par_phases[ThreadRoots] = new WorkerDataArray(max_gc_threads, "Thread Roots (ms):"); - _gc_par_phases[UniverseRoots] = new WorkerDataArray(max_gc_threads, "Universe Roots (ms):"); - _gc_par_phases[JNIRoots] = new WorkerDataArray(max_gc_threads, "JNI Handles Roots (ms):"); - _gc_par_phases[ObjectSynchronizerRoots] = new WorkerDataArray(max_gc_threads, "ObjectSynchronizer Roots (ms):"); - _gc_par_phases[ManagementRoots] = new WorkerDataArray(max_gc_threads, "Management Roots (ms):"); - _gc_par_phases[SystemDictionaryRoots] = new WorkerDataArray(max_gc_threads, "SystemDictionary Roots (ms):"); - _gc_par_phases[CLDGRoots] = new WorkerDataArray(max_gc_threads, "CLDG Roots (ms):"); - _gc_par_phases[JVMTIRoots] = new WorkerDataArray(max_gc_threads, "JVMTI Roots (ms):"); - AOT_ONLY(_gc_par_phases[AOTCodeRoots] = new WorkerDataArray(max_gc_threads, "AOT Root Scan (ms):");) - _gc_par_phases[CMRefRoots] = new WorkerDataArray(max_gc_threads, "CM RefProcessor Roots (ms):"); - - _gc_par_phases[MergeER] = new WorkerDataArray(max_gc_threads, "Eager Reclaim (ms):"); - - _gc_par_phases[MergeRS] = new WorkerDataArray(max_gc_threads, "Remembered Sets (ms):"); - _merge_rs_merged_sparse = new WorkerDataArray(max_gc_threads, "Merged Sparse:"); - _gc_par_phases[MergeRS]->link_thread_work_items(_merge_rs_merged_sparse, MergeRSMergedSparse); - _merge_rs_merged_fine = new WorkerDataArray(max_gc_threads, "Merged Fine:"); - _gc_par_phases[MergeRS]->link_thread_work_items(_merge_rs_merged_fine, MergeRSMergedFine); - _merge_rs_merged_coarse = new WorkerDataArray(max_gc_threads, "Merged Coarse:"); - _gc_par_phases[MergeRS]->link_thread_work_items(_merge_rs_merged_coarse, MergeRSMergedCoarse); - _merge_rs_dirty_cards = new WorkerDataArray(max_gc_threads, "Dirty Cards:"); - _gc_par_phases[MergeRS]->link_thread_work_items(_merge_rs_dirty_cards, MergeRSDirtyCards); - - _gc_par_phases[OptMergeRS] = new WorkerDataArray(max_gc_threads, "Optional Remembered Sets (ms):"); - _opt_merge_rs_merged_sparse = new WorkerDataArray(max_gc_threads, "Merged Sparse:"); - _gc_par_phases[OptMergeRS]->link_thread_work_items(_opt_merge_rs_merged_sparse, MergeRSMergedSparse); - _opt_merge_rs_merged_fine = new WorkerDataArray(max_gc_threads, "Merged Fine:"); - _gc_par_phases[OptMergeRS]->link_thread_work_items(_opt_merge_rs_merged_fine, MergeRSMergedFine); - _opt_merge_rs_merged_coarse = new WorkerDataArray(max_gc_threads, "Merged Coarse:"); - _gc_par_phases[OptMergeRS]->link_thread_work_items(_opt_merge_rs_merged_coarse, MergeRSMergedCoarse); - _opt_merge_rs_dirty_cards = new WorkerDataArray(max_gc_threads, "Dirty Cards:"); - _gc_par_phases[OptMergeRS]->link_thread_work_items(_opt_merge_rs_dirty_cards, MergeRSDirtyCards); + _gc_par_phases[ThreadRoots] = new WorkerDataArray("Thread Roots (ms):", max_gc_threads); + _gc_par_phases[UniverseRoots] = new WorkerDataArray("Universe Roots (ms):", max_gc_threads); + _gc_par_phases[JNIRoots] = new WorkerDataArray("JNI Handles Roots (ms):", max_gc_threads); + _gc_par_phases[ObjectSynchronizerRoots] = new WorkerDataArray("ObjectSynchronizer Roots (ms):", max_gc_threads); + _gc_par_phases[ManagementRoots] = new WorkerDataArray("Management Roots (ms):", max_gc_threads); + _gc_par_phases[SystemDictionaryRoots] = new WorkerDataArray("SystemDictionary Roots (ms):", max_gc_threads); + _gc_par_phases[CLDGRoots] = new WorkerDataArray("CLDG Roots (ms):", max_gc_threads); + _gc_par_phases[JVMTIRoots] = new WorkerDataArray("JVMTI Roots (ms):", max_gc_threads); + AOT_ONLY(_gc_par_phases[AOTCodeRoots] = new WorkerDataArray("AOT Root Scan (ms):", max_gc_threads);) + _gc_par_phases[CMRefRoots] = new WorkerDataArray("CM RefProcessor Roots (ms):", max_gc_threads); + + _gc_par_phases[MergeER] = new WorkerDataArray("Eager Reclaim (ms):", max_gc_threads); + + _gc_par_phases[MergeRS] = new WorkerDataArray("Remembered Sets (ms):", max_gc_threads); + _gc_par_phases[MergeRS]->create_thread_work_items("Merged Sparse:", MergeRSMergedSparse); + _gc_par_phases[MergeRS]->create_thread_work_items("Merged Fine:", MergeRSMergedFine); + _gc_par_phases[MergeRS]->create_thread_work_items("Merged Coarse:", MergeRSMergedCoarse); + _gc_par_phases[MergeRS]->create_thread_work_items("Dirty Cards:", MergeRSDirtyCards); + + _gc_par_phases[OptMergeRS] = new WorkerDataArray("Optional Remembered Sets (ms):", max_gc_threads); + _gc_par_phases[OptMergeRS]->create_thread_work_items("Merged Sparse:", MergeRSMergedSparse); + _gc_par_phases[OptMergeRS]->create_thread_work_items("Merged Fine:", MergeRSMergedFine); + _gc_par_phases[OptMergeRS]->create_thread_work_items("Merged Coarse:", MergeRSMergedCoarse); + _gc_par_phases[OptMergeRS]->create_thread_work_items("Dirty Cards:", MergeRSDirtyCards); - _gc_par_phases[MergeLB] = new WorkerDataArray(max_gc_threads, "Log Buffers (ms):"); + _gc_par_phases[MergeLB] = new WorkerDataArray("Log Buffers (ms):", max_gc_threads); if (G1HotCardCache::default_use_cache()) { - _gc_par_phases[MergeHCC] = new WorkerDataArray(max_gc_threads, "Hot Card Cache (ms):"); - _merge_hcc_dirty_cards = new WorkerDataArray(max_gc_threads, "Dirty Cards:"); - _gc_par_phases[MergeHCC]->link_thread_work_items(_merge_hcc_dirty_cards, MergeHCCDirtyCards); - _merge_hcc_skipped_cards = new WorkerDataArray(max_gc_threads, "Skipped Cards:"); - _gc_par_phases[MergeHCC]->link_thread_work_items(_merge_hcc_skipped_cards, MergeHCCSkippedCards); + _gc_par_phases[MergeHCC] = new WorkerDataArray("Hot Card Cache (ms):", max_gc_threads); + _gc_par_phases[MergeHCC]->create_thread_work_items("Dirty Cards:", MergeHCCDirtyCards); + _gc_par_phases[MergeHCC]->create_thread_work_items("Skipped Cards:", MergeHCCSkippedCards); } else { _gc_par_phases[MergeHCC] = NULL; - _merge_hcc_dirty_cards = NULL; - _merge_hcc_skipped_cards = NULL; } - _gc_par_phases[ScanHR] = new WorkerDataArray(max_gc_threads, "Scan Heap Roots (ms):"); - _gc_par_phases[OptScanHR] = new WorkerDataArray(max_gc_threads, "Optional Scan Heap Roots (ms):"); - _gc_par_phases[CodeRoots] = new WorkerDataArray(max_gc_threads, "Code Root Scan (ms):"); - _gc_par_phases[OptCodeRoots] = new WorkerDataArray(max_gc_threads, "Optional Code Root Scan (ms):"); - _gc_par_phases[ObjCopy] = new WorkerDataArray(max_gc_threads, "Object Copy (ms):"); - _gc_par_phases[OptObjCopy] = new WorkerDataArray(max_gc_threads, "Optional Object Copy (ms):"); - _gc_par_phases[Termination] = new WorkerDataArray(max_gc_threads, "Termination (ms):"); - _gc_par_phases[OptTermination] = new WorkerDataArray(max_gc_threads, "Optional Termination (ms):"); - _gc_par_phases[GCWorkerTotal] = new WorkerDataArray(max_gc_threads, "GC Worker Total (ms):"); - _gc_par_phases[GCWorkerEnd] = new WorkerDataArray(max_gc_threads, "GC Worker End (ms):"); - _gc_par_phases[Other] = new WorkerDataArray(max_gc_threads, "GC Worker Other (ms):"); - - _scan_hr_scanned_cards = new WorkerDataArray(max_gc_threads, "Scanned Cards:"); - _gc_par_phases[ScanHR]->link_thread_work_items(_scan_hr_scanned_cards, ScanHRScannedCards); - _scan_hr_scanned_blocks = new WorkerDataArray(max_gc_threads, "Scanned Blocks:"); - _gc_par_phases[ScanHR]->link_thread_work_items(_scan_hr_scanned_blocks, ScanHRScannedBlocks); - _scan_hr_claimed_chunks = new WorkerDataArray(max_gc_threads, "Claimed Chunks:"); - _gc_par_phases[ScanHR]->link_thread_work_items(_scan_hr_claimed_chunks, ScanHRClaimedChunks); - - _opt_scan_hr_scanned_cards = new WorkerDataArray(max_gc_threads, "Scanned Cards:"); - _gc_par_phases[OptScanHR]->link_thread_work_items(_opt_scan_hr_scanned_cards, ScanHRScannedCards); - _opt_scan_hr_scanned_blocks = new WorkerDataArray(max_gc_threads, "Scanned Blocks:"); - _gc_par_phases[OptScanHR]->link_thread_work_items(_opt_scan_hr_scanned_blocks, ScanHRScannedBlocks); - _opt_scan_hr_claimed_chunks = new WorkerDataArray(max_gc_threads, "Claimed Chunks:"); - _gc_par_phases[OptScanHR]->link_thread_work_items(_opt_scan_hr_claimed_chunks, ScanHRClaimedChunks); - _opt_scan_hr_scanned_opt_refs = new WorkerDataArray(max_gc_threads, "Scanned Refs:"); - _gc_par_phases[OptScanHR]->link_thread_work_items(_opt_scan_hr_scanned_opt_refs, ScanHRScannedOptRefs); - _opt_scan_hr_used_memory = new WorkerDataArray(max_gc_threads, "Used Memory:"); - _gc_par_phases[OptScanHR]->link_thread_work_items(_opt_scan_hr_used_memory, ScanHRUsedMemory); - - _merge_lb_dirty_cards = new WorkerDataArray(max_gc_threads, "Dirty Cards:"); - _gc_par_phases[MergeLB]->link_thread_work_items(_merge_lb_dirty_cards, MergeLBDirtyCards); - _merge_lb_skipped_cards = new WorkerDataArray(max_gc_threads, "Skipped Cards:"); - _gc_par_phases[MergeLB]->link_thread_work_items(_merge_lb_skipped_cards, MergeLBSkippedCards); - - _gc_par_phases[MergePSS] = new WorkerDataArray(1, "Merge Per-Thread State", true /* is_serial */); - - _merge_pss_copied_bytes = new WorkerDataArray(max_gc_threads, "Copied Bytes"); - _gc_par_phases[MergePSS]->link_thread_work_items(_merge_pss_copied_bytes, MergePSSCopiedBytes); - _merge_pss_lab_waste_bytes = new WorkerDataArray(max_gc_threads, "LAB Waste"); - _gc_par_phases[MergePSS]->link_thread_work_items(_merge_pss_lab_waste_bytes, MergePSSLABWasteBytes); - _merge_pss_lab_undo_waste_bytes = new WorkerDataArray(max_gc_threads, "LAB Undo Waste"); - _gc_par_phases[MergePSS]->link_thread_work_items(_merge_pss_lab_undo_waste_bytes, MergePSSLABUndoWasteBytes); + _gc_par_phases[ScanHR] = new WorkerDataArray("Scan Heap Roots (ms):", max_gc_threads); + _gc_par_phases[OptScanHR] = new WorkerDataArray("Optional Scan Heap Roots (ms):", max_gc_threads); + _gc_par_phases[CodeRoots] = new WorkerDataArray("Code Root Scan (ms):", max_gc_threads); + _gc_par_phases[OptCodeRoots] = new WorkerDataArray("Optional Code Root Scan (ms):", max_gc_threads); + _gc_par_phases[ObjCopy] = new WorkerDataArray("Object Copy (ms):", max_gc_threads); + _gc_par_phases[OptObjCopy] = new WorkerDataArray("Optional Object Copy (ms):", max_gc_threads); + _gc_par_phases[Termination] = new WorkerDataArray("Termination (ms):", max_gc_threads); + _gc_par_phases[OptTermination] = new WorkerDataArray("Optional Termination (ms):", max_gc_threads); + _gc_par_phases[GCWorkerTotal] = new WorkerDataArray("GC Worker Total (ms):", max_gc_threads); + _gc_par_phases[GCWorkerEnd] = new WorkerDataArray("GC Worker End (ms):", max_gc_threads); + _gc_par_phases[Other] = new WorkerDataArray("GC Worker Other (ms):", max_gc_threads); + + _gc_par_phases[ScanHR]->create_thread_work_items("Scanned Cards:", ScanHRScannedCards); + _gc_par_phases[ScanHR]->create_thread_work_items("Scanned Blocks:", ScanHRScannedBlocks); + _gc_par_phases[ScanHR]->create_thread_work_items("Claimed Chunks:", ScanHRClaimedChunks); + + _gc_par_phases[OptScanHR]->create_thread_work_items("Scanned Cards:", ScanHRScannedCards); + _gc_par_phases[OptScanHR]->create_thread_work_items("Scanned Blocks:", ScanHRScannedBlocks); + _gc_par_phases[OptScanHR]->create_thread_work_items("Claimed Chunks:", ScanHRClaimedChunks); + _gc_par_phases[OptScanHR]->create_thread_work_items("Scanned Refs:", ScanHRScannedOptRefs); + _gc_par_phases[OptScanHR]->create_thread_work_items("Used Memory:", ScanHRUsedMemory); + + _gc_par_phases[MergeLB]->create_thread_work_items("Dirty Cards:", MergeLBDirtyCards); + _gc_par_phases[MergeLB]->create_thread_work_items("Skipped Cards:", MergeLBSkippedCards); + + _gc_par_phases[MergePSS] = new WorkerDataArray("Merge Per-Thread State", 1 /* length */, true /* is_serial */); + + _gc_par_phases[MergePSS]->create_thread_work_items("Copied Bytes", MergePSSCopiedBytes, max_gc_threads); + _gc_par_phases[MergePSS]->create_thread_work_items("LAB Waste", MergePSSLABWasteBytes, max_gc_threads); + _gc_par_phases[MergePSS]->create_thread_work_items("LAB Undo Waste", MergePSSLABUndoWasteBytes, max_gc_threads); - _termination_attempts = new WorkerDataArray(max_gc_threads, "Termination Attempts:"); - _gc_par_phases[Termination]->link_thread_work_items(_termination_attempts); + _gc_par_phases[Termination]->create_thread_work_items("Termination Attempts:"); - _opt_termination_attempts = new WorkerDataArray(max_gc_threads, "Optional Termination Attempts:"); - _gc_par_phases[OptTermination]->link_thread_work_items(_opt_termination_attempts); + _gc_par_phases[OptTermination]->create_thread_work_items("Optional Termination Attempts:"); if (UseStringDeduplication) { - _gc_par_phases[StringDedupQueueFixup] = new WorkerDataArray(max_gc_threads, "Queue Fixup (ms):"); - _gc_par_phases[StringDedupTableFixup] = new WorkerDataArray(max_gc_threads, "Table Fixup (ms):"); + _gc_par_phases[StringDedupQueueFixup] = new WorkerDataArray("Queue Fixup (ms):", max_gc_threads); + _gc_par_phases[StringDedupTableFixup] = new WorkerDataArray("Table Fixup (ms):", max_gc_threads); } else { _gc_par_phases[StringDedupQueueFixup] = NULL; _gc_par_phases[StringDedupTableFixup] = NULL; } - _gc_par_phases[RedirtyCards] = new WorkerDataArray(max_gc_threads, "Parallel Redirty (ms):"); - _redirtied_cards = new WorkerDataArray(max_gc_threads, "Redirtied Cards:"); - _gc_par_phases[RedirtyCards]->link_thread_work_items(_redirtied_cards); + _gc_par_phases[RedirtyCards] = new WorkerDataArray("Parallel Redirty (ms):", max_gc_threads); + _gc_par_phases[RedirtyCards]->create_thread_work_items("Redirtied Cards:"); - _gc_par_phases[YoungFreeCSet] = new WorkerDataArray(max_gc_threads, "Young Free Collection Set (ms):"); - _gc_par_phases[NonYoungFreeCSet] = new WorkerDataArray(max_gc_threads, "Non-Young Free Collection Set (ms):"); + _gc_par_phases[YoungFreeCSet] = new WorkerDataArray("Young Free Collection Set (ms):", max_gc_threads); + _gc_par_phases[NonYoungFreeCSet] = new WorkerDataArray("Non-Young Free Collection Set (ms):", max_gc_threads); reset(); } --- old/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp 2019-12-05 11:25:10.253324101 +0100 +++ new/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp 2019-12-05 11:25:09.907313365 +0100 @@ -122,42 +122,6 @@ WorkerDataArray* _gc_par_phases[GCParPhasesSentinel]; - WorkerDataArray* _merge_rs_merged_sparse; - WorkerDataArray* _merge_rs_merged_fine; - WorkerDataArray* _merge_rs_merged_coarse; - WorkerDataArray* _merge_rs_dirty_cards; - - WorkerDataArray* _merge_hcc_dirty_cards; - WorkerDataArray* _merge_hcc_skipped_cards; - - WorkerDataArray* _merge_lb_dirty_cards; - WorkerDataArray* _merge_lb_skipped_cards; - - WorkerDataArray* _scan_hr_scanned_cards; - WorkerDataArray* _scan_hr_scanned_blocks; - WorkerDataArray* _scan_hr_claimed_chunks; - - WorkerDataArray* _opt_merge_rs_merged_sparse; - WorkerDataArray* _opt_merge_rs_merged_fine; - WorkerDataArray* _opt_merge_rs_merged_coarse; - WorkerDataArray* _opt_merge_rs_dirty_cards; - - WorkerDataArray* _opt_scan_hr_scanned_cards; - WorkerDataArray* _opt_scan_hr_scanned_blocks; - WorkerDataArray* _opt_scan_hr_claimed_chunks; - WorkerDataArray* _opt_scan_hr_scanned_opt_refs; - WorkerDataArray* _opt_scan_hr_used_memory; - - WorkerDataArray* _merge_pss_copied_bytes; - WorkerDataArray* _merge_pss_lab_waste_bytes; - WorkerDataArray* _merge_pss_lab_undo_waste_bytes; - - WorkerDataArray* _termination_attempts; - - WorkerDataArray* _opt_termination_attempts; - - WorkerDataArray* _redirtied_cards; - double _cur_collection_initial_evac_time_ms; double _cur_optional_evac_time_ms; double _cur_collection_code_root_fixup_time_ms; --- old/src/hotspot/share/gc/shared/referenceProcessorPhaseTimes.cpp 2019-12-05 11:25:11.547364250 +0100 +++ new/src/hotspot/share/gc/shared/referenceProcessorPhaseTimes.cpp 2019-12-05 11:25:11.194353297 +0100 @@ -177,9 +177,9 @@ _processing_is_mt(false), _gc_timer(gc_timer) { for (uint i = 0; i < ReferenceProcessor::RefSubPhaseMax; i++) { - _sub_phases_worker_time_sec[i] = new WorkerDataArray(max_gc_threads, SubPhasesParWorkTitle[i]); + _sub_phases_worker_time_sec[i] = new WorkerDataArray(SubPhasesParWorkTitle[i], max_gc_threads); } - _phase2_worker_time_sec = new WorkerDataArray(max_gc_threads, Phase2ParWorkTitle); + _phase2_worker_time_sec = new WorkerDataArray(Phase2ParWorkTitle, max_gc_threads); reset(); } --- old/src/hotspot/share/gc/shared/weakProcessorPhaseTimes.cpp 2019-12-05 11:25:12.843404461 +0100 +++ new/src/hotspot/share/gc/shared/weakProcessorPhaseTimes.cpp 2019-12-05 11:25:12.492393570 +0100 @@ -80,9 +80,7 @@ _max_threads(max_threads), _active_workers(0), _total_time_sec(uninitialized_time), - _worker_data(), - _worker_dead_items(), - _worker_total_items() + _worker_data() { assert(_max_threads > 0, "max_threads must not be zero"); @@ -93,9 +91,9 @@ for ( ; !it.is_end(); ++it) { assert(size_t(wpt - _worker_data) < ARRAY_SIZE(_worker_data), "invariant"); const char* description = it->name(); - *wpt = new WorkerDataArray(_max_threads, description); - (*wpt)->link_thread_work_items(new WorkerDataArray(_max_threads, "Dead"), DeadItems); - (*wpt)->link_thread_work_items(new WorkerDataArray(_max_threads, "Total"), TotalItems); + *wpt = new WorkerDataArray(description, _max_threads); + (*wpt)->create_thread_work_items("Dead", DeadItems); + (*wpt)->create_thread_work_items("Total", TotalItems); wpt++; } assert(size_t(wpt - _worker_data) == ARRAY_SIZE(_worker_data), "invariant"); @@ -104,8 +102,6 @@ WeakProcessorPhaseTimes::~WeakProcessorPhaseTimes() { for (size_t i = 0; i < ARRAY_SIZE(_worker_data); ++i) { delete _worker_data[i]; - delete _worker_dead_items[i]; - delete _worker_total_items[i]; } } --- old/src/hotspot/share/gc/shared/weakProcessorPhaseTimes.hpp 2019-12-05 11:25:14.134444517 +0100 +++ new/src/hotspot/share/gc/shared/weakProcessorPhaseTimes.hpp 2019-12-05 11:25:13.783433626 +0100 @@ -56,8 +56,6 @@ // Per-worker times and linked items. static const uint worker_data_count = WeakProcessorPhases::oopstorage_phase_count; WorkerDataArray* _worker_data[worker_data_count]; - WorkerDataArray* _worker_dead_items[worker_data_count]; - WorkerDataArray* _worker_total_items[worker_data_count]; WorkerDataArray* worker_data(WeakProcessorPhase phase) const; --- old/src/hotspot/share/gc/shared/workerDataArray.hpp 2019-12-05 11:25:15.418484355 +0100 +++ new/src/hotspot/share/gc/shared/workerDataArray.hpp 2019-12-05 11:25:15.075473713 +0100 @@ -45,10 +45,14 @@ WorkerDataArray* _thread_work_items[MaxThreadWorkItems]; public: - WorkerDataArray(uint length, const char* title, bool is_serial = false); + WorkerDataArray(const char* title, uint length, bool is_serial = false); ~WorkerDataArray(); - void link_thread_work_items(WorkerDataArray* thread_work_items, uint index = 0); + // Create an integer sub-item at the given index to this WorkerDataArray. If length_override + // is zero, use the same number of elements as this array, otherwise use the given + // number. + void create_thread_work_items(const char* title, uint index = 0, uint length_override = 0); + void set_thread_work_item(uint worker_i, size_t value, uint index = 0); void add_thread_work_item(uint worker_i, size_t value, uint index = 0); void set_or_add_thread_work_item(uint worker_i, size_t value, uint index = 0); --- old/src/hotspot/share/gc/shared/workerDataArray.inline.hpp 2019-12-05 11:25:16.699524101 +0100 +++ new/src/hotspot/share/gc/shared/workerDataArray.inline.hpp 2019-12-05 11:25:16.353513366 +0100 @@ -30,7 +30,7 @@ #include "utilities/ostream.hpp" template -WorkerDataArray::WorkerDataArray(uint length, const char* title, bool is_serial) : +WorkerDataArray::WorkerDataArray(const char* title, uint length, bool is_serial) : _data(NULL), _length(length), _title(title), @@ -66,9 +66,11 @@ } template -void WorkerDataArray::link_thread_work_items(WorkerDataArray* thread_work_items, uint index) { +void WorkerDataArray::create_thread_work_items(const char* title, uint index, uint length_override) { assert(index < MaxThreadWorkItems, "Tried to access thread work item %u (max %u)", index, MaxThreadWorkItems); - _thread_work_items[index] = thread_work_items; + assert(_thread_work_items[index] == NULL, "Tried to overwrite existing thread work item"); + uint length = length_override != 0 ? length_override : _length; + _thread_work_items[index] = new WorkerDataArray(title, length); } template --- old/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp 2019-12-05 11:25:17.979563816 +0100 +++ new/src/hotspot/share/gc/shenandoah/shenandoahPhaseTimings.cpp 2019-12-05 11:25:17.635553142 +0100 @@ -138,7 +138,7 @@ assert(max_gc_threads > 0, "Must have some GC threads"); #define GC_PAR_PHASE_DECLARE_WORKER_DATA(type, title) \ - _gc_par_phases[ShenandoahPhaseTimings::type] = new WorkerDataArray(max_gc_threads, title); + _gc_par_phases[ShenandoahPhaseTimings::type] = new WorkerDataArray(title, max_gc_threads); // Root scanning phases SHENANDOAH_GC_PAR_PHASE_DO(GC_PAR_PHASE_DECLARE_WORKER_DATA) #undef GC_PAR_PHASE_DECLARE_WORKER_DATA @@ -165,7 +165,7 @@ ShenandoahTerminationTimings::ShenandoahTerminationTimings(uint max_gc_threads) { - _gc_termination_phase = new WorkerDataArray(max_gc_threads, "Task Termination (ms):"); + _gc_termination_phase = new WorkerDataArray("Task Termination (ms):", max_gc_threads); } void ShenandoahTerminationTimings::record_time_secs(uint worker_id, double secs) { --- old/test/hotspot/gtest/gc/shared/test_workerDataArray.cpp 2019-12-05 11:25:19.282604244 +0100 +++ new/test/hotspot/gtest/gc/shared/test_workerDataArray.cpp 2019-12-05 11:25:18.920593012 +0100 @@ -34,10 +34,10 @@ protected: WorkerDataArrayTest() : title("Test array"), - array(3, title), + array(title, 3), sub_item_title("Sub item array") { - array.link_thread_work_items(new WorkerDataArray(3, sub_item_title)); + array.create_thread_work_items(sub_item_title); } const char* print_summary() {