276 }; 277 278 class ZDriverCycleScope : public StackObj { 279 private: 280 GCIdMark _gc_id; 281 GCCauseSetter _gc_cause_setter; 282 ZSoftReferencePolicyScope _soft_ref_policy; 283 ZStatTimer _timer; 284 285 bool should_boost_worker_threads(GCCause::Cause cause) const { 286 return cause == GCCause::_java_lang_system_gc || 287 cause == GCCause::_z_allocation_stall; 288 } 289 290 public: 291 ZDriverCycleScope(GCCause::Cause cause) : 292 _gc_id(), 293 _gc_cause_setter(ZCollectedHeap::heap(), cause), 294 _soft_ref_policy(cause), 295 _timer(ZPhaseCycle) { 296 const bool boost = should_boost_worker_threads(cause); 297 ZHeap::heap()->set_boost_worker_threads(boost); 298 } 299 }; 300 301 void ZDriver::run_gc_cycle(GCCause::Cause cause) { 302 ZDriverCycleScope scope(cause); 303 304 // Phase 1: Pause Mark Start 305 { 306 ZMarkStartClosure cl; 307 vm_operation(&cl); 308 } 309 310 // Phase 2: Concurrent Mark 311 { 312 ZStatTimer timer(ZPhaseConcurrentMark); 313 ZHeap::heap()->mark(); 314 } 315 316 // Phase 3: Pause Mark End 317 { | 276 }; 277 278 class ZDriverCycleScope : public StackObj { 279 private: 280 GCIdMark _gc_id; 281 GCCauseSetter _gc_cause_setter; 282 ZSoftReferencePolicyScope _soft_ref_policy; 283 ZStatTimer _timer; 284 285 bool should_boost_worker_threads(GCCause::Cause cause) const { 286 return cause == GCCause::_java_lang_system_gc || 287 cause == GCCause::_z_allocation_stall; 288 } 289 290 public: 291 ZDriverCycleScope(GCCause::Cause cause) : 292 _gc_id(), 293 _gc_cause_setter(ZCollectedHeap::heap(), cause), 294 _soft_ref_policy(cause), 295 _timer(ZPhaseCycle) { 296 // Update statistics 297 ZStatCycle::at_start(); 298 299 // Set boost mode 300 const bool boost = should_boost_worker_threads(cause); 301 ZHeap::heap()->set_boost_worker_threads(boost); 302 } 303 304 ~ZDriverCycleScope() { 305 // Calculate boost factor 306 const double boost_factor = (double)ZHeap::heap()->nconcurrent_worker_threads() / 307 (double)ZHeap::heap()->nconcurrent_no_boost_worker_threads(); 308 309 // Update statistics 310 ZStatCycle::at_end(boost_factor); 311 } 312 }; 313 314 void ZDriver::run_gc_cycle(GCCause::Cause cause) { 315 ZDriverCycleScope scope(cause); 316 317 // Phase 1: Pause Mark Start 318 { 319 ZMarkStartClosure cl; 320 vm_operation(&cl); 321 } 322 323 // Phase 2: Concurrent Mark 324 { 325 ZStatTimer timer(ZPhaseConcurrentMark); 326 ZHeap::heap()->mark(); 327 } 328 329 // Phase 3: Pause Mark End 330 { |