src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp

Print this page




 313     }
 314 
 315     // Verify no unmarked old->young roots
 316     if (VerifyRememberedSets) {
 317       CardTableExtension::verify_all_young_refs_imprecise();
 318     }
 319 
 320     if (!ScavengeWithObjectsInToSpace) {
 321       assert(young_gen->to_space()->is_empty(),
 322              "Attempt to scavenge with live objects in to_space");
 323       young_gen->to_space()->clear(SpaceDecorator::Mangle);
 324     } else if (ZapUnusedHeapArea) {
 325       young_gen->to_space()->mangle_unused_area();
 326     }
 327     save_to_space_top_before_gc();
 328 
 329     NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
 330     COMPILER2_PRESENT(DerivedPointerTable::clear());
 331 
 332     reference_processor()->enable_discovery();

 333 
 334     // We track how much was promoted to the next generation for
 335     // the AdaptiveSizePolicy.
 336     size_t old_gen_used_before = old_gen->used_in_bytes();
 337 
 338     // For PrintGCDetails
 339     size_t young_gen_used_before = young_gen->used_in_bytes();
 340 
 341     // Reset our survivor overflow.
 342     set_survivor_overflow(false);
 343 
 344     // We need to save the old/perm top values before
 345     // creating the promotion_manager. We pass the top
 346     // values to the card_table, to prevent it from
 347     // straying into the promotion labs.
 348     HeapWord* old_top = old_gen->object_space()->top();
 349     HeapWord* perm_top = perm_gen->object_space()->top();
 350 
 351     // Release all previously held resources
 352     gc_task_manager()->release_all_resources();


 377       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
 378 
 379       ParallelTaskTerminator terminator(
 380         gc_task_manager()->workers(),
 381         promotion_manager->depth_first() ?
 382             (TaskQueueSetSuper*) promotion_manager->stack_array_depth()
 383           : (TaskQueueSetSuper*) promotion_manager->stack_array_breadth());
 384       if (ParallelGCThreads>1) {
 385         for (uint j=0; j<ParallelGCThreads; j++) {
 386           q->enqueue(new StealTask(&terminator));
 387         }
 388       }
 389 
 390       gc_task_manager()->execute_and_wait(q);
 391     }
 392 
 393     scavenge_midpoint.update();
 394 
 395     // Process reference objects discovered during scavenge
 396     {
 397 #ifdef COMPILER2
 398       ReferencePolicy *soft_ref_policy = new LRUMaxHeapPolicy();
 399 #else
 400       ReferencePolicy *soft_ref_policy = new LRUCurrentHeapPolicy();
 401 #endif // COMPILER2
 402 
 403       PSKeepAliveClosure keep_alive(promotion_manager);
 404       PSEvacuateFollowersClosure evac_followers(promotion_manager);
 405       assert(soft_ref_policy != NULL,"No soft reference policy");
 406       if (reference_processor()->processing_is_mt()) {
 407         PSRefProcTaskExecutor task_executor;
 408         reference_processor()->process_discovered_references(
 409           soft_ref_policy, &_is_alive_closure, &keep_alive, &evac_followers,
 410           &task_executor);
 411       } else {
 412         reference_processor()->process_discovered_references(
 413           soft_ref_policy, &_is_alive_closure, &keep_alive, &evac_followers,
 414           NULL);
 415       }
 416     }
 417 
 418     // Enqueue reference objects discovered during scavenge.
 419     if (reference_processor()->processing_is_mt()) {
 420       PSRefProcTaskExecutor task_executor;
 421       reference_processor()->enqueue_discovered_references(&task_executor);
 422     } else {
 423       reference_processor()->enqueue_discovered_references(NULL);
 424     }
 425 
 426     // Finally, flush the promotion_manager's labs, and deallocate its stacks.
 427     assert(promotion_manager->claimed_stack_empty(), "Sanity");
 428     PSPromotionManager::post_scavenge();
 429 
 430     promotion_failure_occurred = promotion_failed();
 431     if (promotion_failure_occurred) {
 432       clean_up_failed_promotion();
 433       if (PrintGC) {
 434         gclog_or_tty->print("--");




 313     }
 314 
 315     // Verify no unmarked old->young roots
 316     if (VerifyRememberedSets) {
 317       CardTableExtension::verify_all_young_refs_imprecise();
 318     }
 319 
 320     if (!ScavengeWithObjectsInToSpace) {
 321       assert(young_gen->to_space()->is_empty(),
 322              "Attempt to scavenge with live objects in to_space");
 323       young_gen->to_space()->clear(SpaceDecorator::Mangle);
 324     } else if (ZapUnusedHeapArea) {
 325       young_gen->to_space()->mangle_unused_area();
 326     }
 327     save_to_space_top_before_gc();
 328 
 329     NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
 330     COMPILER2_PRESENT(DerivedPointerTable::clear());
 331 
 332     reference_processor()->enable_discovery();
 333     reference_processor()->snap_policy(false);
 334 
 335     // We track how much was promoted to the next generation for
 336     // the AdaptiveSizePolicy.
 337     size_t old_gen_used_before = old_gen->used_in_bytes();
 338 
 339     // For PrintGCDetails
 340     size_t young_gen_used_before = young_gen->used_in_bytes();
 341 
 342     // Reset our survivor overflow.
 343     set_survivor_overflow(false);
 344 
 345     // We need to save the old/perm top values before
 346     // creating the promotion_manager. We pass the top
 347     // values to the card_table, to prevent it from
 348     // straying into the promotion labs.
 349     HeapWord* old_top = old_gen->object_space()->top();
 350     HeapWord* perm_top = perm_gen->object_space()->top();
 351 
 352     // Release all previously held resources
 353     gc_task_manager()->release_all_resources();


 378       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
 379 
 380       ParallelTaskTerminator terminator(
 381         gc_task_manager()->workers(),
 382         promotion_manager->depth_first() ?
 383             (TaskQueueSetSuper*) promotion_manager->stack_array_depth()
 384           : (TaskQueueSetSuper*) promotion_manager->stack_array_breadth());
 385       if (ParallelGCThreads>1) {
 386         for (uint j=0; j<ParallelGCThreads; j++) {
 387           q->enqueue(new StealTask(&terminator));
 388         }
 389       }
 390 
 391       gc_task_manager()->execute_and_wait(q);
 392     }
 393 
 394     scavenge_midpoint.update();
 395 
 396     // Process reference objects discovered during scavenge
 397     {
 398       reference_processor()->snap_policy(false); // not always_clear





 399       PSKeepAliveClosure keep_alive(promotion_manager);
 400       PSEvacuateFollowersClosure evac_followers(promotion_manager);

 401       if (reference_processor()->processing_is_mt()) {
 402         PSRefProcTaskExecutor task_executor;
 403         reference_processor()->process_discovered_references(
 404           &_is_alive_closure, &keep_alive, &evac_followers, &task_executor);

 405       } else {
 406         reference_processor()->process_discovered_references(
 407           &_is_alive_closure, &keep_alive, &evac_followers, NULL);

 408       }
 409     }
 410 
 411     // Enqueue reference objects discovered during scavenge.
 412     if (reference_processor()->processing_is_mt()) {
 413       PSRefProcTaskExecutor task_executor;
 414       reference_processor()->enqueue_discovered_references(&task_executor);
 415     } else {
 416       reference_processor()->enqueue_discovered_references(NULL);
 417     }
 418 
 419     // Finally, flush the promotion_manager's labs, and deallocate its stacks.
 420     assert(promotion_manager->claimed_stack_empty(), "Sanity");
 421     PSPromotionManager::post_scavenge();
 422 
 423     promotion_failure_occurred = promotion_failed();
 424     if (promotion_failure_occurred) {
 425       clean_up_failed_promotion();
 426       if (PrintGC) {
 427         gclog_or_tty->print("--");