hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
changeset 12382 6aaecb1cbfe1
parent 12381 1438e0fbfa27
child 12508 d76458352d62
equal deleted inserted replaced
12381:1438e0fbfa27 12382:6aaecb1cbfe1
  1190   CMBitMapRO* _bm;
  1190   CMBitMapRO* _bm;
  1191   ConcurrentMark* _cm;
  1191   ConcurrentMark* _cm;
  1192   BitMap* _region_bm;
  1192   BitMap* _region_bm;
  1193   BitMap* _card_bm;
  1193   BitMap* _card_bm;
  1194 
  1194 
  1195   // Debugging
       
  1196   size_t _tot_words_done;
       
  1197   size_t _tot_live;
       
  1198   size_t _tot_used;
       
  1199 
       
  1200   size_t _region_marked_bytes;
  1195   size_t _region_marked_bytes;
  1201 
  1196 
  1202   intptr_t _bottom_card_num;
  1197   intptr_t _bottom_card_num;
  1203 
  1198 
  1204   void mark_card_num_range(intptr_t start_card_num, intptr_t last_card_num) {
  1199   void mark_card_num_range(intptr_t start_card_num, intptr_t last_card_num) {
  1213 
  1208 
  1214 public:
  1209 public:
  1215   CalcLiveObjectsClosure(CMBitMapRO *bm, ConcurrentMark *cm,
  1210   CalcLiveObjectsClosure(CMBitMapRO *bm, ConcurrentMark *cm,
  1216                          BitMap* region_bm, BitMap* card_bm) :
  1211                          BitMap* region_bm, BitMap* card_bm) :
  1217     _bm(bm), _cm(cm), _region_bm(region_bm), _card_bm(card_bm),
  1212     _bm(bm), _cm(cm), _region_bm(region_bm), _card_bm(card_bm),
  1218     _region_marked_bytes(0), _tot_words_done(0),
  1213     _region_marked_bytes(0), _bottom_card_num(cm->heap_bottom_card_num()) { }
  1219     _tot_live(0), _tot_used(0),
       
  1220     _bottom_card_num(cm->heap_bottom_card_num()) { }
       
  1221 
  1214 
  1222   // It takes a region that's not empty (i.e., it has at least one
  1215   // It takes a region that's not empty (i.e., it has at least one
  1223   // live object in it and sets its corresponding bit on the region
  1216   // live object in it and sets its corresponding bit on the region
  1224   // bitmap to 1. If the region is "starts humongous" it will also set
  1217   // bitmap to 1. If the region is "starts humongous" it will also set
  1225   // to 1 the bits on the region bitmap that correspond to its
  1218   // to 1 the bits on the region bitmap that correspond to its
  1259 
  1252 
  1260     assert(start <= hr->end() && start <= nextTop && nextTop <= hr->end(),
  1253     assert(start <= hr->end() && start <= nextTop && nextTop <= hr->end(),
  1261            err_msg("Preconditions not met - "
  1254            err_msg("Preconditions not met - "
  1262                    "start: "PTR_FORMAT", nextTop: "PTR_FORMAT", end: "PTR_FORMAT,
  1255                    "start: "PTR_FORMAT", nextTop: "PTR_FORMAT", end: "PTR_FORMAT,
  1263                    start, nextTop, hr->end()));
  1256                    start, nextTop, hr->end()));
  1264 
       
  1265     // Record the number of word's we'll examine.
       
  1266     size_t words_done = (nextTop - start);
       
  1267 
  1257 
  1268     // Find the first marked object at or after "start".
  1258     // Find the first marked object at or after "start".
  1269     start = _bm->getNextMarkedWordAddress(start, nextTop);
  1259     start = _bm->getNextMarkedWordAddress(start, nextTop);
  1270 
  1260 
  1271     size_t marked_bytes = 0;
  1261     size_t marked_bytes = 0;
  1341 
  1331 
  1342     // Set the marked bytes for the current region so that
  1332     // Set the marked bytes for the current region so that
  1343     // it can be queried by a calling verificiation routine
  1333     // it can be queried by a calling verificiation routine
  1344     _region_marked_bytes = marked_bytes;
  1334     _region_marked_bytes = marked_bytes;
  1345 
  1335 
  1346     _tot_live += hr->next_live_bytes();
       
  1347     _tot_used += hr->used();
       
  1348     _tot_words_done = words_done;
       
  1349 
       
  1350     return false;
  1336     return false;
  1351   }
  1337   }
  1352 
  1338 
  1353   size_t region_marked_bytes() const { return _region_marked_bytes; }
  1339   size_t region_marked_bytes() const { return _region_marked_bytes; }
  1354 
       
  1355   // Debugging
       
  1356   size_t tot_words_done() const      { return _tot_words_done; }
       
  1357   size_t tot_live() const            { return _tot_live; }
       
  1358   size_t tot_used() const            { return _tot_used; }
       
  1359 };
  1340 };
  1360 
  1341 
  1361 // Heap region closure used for verifying the counting data
  1342 // Heap region closure used for verifying the counting data
  1362 // that was accumulated concurrently and aggregated during
  1343 // that was accumulated concurrently and aggregated during
  1363 // the remark pause. This closure is applied to the heap
  1344 // the remark pause. This closure is applied to the heap
  1572 class FinalCountDataUpdateClosure: public HeapRegionClosure {
  1553 class FinalCountDataUpdateClosure: public HeapRegionClosure {
  1573   ConcurrentMark* _cm;
  1554   ConcurrentMark* _cm;
  1574   BitMap* _region_bm;
  1555   BitMap* _region_bm;
  1575   BitMap* _card_bm;
  1556   BitMap* _card_bm;
  1576 
  1557 
  1577   size_t _total_live_bytes;
       
  1578   size_t _total_used_bytes;
       
  1579   size_t _total_words_done;
       
  1580 
       
  1581   void set_card_bitmap_range(BitMap::idx_t start_idx, BitMap::idx_t last_idx) {
  1558   void set_card_bitmap_range(BitMap::idx_t start_idx, BitMap::idx_t last_idx) {
  1582     assert(start_idx <= last_idx, "sanity");
  1559     assert(start_idx <= last_idx, "sanity");
  1583 
  1560 
  1584     // Set the inclusive bit range [start_idx, last_idx].
  1561     // Set the inclusive bit range [start_idx, last_idx].
  1585     // For small ranges (up to 8 cards) use a simple loop; otherwise
  1562     // For small ranges (up to 8 cards) use a simple loop; otherwise
  1619 
  1596 
  1620  public:
  1597  public:
  1621   FinalCountDataUpdateClosure(ConcurrentMark* cm,
  1598   FinalCountDataUpdateClosure(ConcurrentMark* cm,
  1622                               BitMap* region_bm,
  1599                               BitMap* region_bm,
  1623                               BitMap* card_bm) :
  1600                               BitMap* card_bm) :
  1624     _cm(cm), _region_bm(region_bm), _card_bm(card_bm),
  1601     _cm(cm), _region_bm(region_bm), _card_bm(card_bm) { }
  1625     _total_words_done(0), _total_live_bytes(0), _total_used_bytes(0) { }
       
  1626 
  1602 
  1627   bool doHeapRegion(HeapRegion* hr) {
  1603   bool doHeapRegion(HeapRegion* hr) {
  1628 
  1604 
  1629     if (hr->continuesHumongous()) {
  1605     if (hr->continuesHumongous()) {
  1630       // We will ignore these here and process them when their
  1606       // We will ignore these here and process them when their
  1642     HeapWord* top   = hr->top();
  1618     HeapWord* top   = hr->top();
  1643 
  1619 
  1644     assert(hr->bottom() <= start && start <= hr->end() &&
  1620     assert(hr->bottom() <= start && start <= hr->end() &&
  1645            hr->bottom() <= ntams && ntams <= hr->end(), "Preconditions.");
  1621            hr->bottom() <= ntams && ntams <= hr->end(), "Preconditions.");
  1646 
  1622 
  1647     size_t words_done = ntams - hr->bottom();
       
  1648 
       
  1649     if (start < ntams) {
  1623     if (start < ntams) {
  1650       // Region was changed between remark and cleanup pauses
  1624       // Region was changed between remark and cleanup pauses
  1651       // We need to add (ntams - start) to the marked bytes
  1625       // We need to add (ntams - start) to the marked bytes
  1652       // for this region, and set bits for the range
  1626       // for this region, and set bits for the range
  1653       // [ card_idx(start), card_idx(ntams) ) in the card bitmap.
  1627       // [ card_idx(start), card_idx(ntams) ) in the card bitmap.
  1674     // Set the bit for the region if it contains live data
  1648     // Set the bit for the region if it contains live data
  1675     if (hr->next_marked_bytes() > 0) {
  1649     if (hr->next_marked_bytes() > 0) {
  1676       set_bit_for_region(hr);
  1650       set_bit_for_region(hr);
  1677     }
  1651     }
  1678 
  1652 
  1679     _total_words_done += words_done;
       
  1680     _total_used_bytes += hr->used();
       
  1681     _total_live_bytes += hr->next_marked_bytes();
       
  1682 
       
  1683     return false;
  1653     return false;
  1684   }
  1654   }
  1685 
       
  1686   size_t total_words_done() const { return _total_words_done; }
       
  1687   size_t total_live_bytes() const { return _total_live_bytes; }
       
  1688   size_t total_used_bytes() const { return _total_used_bytes; }
       
  1689 };
  1655 };
  1690 
  1656 
  1691 class G1ParFinalCountTask: public AbstractGangTask {
  1657 class G1ParFinalCountTask: public AbstractGangTask {
  1692 protected:
  1658 protected:
  1693   G1CollectedHeap* _g1h;
  1659   G1CollectedHeap* _g1h;
  1694   ConcurrentMark* _cm;
  1660   ConcurrentMark* _cm;
  1695   BitMap* _actual_region_bm;
  1661   BitMap* _actual_region_bm;
  1696   BitMap* _actual_card_bm;
  1662   BitMap* _actual_card_bm;
  1697 
  1663 
  1698   uint    _n_workers;
  1664   uint    _n_workers;
  1699 
       
  1700   size_t *_live_bytes;
       
  1701   size_t *_used_bytes;
       
  1702 
  1665 
  1703 public:
  1666 public:
  1704   G1ParFinalCountTask(G1CollectedHeap* g1h, BitMap* region_bm, BitMap* card_bm)
  1667   G1ParFinalCountTask(G1CollectedHeap* g1h, BitMap* region_bm, BitMap* card_bm)
  1705     : AbstractGangTask("G1 final counting"),
  1668     : AbstractGangTask("G1 final counting"),
  1706       _g1h(g1h), _cm(_g1h->concurrent_mark()),
  1669       _g1h(g1h), _cm(_g1h->concurrent_mark()),
  1707       _actual_region_bm(region_bm), _actual_card_bm(card_bm),
  1670       _actual_region_bm(region_bm), _actual_card_bm(card_bm),
  1708       _n_workers(0) {
  1671       _n_workers(0) {
  1709     // Use the value already set as the number of active threads
  1672     // Use the value already set as the number of active threads
  1710     // in the call to run_task().  Needed for the allocation of
  1673     // in the call to run_task().
  1711     // _live_bytes and _used_bytes.
       
  1712     if (G1CollectedHeap::use_parallel_gc_threads()) {
  1674     if (G1CollectedHeap::use_parallel_gc_threads()) {
  1713       assert( _g1h->workers()->active_workers() > 0,
  1675       assert( _g1h->workers()->active_workers() > 0,
  1714         "Should have been previously set");
  1676         "Should have been previously set");
  1715       _n_workers = _g1h->workers()->active_workers();
  1677       _n_workers = _g1h->workers()->active_workers();
  1716     } else {
  1678     } else {
  1717       _n_workers = 1;
  1679       _n_workers = 1;
  1718     }
  1680     }
  1719 
       
  1720     _live_bytes = NEW_C_HEAP_ARRAY(size_t, (size_t) _n_workers);
       
  1721     _used_bytes = NEW_C_HEAP_ARRAY(size_t, (size_t) _n_workers);
       
  1722   }
       
  1723 
       
  1724   ~G1ParFinalCountTask() {
       
  1725     FREE_C_HEAP_ARRAY(size_t, _live_bytes);
       
  1726     FREE_C_HEAP_ARRAY(size_t, _used_bytes);
       
  1727   }
  1681   }
  1728 
  1682 
  1729   void work(uint worker_id) {
  1683   void work(uint worker_id) {
  1730     assert(worker_id < _n_workers, "invariant");
  1684     assert(worker_id < _n_workers, "invariant");
  1731 
  1685 
  1739                                             _n_workers,
  1693                                             _n_workers,
  1740                                             HeapRegion::FinalCountClaimValue);
  1694                                             HeapRegion::FinalCountClaimValue);
  1741     } else {
  1695     } else {
  1742       _g1h->heap_region_iterate(&final_update_cl);
  1696       _g1h->heap_region_iterate(&final_update_cl);
  1743     }
  1697     }
  1744 
       
  1745     _live_bytes[worker_id] = final_update_cl.total_live_bytes();
       
  1746     _used_bytes[worker_id] = final_update_cl.total_used_bytes();
       
  1747   }
       
  1748 
       
  1749   size_t live_bytes()  {
       
  1750     size_t live_bytes = 0;
       
  1751     for (uint i = 0; i < _n_workers; ++i)
       
  1752       live_bytes += _live_bytes[i];
       
  1753     return live_bytes;
       
  1754   }
       
  1755 
       
  1756   size_t used_bytes()  {
       
  1757     size_t used_bytes = 0;
       
  1758     for (uint i = 0; i < _n_workers; ++i)
       
  1759       used_bytes += _used_bytes[i];
       
  1760     return used_bytes;
       
  1761   }
  1698   }
  1762 };
  1699 };
  1763 
  1700 
  1764 class G1ParNoteEndTask;
  1701 class G1ParNoteEndTask;
  1765 
  1702 
  1890       _cleanup_list->add_as_tail(&local_cleanup_list);
  1827       _cleanup_list->add_as_tail(&local_cleanup_list);
  1891       assert(local_cleanup_list.is_empty(), "post-condition");
  1828       assert(local_cleanup_list.is_empty(), "post-condition");
  1892 
  1829 
  1893       HeapRegionRemSet::finish_cleanup_task(&hrrs_cleanup_task);
  1830       HeapRegionRemSet::finish_cleanup_task(&hrrs_cleanup_task);
  1894     }
  1831     }
  1895     double end = os::elapsedTime();
       
  1896     if (G1PrintParCleanupStats) {
       
  1897       gclog_or_tty->print("     Worker thread %d [%8.3f..%8.3f = %8.3f ms] "
       
  1898                           "claimed %u regions (tot = %8.3f ms, max = %8.3f ms).\n",
       
  1899                           worker_id, start, end, (end-start)*1000.0,
       
  1900                           g1_note_end.regions_claimed(),
       
  1901                           g1_note_end.claimed_region_time_sec()*1000.0,
       
  1902                           g1_note_end.max_region_time_sec()*1000.0);
       
  1903     }
       
  1904   }
  1832   }
  1905   size_t max_live_bytes() { return _max_live_bytes; }
  1833   size_t max_live_bytes() { return _max_live_bytes; }
  1906   size_t freed_bytes() { return _freed_bytes; }
  1834   size_t freed_bytes() { return _freed_bytes; }
  1907 };
  1835 };
  1908 
  1836 
  2009     }
  1937     }
  2010 
  1938 
  2011     guarantee(g1_par_verify_task.failures() == 0, "Unexpected accounting failures");
  1939     guarantee(g1_par_verify_task.failures() == 0, "Unexpected accounting failures");
  2012   }
  1940   }
  2013 
  1941 
  2014   size_t known_garbage_bytes =
       
  2015     g1_par_count_task.used_bytes() - g1_par_count_task.live_bytes();
       
  2016   g1p->set_known_garbage_bytes(known_garbage_bytes);
       
  2017 
       
  2018   size_t start_used_bytes = g1h->used();
  1942   size_t start_used_bytes = g1h->used();
  2019   g1h->set_marking_complete();
  1943   g1h->set_marking_complete();
  2020 
  1944 
  2021   ergo_verbose4(ErgoConcCycles,
       
  2022            "finish cleanup",
       
  2023            ergo_format_byte("occupancy")
       
  2024            ergo_format_byte("capacity")
       
  2025            ergo_format_byte_perc("known garbage"),
       
  2026            start_used_bytes, g1h->capacity(),
       
  2027            known_garbage_bytes,
       
  2028            ((double) known_garbage_bytes / (double) g1h->capacity()) * 100.0);
       
  2029 
       
  2030   double count_end = os::elapsedTime();
  1945   double count_end = os::elapsedTime();
  2031   double this_final_counting_time = (count_end - start);
  1946   double this_final_counting_time = (count_end - start);
  2032   if (G1PrintParCleanupStats) {
       
  2033     gclog_or_tty->print_cr("Cleanup:");
       
  2034     gclog_or_tty->print_cr("  Finalize counting: %8.3f ms",
       
  2035                            this_final_counting_time*1000.0);
       
  2036   }
       
  2037   _total_counting_time += this_final_counting_time;
  1947   _total_counting_time += this_final_counting_time;
  2038 
  1948 
  2039   if (G1PrintRegionLivenessInfo) {
  1949   if (G1PrintRegionLivenessInfo) {
  2040     G1PrintRegionLivenessInfoClosure cl(gclog_or_tty, "Post-Marking");
  1950     G1PrintRegionLivenessInfoClosure cl(gclog_or_tty, "Post-Marking");
  2041     _g1h->heap_region_iterate(&cl);
  1951     _g1h->heap_region_iterate(&cl);
  2045   swapMarkBitMaps();
  1955   swapMarkBitMaps();
  2046 
  1956 
  2047   g1h->reset_gc_time_stamp();
  1957   g1h->reset_gc_time_stamp();
  2048 
  1958 
  2049   // Note end of marking in all heap regions.
  1959   // Note end of marking in all heap regions.
  2050   double note_end_start = os::elapsedTime();
       
  2051   G1ParNoteEndTask g1_par_note_end_task(g1h, &_cleanup_list);
  1960   G1ParNoteEndTask g1_par_note_end_task(g1h, &_cleanup_list);
  2052   if (G1CollectedHeap::use_parallel_gc_threads()) {
  1961   if (G1CollectedHeap::use_parallel_gc_threads()) {
  2053     g1h->set_par_threads((int)n_workers);
  1962     g1h->set_par_threads((int)n_workers);
  2054     g1h->workers()->run_task(&g1_par_note_end_task);
  1963     g1h->workers()->run_task(&g1_par_note_end_task);
  2055     g1h->set_par_threads(0);
  1964     g1h->set_par_threads(0);
  2063   if (!cleanup_list_is_empty()) {
  1972   if (!cleanup_list_is_empty()) {
  2064     // The cleanup list is not empty, so we'll have to process it
  1973     // The cleanup list is not empty, so we'll have to process it
  2065     // concurrently. Notify anyone else that might be wanting free
  1974     // concurrently. Notify anyone else that might be wanting free
  2066     // regions that there will be more free regions coming soon.
  1975     // regions that there will be more free regions coming soon.
  2067     g1h->set_free_regions_coming();
  1976     g1h->set_free_regions_coming();
  2068   }
       
  2069   double note_end_end = os::elapsedTime();
       
  2070   if (G1PrintParCleanupStats) {
       
  2071     gclog_or_tty->print_cr("  note end of marking: %8.3f ms.",
       
  2072                            (note_end_end - note_end_start)*1000.0);
       
  2073   }
  1977   }
  2074 
  1978 
  2075   // call below, since it affects the metric by which we sort the heap
  1979   // call below, since it affects the metric by which we sort the heap
  2076   // regions.
  1980   // regions.
  2077   if (G1ScrubRemSets) {
  1981   if (G1ScrubRemSets) {
  2106     g1h->print_size_transition(gclog_or_tty,
  2010     g1h->print_size_transition(gclog_or_tty,
  2107                                start_used_bytes,
  2011                                start_used_bytes,
  2108                                g1h->used(),
  2012                                g1h->used(),
  2109                                g1h->capacity());
  2013                                g1h->capacity());
  2110   }
  2014   }
  2111 
       
  2112   size_t cleaned_up_bytes = start_used_bytes - g1h->used();
       
  2113   g1p->decrease_known_garbage_bytes(cleaned_up_bytes);
       
  2114 
  2015 
  2115   // Clean up will have freed any regions completely full of garbage.
  2016   // Clean up will have freed any regions completely full of garbage.
  2116   // Update the soft reference policy with the new heap occupancy.
  2017   // Update the soft reference policy with the new heap occupancy.
  2117   Universe::update_heap_info_at_gc();
  2018   Universe::update_heap_info_at_gc();
  2118 
  2019