本文整理汇总了C++中GenCollectedHeap::process_strong_roots方法的典型用法代码示例。如果您正苦于以下问题:C++ GenCollectedHeap::process_strong_roots方法的具体用法?C++ GenCollectedHeap::process_strong_roots怎么用?C++ GenCollectedHeap::process_strong_roots使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GenCollectedHeap
的用法示例。
在下文中一共展示了GenCollectedHeap::process_strong_roots方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: collect
void DefNewGeneration::collect(bool full,
bool clear_all_soft_refs,
size_t size,
bool is_large_noref,
bool is_tlab) {
assert(full || size > 0, "otherwise we don't want to collect");
GenCollectedHeap* gch = GenCollectedHeap::heap();
_next_gen = gch->next_gen(this);
assert(_next_gen != NULL,
"This must be the youngest gen, and not the only gen");
// If the next generation is too full to accomodate worst-case promotion
// from this generation, pass on collection; let the next generation
// do it.
if (!full_promotion_would_succeed()) {
gch->set_incremental_collection_will_fail();
if (PrintGC && Verbose) {
gclog_or_tty->print_cr("DefNewGeneration::collect"
" contiguous_available: " SIZE_FORMAT " < used: " SIZE_FORMAT,
_next_gen->max_contiguous_available(), used());
}
return;
}
TraceTime t1("GC", PrintGC && !PrintGCDetails, true, gclog_or_tty);
// Capture heap used before collection (for printing).
size_t gch_prev_used = gch->used();
SpecializationStats::clear();
// These can be shared for all code paths
IsAliveClosure is_alive(this);
ScanWeakRefClosure scan_weak_ref(this);
age_table()->clear();
to()->clear();
gch->rem_set()->prepare_for_younger_refs_iterate(false);
assert(gch->no_allocs_since_save_marks(0),
"save marks have not been newly set.");
// Weak refs.
// FIXME: Are these storage leaks, or are they resource objects?
NOT_COMPILER2(ReferencePolicy *soft_ref_policy = new LRUCurrentHeapPolicy());
COMPILER2_ONLY(ReferencePolicy *soft_ref_policy = new LRUMaxHeapPolicy());
// Not very pretty.
CollectorPolicy* cp = gch->collector_policy();
if (!cp->is_train_policy()) {
FastScanClosure fsc_with_no_gc_barrier(this, false);
FastScanClosure fsc_with_gc_barrier(this, true);
FastEvacuateFollowersClosure evacuate_followers(gch, _level,
&fsc_with_no_gc_barrier,
&fsc_with_gc_barrier);
assert(gch->no_allocs_since_save_marks(0),
"save marks have not been newly set.");
gch->process_strong_roots(_level,
true, // Process younger gens, if any, as
// strong roots.
false,// not collecting permanent generation.
GenCollectedHeap::CSO_AllClasses,
&fsc_with_gc_barrier,
&fsc_with_no_gc_barrier);
// "evacuate followers".
evacuate_followers.do_void();
FastKeepAliveClosure keep_alive(this, &scan_weak_ref);
ref_processor()->process_discovered_references(soft_ref_policy,
&is_alive,
&keep_alive,
&evacuate_followers);
} else { // Train policy
ScanClosure sc_with_no_gc_barrier(this, false);
ScanClosure sc_with_gc_barrier(this, true);
EvacuateFollowersClosure evacuate_followers(gch, _level,
&sc_with_no_gc_barrier,
&sc_with_gc_barrier);
gch->process_strong_roots(_level,
true, // Process younger gens, if any, as
// strong roots.
false,// not collecting perm generation.
GenCollectedHeap::CSO_AllClasses,
&sc_with_gc_barrier,
&sc_with_no_gc_barrier);
// "evacuate followers".
evacuate_followers.do_void();
TrainPolicyKeepAliveClosure keep_alive((TrainGeneration*)_next_gen,
&scan_weak_ref);
ref_processor()->process_discovered_references(soft_ref_policy,
&is_alive,
&keep_alive,
&evacuate_followers);
//.........这里部分代码省略.........