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("--");
|