910 void ParNewGeneration::collect(bool full,
911 bool clear_all_soft_refs,
912 size_t size,
913 bool is_tlab) {
914 assert(full || size > 0, "otherwise we don't want to collect");
915
916 GenCollectedHeap* gch = GenCollectedHeap::heap();
917
918 _gc_timer->register_gc_start(os::elapsed_counter());
919
920 assert(gch->kind() == CollectedHeap::GenCollectedHeap,
921 "not a CMS generational heap");
922 AdaptiveSizePolicy* size_policy = gch->gen_policy()->size_policy();
923 FlexibleWorkGang* workers = gch->workers();
924 assert(workers != NULL, "Need workgang for parallel work");
925 int active_workers =
926 AdaptiveSizePolicy::calc_active_workers(workers->total_workers(),
927 workers->active_workers(),
928 Threads::number_of_non_daemon_threads());
929 workers->set_active_workers(active_workers);
930 _next_gen = gch->next_gen(this);
931 assert(_next_gen != NULL,
932 "This must be the youngest gen, and not the only gen");
933 assert(gch->n_gens() == 2,
934 "Par collection currently only works with single older gen.");
935 // Do we have to avoid promotion_undo?
936 if (gch->collector_policy()->is_concurrent_mark_sweep_policy()) {
937 set_avoid_promotion_undo(true);
938 }
939
940 // If the next generation is too full to accommodate worst-case promotion
941 // from this generation, pass on collection; let the next generation
942 // do it.
943 if (!collection_attempt_is_safe()) {
944 gch->set_incremental_collection_failed(); // slight lie, in that we did not even attempt one
945 return;
946 }
947 assert(to()->is_empty(), "Else not collection_attempt_is_safe");
948
949 ParNewTracer gc_tracer;
950 gc_tracer.report_gc_start(gch->gc_cause(), _gc_timer->gc_start());
951 gch->trace_heap_before_gc(&gc_tracer);
952
953 init_assuming_no_promotion_failure();
954
|
910 void ParNewGeneration::collect(bool full,
911 bool clear_all_soft_refs,
912 size_t size,
913 bool is_tlab) {
914 assert(full || size > 0, "otherwise we don't want to collect");
915
916 GenCollectedHeap* gch = GenCollectedHeap::heap();
917
918 _gc_timer->register_gc_start(os::elapsed_counter());
919
920 assert(gch->kind() == CollectedHeap::GenCollectedHeap,
921 "not a CMS generational heap");
922 AdaptiveSizePolicy* size_policy = gch->gen_policy()->size_policy();
923 FlexibleWorkGang* workers = gch->workers();
924 assert(workers != NULL, "Need workgang for parallel work");
925 int active_workers =
926 AdaptiveSizePolicy::calc_active_workers(workers->total_workers(),
927 workers->active_workers(),
928 Threads::number_of_non_daemon_threads());
929 workers->set_active_workers(active_workers);
930 assert(gch->n_gens() == 2,
931 "Par collection currently only works with single older gen.");
932 _next_gen = gch->next_gen(this);
933 // Do we have to avoid promotion_undo?
934 if (gch->collector_policy()->is_concurrent_mark_sweep_policy()) {
935 set_avoid_promotion_undo(true);
936 }
937
938 // If the next generation is too full to accommodate worst-case promotion
939 // from this generation, pass on collection; let the next generation
940 // do it.
941 if (!collection_attempt_is_safe()) {
942 gch->set_incremental_collection_failed(); // slight lie, in that we did not even attempt one
943 return;
944 }
945 assert(to()->is_empty(), "Else not collection_attempt_is_safe");
946
947 ParNewTracer gc_tracer;
948 gc_tracer.report_gc_start(gch->gc_cause(), _gc_timer->gc_start());
949 gch->trace_heap_before_gc(&gc_tracer);
950
951 init_assuming_no_promotion_failure();
952
|