src/share/vm/gc_implementation/g1/concurrentMark.cpp

changeset 6385
58fc1b1523dc
parent 6230
cb7ec2423207
child 6399
f53edbc2b728
     1.1 --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Thu Mar 06 11:11:04 2014 +0100
     1.2 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Fri Mar 14 10:15:46 2014 +0100
     1.3 @@ -1809,8 +1809,8 @@
     1.4    uint _regions_claimed;
     1.5    size_t _freed_bytes;
     1.6    FreeRegionList* _local_cleanup_list;
     1.7 -  OldRegionSet* _old_proxy_set;
     1.8 -  HumongousRegionSet* _humongous_proxy_set;
     1.9 +  HeapRegionSetCount _old_regions_removed;
    1.10 +  HeapRegionSetCount _humongous_regions_removed;
    1.11    HRRSCleanupTask* _hrrs_cleanup_task;
    1.12    double _claimed_region_time;
    1.13    double _max_region_time;
    1.14 @@ -1819,19 +1819,19 @@
    1.15    G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1,
    1.16                               int worker_num,
    1.17                               FreeRegionList* local_cleanup_list,
    1.18 -                             OldRegionSet* old_proxy_set,
    1.19 -                             HumongousRegionSet* humongous_proxy_set,
    1.20                               HRRSCleanupTask* hrrs_cleanup_task) :
    1.21      _g1(g1), _worker_num(worker_num),
    1.22      _max_live_bytes(0), _regions_claimed(0),
    1.23      _freed_bytes(0),
    1.24      _claimed_region_time(0.0), _max_region_time(0.0),
    1.25      _local_cleanup_list(local_cleanup_list),
    1.26 -    _old_proxy_set(old_proxy_set),
    1.27 -    _humongous_proxy_set(humongous_proxy_set),
    1.28 +    _old_regions_removed(),
    1.29 +    _humongous_regions_removed(),
    1.30      _hrrs_cleanup_task(hrrs_cleanup_task) { }
    1.31  
    1.32    size_t freed_bytes() { return _freed_bytes; }
    1.33 +  const HeapRegionSetCount& old_regions_removed() { return _old_regions_removed; }
    1.34 +  const HeapRegionSetCount& humongous_regions_removed() { return _humongous_regions_removed; }
    1.35  
    1.36    bool doHeapRegion(HeapRegion *hr) {
    1.37      if (hr->continuesHumongous()) {
    1.38 @@ -1844,13 +1844,22 @@
    1.39      _regions_claimed++;
    1.40      hr->note_end_of_marking();
    1.41      _max_live_bytes += hr->max_live_bytes();
    1.42 -    _g1->free_region_if_empty(hr,
    1.43 -                              &_freed_bytes,
    1.44 -                              _local_cleanup_list,
    1.45 -                              _old_proxy_set,
    1.46 -                              _humongous_proxy_set,
    1.47 -                              _hrrs_cleanup_task,
    1.48 -                              true /* par */);
    1.49 +
    1.50 +    if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) {
    1.51 +      _freed_bytes += hr->used();
    1.52 +      hr->set_containing_set(NULL);
    1.53 +      if (hr->isHumongous()) {
    1.54 +        assert(hr->startsHumongous(), "we should only see starts humongous");
    1.55 +        _humongous_regions_removed.increment(1u, hr->capacity());
    1.56 +        _g1->free_humongous_region(hr, _local_cleanup_list, true);
    1.57 +      } else {
    1.58 +        _old_regions_removed.increment(1u, hr->capacity());
    1.59 +        _g1->free_region(hr, _local_cleanup_list, true);
    1.60 +      }
    1.61 +    } else {
    1.62 +      hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task);
    1.63 +    }
    1.64 +
    1.65      double region_time = (os::elapsedTime() - start);
    1.66      _claimed_region_time += region_time;
    1.67      if (region_time > _max_region_time) {
    1.68 @@ -1883,12 +1892,8 @@
    1.69    void work(uint worker_id) {
    1.70      double start = os::elapsedTime();
    1.71      FreeRegionList local_cleanup_list("Local Cleanup List");
    1.72 -    OldRegionSet old_proxy_set("Local Cleanup Old Proxy Set");
    1.73 -    HumongousRegionSet humongous_proxy_set("Local Cleanup Humongous Proxy Set");
    1.74      HRRSCleanupTask hrrs_cleanup_task;
    1.75      G1NoteEndOfConcMarkClosure g1_note_end(_g1h, worker_id, &local_cleanup_list,
    1.76 -                                           &old_proxy_set,
    1.77 -                                           &humongous_proxy_set,
    1.78                                             &hrrs_cleanup_task);
    1.79      if (G1CollectedHeap::use_parallel_gc_threads()) {
    1.80        _g1h->heap_region_par_iterate_chunked(&g1_note_end, worker_id,
    1.81 @@ -1900,13 +1905,10 @@
    1.82      assert(g1_note_end.complete(), "Shouldn't have yielded!");
    1.83  
    1.84      // Now update the lists
    1.85 -    _g1h->update_sets_after_freeing_regions(g1_note_end.freed_bytes(),
    1.86 -                                            NULL /* free_list */,
    1.87 -                                            &old_proxy_set,
    1.88 -                                            &humongous_proxy_set,
    1.89 -                                            true /* par */);
    1.90 +    _g1h->remove_from_old_sets(g1_note_end.old_regions_removed(), g1_note_end.humongous_regions_removed());
    1.91      {
    1.92        MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
    1.93 +      _g1h->decrement_summary_bytes(g1_note_end.freed_bytes());
    1.94        _max_live_bytes += g1_note_end.max_live_bytes();
    1.95        _freed_bytes += g1_note_end.freed_bytes();
    1.96  
    1.97 @@ -1920,7 +1922,7 @@
    1.98  
    1.99        G1HRPrinter* hr_printer = _g1h->hr_printer();
   1.100        if (hr_printer->is_active()) {
   1.101 -        HeapRegionLinkedListIterator iter(&local_cleanup_list);
   1.102 +        FreeRegionListIterator iter(&local_cleanup_list);
   1.103          while (iter.more_available()) {
   1.104            HeapRegion* hr = iter.get_next();
   1.105            hr_printer->cleanup(hr);
   1.106 @@ -1971,7 +1973,6 @@
   1.107      return;
   1.108    }
   1.109  
   1.110 -  HRSPhaseSetter x(HRSPhaseCleanup);
   1.111    g1h->verify_region_sets_optional();
   1.112  
   1.113    if (VerifyDuringGC) {
   1.114 @@ -2144,7 +2145,7 @@
   1.115  
   1.116    G1CollectedHeap* g1h = G1CollectedHeap::heap();
   1.117  
   1.118 -  _cleanup_list.verify_optional();
   1.119 +  _cleanup_list.verify_list();
   1.120    FreeRegionList tmp_free_list("Tmp Free List");
   1.121  
   1.122    if (G1ConcRegionFreeingVerbose) {

mercurial