Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/g1/concurrentMark.cpp @ 2175:81668b1f4877
Merge
author | johnc |
---|---|
date | Wed, 26 Jan 2011 09:57:42 -0800 |
parents | 234761c55641 97ba643ea3ed |
children | 3582bf76420e |
comparison
equal
deleted
inserted
replaced
2174:234761c55641 | 2175:81668b1f4877 |
---|---|
1510 G1CollectedHeap* _g1; | 1510 G1CollectedHeap* _g1; |
1511 int _worker_num; | 1511 int _worker_num; |
1512 size_t _max_live_bytes; | 1512 size_t _max_live_bytes; |
1513 size_t _regions_claimed; | 1513 size_t _regions_claimed; |
1514 size_t _freed_bytes; | 1514 size_t _freed_bytes; |
1515 FreeRegionList _local_cleanup_list; | 1515 FreeRegionList* _local_cleanup_list; |
1516 HumongousRegionSet _humongous_proxy_set; | 1516 HumongousRegionSet* _humongous_proxy_set; |
1517 HRRSCleanupTask* _hrrs_cleanup_task; | |
1517 double _claimed_region_time; | 1518 double _claimed_region_time; |
1518 double _max_region_time; | 1519 double _max_region_time; |
1519 | 1520 |
1520 public: | 1521 public: |
1521 G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, | 1522 G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, |
1522 int worker_num); | 1523 int worker_num, |
1524 FreeRegionList* local_cleanup_list, | |
1525 HumongousRegionSet* humongous_proxy_set, | |
1526 HRRSCleanupTask* hrrs_cleanup_task); | |
1523 size_t freed_bytes() { return _freed_bytes; } | 1527 size_t freed_bytes() { return _freed_bytes; } |
1524 FreeRegionList* local_cleanup_list() { | |
1525 return &_local_cleanup_list; | |
1526 } | |
1527 HumongousRegionSet* humongous_proxy_set() { | |
1528 return &_humongous_proxy_set; | |
1529 } | |
1530 | 1528 |
1531 bool doHeapRegion(HeapRegion *r); | 1529 bool doHeapRegion(HeapRegion *r); |
1532 | 1530 |
1533 size_t max_live_bytes() { return _max_live_bytes; } | 1531 size_t max_live_bytes() { return _max_live_bytes; } |
1534 size_t regions_claimed() { return _regions_claimed; } | 1532 size_t regions_claimed() { return _regions_claimed; } |
1551 AbstractGangTask("G1 note end"), _g1h(g1h), | 1549 AbstractGangTask("G1 note end"), _g1h(g1h), |
1552 _max_live_bytes(0), _freed_bytes(0), _cleanup_list(cleanup_list) { } | 1550 _max_live_bytes(0), _freed_bytes(0), _cleanup_list(cleanup_list) { } |
1553 | 1551 |
1554 void work(int i) { | 1552 void work(int i) { |
1555 double start = os::elapsedTime(); | 1553 double start = os::elapsedTime(); |
1556 G1NoteEndOfConcMarkClosure g1_note_end(_g1h, i); | 1554 FreeRegionList local_cleanup_list("Local Cleanup List"); |
1555 HumongousRegionSet humongous_proxy_set("Local Cleanup Humongous Proxy Set"); | |
1556 HRRSCleanupTask hrrs_cleanup_task; | |
1557 G1NoteEndOfConcMarkClosure g1_note_end(_g1h, i, &local_cleanup_list, | |
1558 &humongous_proxy_set, | |
1559 &hrrs_cleanup_task); | |
1557 if (G1CollectedHeap::use_parallel_gc_threads()) { | 1560 if (G1CollectedHeap::use_parallel_gc_threads()) { |
1558 _g1h->heap_region_par_iterate_chunked(&g1_note_end, i, | 1561 _g1h->heap_region_par_iterate_chunked(&g1_note_end, i, |
1559 HeapRegion::NoteEndClaimValue); | 1562 HeapRegion::NoteEndClaimValue); |
1560 } else { | 1563 } else { |
1561 _g1h->heap_region_iterate(&g1_note_end); | 1564 _g1h->heap_region_iterate(&g1_note_end); |
1563 assert(g1_note_end.complete(), "Shouldn't have yielded!"); | 1566 assert(g1_note_end.complete(), "Shouldn't have yielded!"); |
1564 | 1567 |
1565 // Now update the lists | 1568 // Now update the lists |
1566 _g1h->update_sets_after_freeing_regions(g1_note_end.freed_bytes(), | 1569 _g1h->update_sets_after_freeing_regions(g1_note_end.freed_bytes(), |
1567 NULL /* free_list */, | 1570 NULL /* free_list */, |
1568 g1_note_end.humongous_proxy_set(), | 1571 &humongous_proxy_set, |
1569 true /* par */); | 1572 true /* par */); |
1570 { | 1573 { |
1571 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); | 1574 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); |
1572 _max_live_bytes += g1_note_end.max_live_bytes(); | 1575 _max_live_bytes += g1_note_end.max_live_bytes(); |
1573 _freed_bytes += g1_note_end.freed_bytes(); | 1576 _freed_bytes += g1_note_end.freed_bytes(); |
1574 | 1577 |
1575 _cleanup_list->add_as_tail(g1_note_end.local_cleanup_list()); | 1578 _cleanup_list->add_as_tail(&local_cleanup_list); |
1576 assert(g1_note_end.local_cleanup_list()->is_empty(), "post-condition"); | 1579 assert(local_cleanup_list.is_empty(), "post-condition"); |
1580 | |
1581 HeapRegionRemSet::finish_cleanup_task(&hrrs_cleanup_task); | |
1577 } | 1582 } |
1578 double end = os::elapsedTime(); | 1583 double end = os::elapsedTime(); |
1579 if (G1PrintParCleanupStats) { | 1584 if (G1PrintParCleanupStats) { |
1580 gclog_or_tty->print(" Worker thread %d [%8.3f..%8.3f = %8.3f ms] " | 1585 gclog_or_tty->print(" Worker thread %d [%8.3f..%8.3f = %8.3f ms] " |
1581 "claimed %d regions (tot = %8.3f ms, max = %8.3f ms).\n", | 1586 "claimed %d regions (tot = %8.3f ms, max = %8.3f ms).\n", |
1612 | 1617 |
1613 }; | 1618 }; |
1614 | 1619 |
1615 G1NoteEndOfConcMarkClosure:: | 1620 G1NoteEndOfConcMarkClosure:: |
1616 G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, | 1621 G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, |
1617 int worker_num) | 1622 int worker_num, |
1623 FreeRegionList* local_cleanup_list, | |
1624 HumongousRegionSet* humongous_proxy_set, | |
1625 HRRSCleanupTask* hrrs_cleanup_task) | |
1618 : _g1(g1), _worker_num(worker_num), | 1626 : _g1(g1), _worker_num(worker_num), |
1619 _max_live_bytes(0), _regions_claimed(0), | 1627 _max_live_bytes(0), _regions_claimed(0), |
1620 _freed_bytes(0), | 1628 _freed_bytes(0), |
1621 _claimed_region_time(0.0), _max_region_time(0.0), | 1629 _claimed_region_time(0.0), _max_region_time(0.0), |
1622 _local_cleanup_list("Local Cleanup List"), | 1630 _local_cleanup_list(local_cleanup_list), |
1623 _humongous_proxy_set("Local Cleanup Humongous Proxy Set") { } | 1631 _humongous_proxy_set(humongous_proxy_set), |
1632 _hrrs_cleanup_task(hrrs_cleanup_task) { } | |
1624 | 1633 |
1625 bool G1NoteEndOfConcMarkClosure::doHeapRegion(HeapRegion *hr) { | 1634 bool G1NoteEndOfConcMarkClosure::doHeapRegion(HeapRegion *hr) { |
1626 // We use a claim value of zero here because all regions | 1635 // We use a claim value of zero here because all regions |
1627 // were claimed with value 1 in the FinalCount task. | 1636 // were claimed with value 1 in the FinalCount task. |
1628 hr->reset_gc_time_stamp(); | 1637 hr->reset_gc_time_stamp(); |
1629 if (!hr->continuesHumongous()) { | 1638 if (!hr->continuesHumongous()) { |
1630 double start = os::elapsedTime(); | 1639 double start = os::elapsedTime(); |
1631 _regions_claimed++; | 1640 _regions_claimed++; |
1632 hr->note_end_of_marking(); | 1641 hr->note_end_of_marking(); |
1633 _max_live_bytes += hr->max_live_bytes(); | 1642 _max_live_bytes += hr->max_live_bytes(); |
1634 _g1->free_region_if_totally_empty(hr, | 1643 _g1->free_region_if_empty(hr, |
1635 &_freed_bytes, | 1644 &_freed_bytes, |
1636 &_local_cleanup_list, | 1645 _local_cleanup_list, |
1637 &_humongous_proxy_set, | 1646 _humongous_proxy_set, |
1638 true /* par */); | 1647 _hrrs_cleanup_task, |
1648 true /* par */); | |
1639 double region_time = (os::elapsedTime() - start); | 1649 double region_time = (os::elapsedTime() - start); |
1640 _claimed_region_time += region_time; | 1650 _claimed_region_time += region_time; |
1641 if (region_time > _max_region_time) _max_region_time = region_time; | 1651 if (region_time > _max_region_time) _max_region_time = region_time; |
1642 } | 1652 } |
1643 return false; | 1653 return false; |
1668 | 1678 |
1669 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy(); | 1679 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy(); |
1670 g1p->record_concurrent_mark_cleanup_start(); | 1680 g1p->record_concurrent_mark_cleanup_start(); |
1671 | 1681 |
1672 double start = os::elapsedTime(); | 1682 double start = os::elapsedTime(); |
1683 | |
1684 HeapRegionRemSet::reset_for_cleanup_tasks(); | |
1673 | 1685 |
1674 // Do counting once more with the world stopped for good measure. | 1686 // Do counting once more with the world stopped for good measure. |
1675 G1ParFinalCountTask g1_par_count_task(g1h, nextMarkBitMap(), | 1687 G1ParFinalCountTask g1_par_count_task(g1h, nextMarkBitMap(), |
1676 &_region_bm, &_card_bm); | 1688 &_region_bm, &_card_bm); |
1677 if (G1CollectedHeap::use_parallel_gc_threads()) { | 1689 if (G1CollectedHeap::use_parallel_gc_threads()) { |