< prev index next >

src/hotspot/share/gc/g1/g1ConcurrentMark.hpp

Print this page
rev 55281 : [mq]: 8225478-cmrootregions-cleanup

*** 220,241 **** // Apply Fn to every oop on the mark stack. The mark stack must not // be modified while iterating. template<typename Fn> void iterate(Fn fn) const PRODUCT_RETURN; }; ! // Root Regions are regions that contain objects from nTAMS to top. These are roots ! // for marking, i.e. their referenced objects must be kept alive to maintain the // SATB invariant. ! // We could scan and mark them through during the initial-mark pause, but for // pause time reasons we move this work to the concurrent phase. // We need to complete this procedure before the next GC because it might determine // that some of these "root objects" are dead, potentially dropping some required // references. ! // Root regions comprise of the complete contents of survivor regions, and any ! // objects copied into old gen during GC. ! class G1CMRootRegions { ! HeapRegion** _root_regions; size_t const _max_regions; volatile size_t _num_root_regions; // Actual number of root regions. volatile size_t _claimed_root_regions; // Number of root regions currently claimed. --- 220,243 ---- // Apply Fn to every oop on the mark stack. The mark stack must not // be modified while iterating. template<typename Fn> void iterate(Fn fn) const PRODUCT_RETURN; }; ! // Root MemRegions are memory areas that contain objects which references are ! // roots wrt to the marking. They must be scanned before marking to maintain the // SATB invariant. ! // Typically they contain the areas from nTAMS to top of the regions. ! // We could scan and mark through these objects during the initial-mark pause, but for // pause time reasons we move this work to the concurrent phase. // We need to complete this procedure before the next GC because it might determine // that some of these "root objects" are dead, potentially dropping some required // references. ! // Root MemRegions comprise of the contents of survivor regions at the end ! // of the GC, and any objects copied into the old gen during GC. ! class G1CMRootMemRegions { ! // The set of root MemRegions. ! MemRegion* _root_regions; size_t const _max_regions; volatile size_t _num_root_regions; // Actual number of root regions. volatile size_t _claimed_root_regions; // Number of root regions currently claimed.
*** 244,260 **** volatile bool _should_abort; void notify_scan_done(); public: ! G1CMRootRegions(uint const max_regions); ! ~G1CMRootRegions(); // Reset the data structure to allow addition of new root regions. void reset(); ! void add(HeapRegion* hr); // Reset the claiming / scanning of the root regions. void prepare_for_scan(); // Forces get_next() to return NULL so that the iteration aborts early. --- 246,262 ---- volatile bool _should_abort; void notify_scan_done(); public: ! G1CMRootMemRegions(uint const max_regions); ! ~G1CMRootMemRegions(); // Reset the data structure to allow addition of new root regions. void reset(); ! void add(HeapWord* start, HeapWord* end); // Reset the claiming / scanning of the root regions. void prepare_for_scan(); // Forces get_next() to return NULL so that the iteration aborts early.
*** 262,274 **** // Return true if the CM thread are actively scanning root regions, // false otherwise. bool scan_in_progress() { return _scan_in_progress; } ! // Claim the next root region to scan atomically, or return NULL if // all have been claimed. ! HeapRegion* claim_next(); // The number of root regions to scan. uint num_root_regions() const; void cancel_scan(); --- 264,276 ---- // Return true if the CM thread are actively scanning root regions, // false otherwise. bool scan_in_progress() { return _scan_in_progress; } ! // Claim the next root MemRegion to scan atomically, or return NULL if // all have been claimed. ! MemRegion* claim_next(); // The number of root regions to scan. uint num_root_regions() const; void cancel_scan();
*** 308,318 **** // Heap bounds MemRegion const _heap; // Root region tracking and claiming ! G1CMRootRegions _root_regions; // For grey objects G1CMMarkStack _global_mark_stack; // Grey objects behind global finger HeapWord* volatile _finger; // The global finger, region aligned, // always pointing to the end of the --- 310,320 ---- // Heap bounds MemRegion const _heap; // Root region tracking and claiming ! G1CMRootMemRegions _root_regions; // For grey objects G1CMMarkStack _global_mark_stack; // Grey objects behind global finger HeapWord* volatile _finger; // The global finger, region aligned, // always pointing to the end of the
*** 499,509 **** } size_t mark_stack_size() const { return _global_mark_stack.size(); } size_t partial_mark_stack_size_target() const { return _global_mark_stack.capacity() / 3; } bool mark_stack_empty() const { return _global_mark_stack.is_empty(); } ! G1CMRootRegions* root_regions() { return &_root_regions; } void concurrent_cycle_start(); // Abandon current marking iteration due to a Full GC. void concurrent_cycle_abort(); void concurrent_cycle_end(); --- 501,511 ---- } size_t mark_stack_size() const { return _global_mark_stack.size(); } size_t partial_mark_stack_size_target() const { return _global_mark_stack.capacity() / 3; } bool mark_stack_empty() const { return _global_mark_stack.is_empty(); } ! G1CMRootMemRegions* root_regions() { return &_root_regions; } void concurrent_cycle_start(); // Abandon current marking iteration due to a Full GC. void concurrent_cycle_abort(); void concurrent_cycle_end();
*** 552,563 **** // Scan all the root regions and mark everything reachable from // them. void scan_root_regions(); ! // Scan a single root region from nTAMS to top and mark everything reachable from it. ! void scan_root_region(HeapRegion* hr, uint worker_id); // Do concurrent phase of marking, to a tentative transitive closure. void mark_from_roots(); // Do concurrent preclean work. --- 554,565 ---- // Scan all the root regions and mark everything reachable from // them. void scan_root_regions(); ! // Scan a single root MemRegion which holds from nTAMS to top and mark everything reachable from it. ! void scan_root_region(MemRegion* region, uint worker_id); // Do concurrent phase of marking, to a tentative transitive closure. void mark_from_roots(); // Do concurrent preclean work.
< prev index next >