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

Print this page
rev 3986 : 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
Summary: Refactor G1's hot card cache and card counts table into their own files. Simplify the card counts table, including removing the encoding of the card index in each entry. The card counts table now has a 1:1 correspondence with the cards spanned by heap. Space for the card counts table is reserved from virtual memory (rather than C heap) during JVM startup and is committed/expanded when the heap is expanded.
Reviewed-by:
   1 /*
   2  * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "gc_implementation/g1/bufferingOopClosure.hpp"
  27 #include "gc_implementation/g1/concurrentG1Refine.hpp"
  28 #include "gc_implementation/g1/concurrentG1RefineThread.hpp"
  29 #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
  30 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
  31 #include "gc_implementation/g1/g1CollectorPolicy.hpp"

  32 #include "gc_implementation/g1/g1GCPhaseTimes.hpp"
  33 #include "gc_implementation/g1/g1OopClosures.inline.hpp"
  34 #include "gc_implementation/g1/g1RemSet.inline.hpp"
  35 #include "gc_implementation/g1/heapRegionSeq.inline.hpp"
  36 #include "memory/iterator.hpp"
  37 #include "oops/oop.inline.hpp"
  38 #include "utilities/intHisto.hpp"
  39 
  40 #define CARD_REPEAT_HISTO 0
  41 
  42 #if CARD_REPEAT_HISTO
  43 static size_t ct_freq_sz;
  44 static jbyte* ct_freq = NULL;
  45 
  46 void init_ct_freq_table(size_t heap_sz_bytes) {
  47   if (ct_freq == NULL) {
  48     ct_freq_sz = heap_sz_bytes/CardTableModRefBS::card_size;
  49     ct_freq = new jbyte[ct_freq_sz];
  50     for (size_t j = 0; j < ct_freq_sz; j++) ct_freq[j] = 0;
  51   }


 231 // Closure used for updating RSets and recording references that
 232 // point into the collection set. Only called during an
 233 // evacuation pause.
 234 
 235 class RefineRecordRefsIntoCSCardTableEntryClosure: public CardTableEntryClosure {
 236   G1RemSet* _g1rs;
 237   DirtyCardQueue* _into_cset_dcq;
 238 public:
 239   RefineRecordRefsIntoCSCardTableEntryClosure(G1CollectedHeap* g1h,
 240                                               DirtyCardQueue* into_cset_dcq) :
 241     _g1rs(g1h->g1_rem_set()), _into_cset_dcq(into_cset_dcq)
 242   {}
 243   bool do_card_ptr(jbyte* card_ptr, int worker_i) {
 244     // The only time we care about recording cards that
 245     // contain references that point into the collection set
 246     // is during RSet updating within an evacuation pause.
 247     // In this case worker_i should be the id of a GC worker thread.
 248     assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause");
 249     assert(worker_i < (int) (ParallelGCThreads == 0 ? 1 : ParallelGCThreads), "should be a GC worker");
 250 
 251     if (_g1rs->concurrentRefineOneCard(card_ptr, worker_i, true)) {
 252       // 'card_ptr' contains references that point into the collection
 253       // set. We need to record the card in the DCQS
 254       // (G1CollectedHeap::into_cset_dirty_card_queue_set())
 255       // that's used for that purpose.
 256       //
 257       // Enqueue the card
 258       _into_cset_dcq->enqueue(card_ptr);
 259     }
 260     return true;
 261   }
 262 };
 263 
 264 void G1RemSet::updateRS(DirtyCardQueue* into_cset_dcq, int worker_i) {
 265   double start = os::elapsedTime();
 266   // Apply the given closure to all remaining log entries.
 267   RefineRecordRefsIntoCSCardTableEntryClosure into_cset_update_rs_cl(_g1, into_cset_dcq);
 268 
 269   _g1->iterate_dirty_card_closure(&into_cset_update_rs_cl, into_cset_dcq, false, worker_i);
 270 
 271   // Now there should be no dirty cards.
 272   if (G1RSLogCheckCardTable) {
 273     CountNonCleanMemRegionClosure cl(_g1);
 274     _ct_bs->mod_card_iterate(&cl);
 275     // XXX This isn't true any more: keeping cards of young regions
 276     // marked dirty broke it.  Need some reasonable fix.
 277     guarantee(cl.n() == 0, "Card table should be clean.");
 278   }
 279 
 280   _g1p->phase_times()->record_update_rs_time(worker_i, (os::elapsedTime() - start) * 1000.0);
 281 }
 282 
 283 void G1RemSet::cleanupHRRS() {
 284   HeapRegionRemSet::cleanup();
 285 }
 286 
 287 void G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc,
 288                                              int worker_i) {
 289 #if CARD_REPEAT_HISTO
 290   ct_freq_update_histo_and_reset();
 291 #endif
 292   if (worker_i == 0) {
 293     _cg1r->clear_and_record_card_counts();
 294   }
 295 
 296   // We cache the value of 'oc' closure into the appropriate slot in the
 297   // _cset_rs_update_cl for this worker
 298   assert(worker_i < (int)n_workers(), "sanity");
 299   _cset_rs_update_cl[worker_i] = oc;
 300 
 301   // A DirtyCardQueue that is used to hold cards containing references
 302   // that point into the collection set. This DCQ is associated with a
 303   // special DirtyCardQueueSet (see g1CollectedHeap.hpp).  Under normal
 304   // circumstances (i.e. the pause successfully completes), these cards
 305   // are just discarded (there's no need to update the RSets of regions
 306   // that were in the collection set - after the pause these regions
 307   // are wholly 'free' of live objects. In the event of an evacuation
 308   // failure the cards/buffers in this queue set are:
 309   // * passed to the DirtyCardQueueSet that is used to manage deferred
 310   //   RSet updates, or
 311   // * scanned for references that point into the collection set
 312   //   and the RSet of the corresponding region in the collection set
 313   //   is updated immediately.
 314   DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());


 380     assert(r != NULL, "unexpected null");
 381 
 382     // Scan oops in the card looking for references into the collection set
 383     // Don't use addr_for(card_ptr + 1) which can ask for
 384     // a card beyond the heap.  This is not safe without a perm
 385     // gen.
 386     HeapWord* end   = start + CardTableModRefBS::card_size_in_words;
 387     MemRegion scanRegion(start, end);
 388 
 389     UpdateRSetImmediate update_rs_cl(_g1->g1_rem_set());
 390     FilterIntoCSClosure update_rs_cset_oop_cl(NULL, _g1, &update_rs_cl);
 391     FilterOutOfRegionClosure filter_then_update_rs_cset_oop_cl(r, &update_rs_cset_oop_cl);
 392 
 393     // We can pass false as the "filter_young" parameter here as:
 394     // * we should be in a STW pause,
 395     // * the DCQS to which this closure is applied is used to hold
 396     //   references that point into the collection set from the prior
 397     //   RSet updating,
 398     // * the post-write barrier shouldn't be logging updates to young
 399     //   regions (but there is a situation where this can happen - see
 400     //   the comment in G1RemSet::concurrentRefineOneCard below -
 401     //   that should not be applicable here), and
 402     // * during actual RSet updating, the filtering of cards in young
 403     //   regions in HeapRegion::oops_on_card_seq_iterate_careful is
 404     //   employed.
 405     // As a result, when this closure is applied to "refs into cset"
 406     // DCQS, we shouldn't see any cards in young regions.
 407     update_rs_cl.set_region(r);
 408     HeapWord* stop_point =
 409       r->oops_on_card_seq_iterate_careful(scanRegion,
 410                                           &filter_then_update_rs_cset_oop_cl,
 411                                           false /* filter_young */,
 412                                           NULL  /* card_ptr */);
 413 
 414     // Since this is performed in the event of an evacuation failure, we
 415     // we shouldn't see a non-null stop point
 416     assert(stop_point == NULL, "saw an unallocated region");
 417     return true;
 418   }
 419 };
 420 


 486       r->rem_set()->scrub(_ctbs, _region_bm, _card_bm);
 487     }
 488     return false;
 489   }
 490 };
 491 
 492 void G1RemSet::scrub(BitMap* region_bm, BitMap* card_bm) {
 493   ScrubRSClosure scrub_cl(region_bm, card_bm);
 494   _g1->heap_region_iterate(&scrub_cl);
 495 }
 496 
 497 void G1RemSet::scrub_par(BitMap* region_bm, BitMap* card_bm,
 498                                 uint worker_num, int claim_val) {
 499   ScrubRSClosure scrub_cl(region_bm, card_bm);
 500   _g1->heap_region_par_iterate_chunked(&scrub_cl,
 501                                        worker_num,
 502                                        n_workers(),
 503                                        claim_val);
 504 }
 505 
 506 
 507 
 508 G1TriggerClosure::G1TriggerClosure() :
 509   _triggered(false) { }
 510 
 511 G1InvokeIfNotTriggeredClosure::G1InvokeIfNotTriggeredClosure(G1TriggerClosure* t_cl,
 512                                                              OopClosure* oop_cl)  :
 513   _trigger_cl(t_cl), _oop_cl(oop_cl) { }
 514 
 515 G1Mux2Closure::G1Mux2Closure(OopClosure *c1, OopClosure *c2) :
 516   _c1(c1), _c2(c2) { }
 517 
 518 G1UpdateRSOrPushRefOopClosure::
 519 G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h,
 520                               G1RemSet* rs,
 521                               OopsInHeapRegionClosure* push_ref_cl,
 522                               bool record_refs_into_cset,
 523                               int worker_i) :
 524   _g1(g1h), _g1_rem_set(rs), _from(NULL),
 525   _record_refs_into_cset(record_refs_into_cset),
 526   _push_ref_cl(push_ref_cl), _worker_i(worker_i) { }
 527 
 528 bool G1RemSet::concurrentRefineOneCard_impl(jbyte* card_ptr, int worker_i,

 529                                                    bool check_for_refs_into_cset) {




 530   // Construct the region representing the card.
 531   HeapWord* start = _ct_bs->addr_for(card_ptr);
 532   // And find the region containing it.
 533   HeapRegion* r = _g1->heap_region_containing(start);
 534   assert(r != NULL, "unexpected null");
 535 
 536   // Don't use addr_for(card_ptr + 1) which can ask for
 537   // a card beyond the heap.  This is not safe without a perm
 538   // gen at the upper end of the heap.
 539   HeapWord* end   = start + CardTableModRefBS::card_size_in_words;
 540   MemRegion dirtyRegion(start, end);
 541 
 542 #if CARD_REPEAT_HISTO
 543   init_ct_freq_table(_g1->max_capacity());
 544   ct_freq_note_card(_ct_bs->index_for(start));
 545 #endif
 546 
 547   OopsInHeapRegionClosure* oops_in_heap_closure = NULL;
 548   if (check_for_refs_into_cset) {
 549     // ConcurrentG1RefineThreads have worker numbers larger than what


 597   // unallocated portion will be filled in.  Alternatively, we might try
 598   // the full complexity of the technique used in "regular" precleaning.
 599   if (stop_point != NULL) {
 600     // The card might have gotten re-dirtied and re-enqueued while we
 601     // worked.  (In fact, it's pretty likely.)
 602     if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 603       *card_ptr = CardTableModRefBS::dirty_card_val();
 604       MutexLockerEx x(Shared_DirtyCardQ_lock,
 605                       Mutex::_no_safepoint_check_flag);
 606       DirtyCardQueue* sdcq =
 607         JavaThread::dirty_card_queue_set().shared_dirty_card_queue();
 608       sdcq->enqueue(card_ptr);
 609     }
 610   } else {
 611     _conc_refine_cards++;
 612   }
 613 
 614   return trigger_cl.triggered();
 615 }
 616 
 617 bool G1RemSet::concurrentRefineOneCard(jbyte* card_ptr, int worker_i,
 618                                               bool check_for_refs_into_cset) {

 619   // If the card is no longer dirty, nothing to do.
 620   if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 621     // No need to return that this card contains refs that point
 622     // into the collection set.
 623     return false;
 624   }
 625 
 626   // Construct the region representing the card.
 627   HeapWord* start = _ct_bs->addr_for(card_ptr);
 628   // And find the region containing it.
 629   HeapRegion* r = _g1->heap_region_containing(start);
 630   if (r == NULL) {
 631     // Again no need to return that this card contains refs that
 632     // point into the collection set.
 633     return false;  // Not in the G1 heap (might be in perm, for example.)
 634   }

 635   // Why do we have to check here whether a card is on a young region,
 636   // given that we dirty young regions and, as a result, the
 637   // post-barrier is supposed to filter them out and never to enqueue
 638   // them? When we allocate a new region as the "allocation region" we
 639   // actually dirty its cards after we release the lock, since card
 640   // dirtying while holding the lock was a performance bottleneck. So,
 641   // as a result, it is possible for other threads to actually
 642   // allocate objects in the region (after the acquire the lock)
 643   // before all the cards on the region are dirtied. This is unlikely,
 644   // and it doesn't happen often, but it can happen. So, the extra
 645   // check below filters out those cards.
 646   if (r->is_young()) {
 647     return false;
 648   }

 649   // While we are processing RSet buffers during the collection, we
 650   // actually don't want to scan any cards on the collection set,
 651   // since we don't want to update remebered sets with entries that
 652   // point into the collection set, given that live objects from the
 653   // collection set are about to move and such entries will be stale
 654   // very soon. This change also deals with a reliability issue which
 655   // involves scanning a card in the collection set and coming across
 656   // an array that was being chunked and looking malformed. Note,
 657   // however, that if evacuation fails, we have to scan any objects
 658   // that were not moved and create any missing entries.
 659   if (r->in_collection_set()) {
 660     return false;
 661   }
 662 
 663   // Should we defer processing the card?
 664   //
 665   // Previously the result from the insert_cache call would be
 666   // either card_ptr (implying that card_ptr was currently "cold"),
 667   // null (meaning we had inserted the card ptr into the "hot"
 668   // cache, which had some headroom), or a "hot" card ptr
 669   // extracted from the "hot" cache.
 670   //
 671   // Now that the _card_counts cache in the ConcurrentG1Refine
 672   // instance is an evicting hash table, the result we get back
 673   // could be from evicting the card ptr in an already occupied
 674   // bucket (in which case we have replaced the card ptr in the
 675   // bucket with card_ptr and "defer" is set to false). To avoid
 676   // having a data structure (updates to which would need a lock)
 677   // to hold these unprocessed dirty cards, we need to immediately
 678   // process card_ptr. The actions needed to be taken on return
 679   // from cache_insert are summarized in the following table:
 680   //
 681   // res      defer   action
 682   // --------------------------------------------------------------
 683   // null     false   card evicted from _card_counts & replaced with
 684   //                  card_ptr; evicted ptr added to hot cache.
 685   //                  No need to process res; immediately process card_ptr
 686   //
 687   // null     true    card not evicted from _card_counts; card_ptr added
 688   //                  to hot cache.
 689   //                  Nothing to do.
 690   //
 691   // non-null false   card evicted from _card_counts & replaced with
 692   //                  card_ptr; evicted ptr is currently "cold" or
 693   //                  caused an eviction from the hot cache.
 694   //                  Immediately process res; process card_ptr.
 695   //
 696   // non-null true    card not evicted from _card_counts; card_ptr is
 697   //                  currently cold, or caused an eviction from hot
 698   //                  cache.
 699   //                  Immediately process res; no need to process card_ptr.
 700 
 701 
 702   jbyte* res = card_ptr;
 703   bool defer = false;
 704 
 705   // This gets set to true if the card being refined has references
 706   // that point into the collection set.
 707   bool oops_into_cset = false;
 708 
 709   if (_cg1r->use_cache()) {
 710     jbyte* res = _cg1r->cache_insert(card_ptr, &defer);
 711     if (res != NULL && (res != card_ptr || defer)) {
 712       start = _ct_bs->addr_for(res);
 713       r = _g1->heap_region_containing(start);
 714       if (r != NULL) {




 715         // Checking whether the region we got back from the cache
 716         // is young here is inappropriate. The region could have been
 717         // freed, reallocated and tagged as young while in the cache.
 718         // Hence we could see its young type change at any time.
 719         //
 720         // Process card pointer we get back from the hot card cache. This
 721         // will check whether the region containing the card is young
 722         // _after_ checking that the region has been allocated from.
 723         oops_into_cset = concurrentRefineOneCard_impl(res, worker_i,
 724                                                       false /* check_for_refs_into_cset */);
 725         // The above call to concurrentRefineOneCard_impl is only
 726         // performed if the hot card cache is enabled. This cache is
 727         // disabled during an evacuation pause - which is the only
 728         // time when we need know if the card contains references
 729         // that point into the collection set. Also when the hot card
 730         // cache is enabled, this code is executed by the concurrent
 731         // refine threads - rather than the GC worker threads - and
 732         // concurrentRefineOneCard_impl will return false.
 733         assert(!oops_into_cset, "should not see true here");
 734       }
 735     }
 736   }
 737 
 738   if (!defer) {
 739     oops_into_cset =
 740       concurrentRefineOneCard_impl(card_ptr, worker_i, check_for_refs_into_cset);
 741     // We should only be detecting that the card contains references
 742     // that point into the collection set if the current thread is
 743     // a GC worker thread.
 744     assert(!oops_into_cset || SafepointSynchronize::is_at_safepoint(),
 745            "invalid result at non safepoint");
 746   }
 747   return oops_into_cset;
 748 }
 749 
 750 class HRRSStatsIter: public HeapRegionClosure {
 751   size_t _occupied;
 752   size_t _total_mem_sz;
 753   size_t _max_mem_sz;
 754   HeapRegion* _max_mem_sz_region;
 755 public:
 756   HRRSStatsIter() :
 757     _occupied(0),
 758     _total_mem_sz(0),
 759     _max_mem_sz(0),
 760     _max_mem_sz_region(NULL)
 761   {}
 762 
 763   bool doHeapRegion(HeapRegion* r) {
 764     if (r->continuesHumongous()) return false;
 765     size_t mem_sz = r->rem_set()->mem_size();
 766     if (mem_sz > _max_mem_sz) {
 767       _max_mem_sz = mem_sz;


 830   HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set();
 831   gclog_or_tty->print_cr("    Max size region = "HR_FORMAT", "
 832                          "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
 833                          HR_FORMAT_PARAMS(max_mem_sz_region),
 834                          (rem_set->mem_size() + K - 1)/K,
 835                          (rem_set->occupied() + K - 1)/K);
 836   gclog_or_tty->print_cr("    Did %d coarsenings.",
 837                          HeapRegionRemSet::n_coarsenings());
 838 }
 839 
 840 void G1RemSet::prepare_for_verify() {
 841   if (G1HRRSFlushLogBuffersOnVerify &&
 842       (VerifyBeforeGC || VerifyAfterGC)
 843       &&  !_g1->full_collection()) {
 844     cleanupHRRS();
 845     _g1->set_refine_cte_cl_concurrency(false);
 846     if (SafepointSynchronize::is_at_safepoint()) {
 847       DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
 848       dcqs.concatenate_logs();
 849     }
 850     bool cg1r_use_cache = _cg1r->use_cache();
 851     _cg1r->set_use_cache(false);



 852     DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
 853     updateRS(&into_cset_dcq, 0);
 854     _g1->into_cset_dirty_card_queue_set().clear();
 855     _cg1r->set_use_cache(cg1r_use_cache);
 856 

 857     assert(JavaThread::dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
 858   }
 859 }
   1 /*
   2  * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "gc_implementation/g1/bufferingOopClosure.hpp"
  27 #include "gc_implementation/g1/concurrentG1Refine.hpp"
  28 #include "gc_implementation/g1/concurrentG1RefineThread.hpp"
  29 #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
  30 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
  31 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
  32 #include "gc_implementation/g1/g1HotCardCache.hpp"
  33 #include "gc_implementation/g1/g1GCPhaseTimes.hpp"
  34 #include "gc_implementation/g1/g1OopClosures.inline.hpp"
  35 #include "gc_implementation/g1/g1RemSet.inline.hpp"
  36 #include "gc_implementation/g1/heapRegionSeq.inline.hpp"
  37 #include "memory/iterator.hpp"
  38 #include "oops/oop.inline.hpp"
  39 #include "utilities/intHisto.hpp"
  40 
  41 #define CARD_REPEAT_HISTO 0
  42 
  43 #if CARD_REPEAT_HISTO
  44 static size_t ct_freq_sz;
  45 static jbyte* ct_freq = NULL;
  46 
  47 void init_ct_freq_table(size_t heap_sz_bytes) {
  48   if (ct_freq == NULL) {
  49     ct_freq_sz = heap_sz_bytes/CardTableModRefBS::card_size;
  50     ct_freq = new jbyte[ct_freq_sz];
  51     for (size_t j = 0; j < ct_freq_sz; j++) ct_freq[j] = 0;
  52   }


 232 // Closure used for updating RSets and recording references that
 233 // point into the collection set. Only called during an
 234 // evacuation pause.
 235 
 236 class RefineRecordRefsIntoCSCardTableEntryClosure: public CardTableEntryClosure {
 237   G1RemSet* _g1rs;
 238   DirtyCardQueue* _into_cset_dcq;
 239 public:
 240   RefineRecordRefsIntoCSCardTableEntryClosure(G1CollectedHeap* g1h,
 241                                               DirtyCardQueue* into_cset_dcq) :
 242     _g1rs(g1h->g1_rem_set()), _into_cset_dcq(into_cset_dcq)
 243   {}
 244   bool do_card_ptr(jbyte* card_ptr, int worker_i) {
 245     // The only time we care about recording cards that
 246     // contain references that point into the collection set
 247     // is during RSet updating within an evacuation pause.
 248     // In this case worker_i should be the id of a GC worker thread.
 249     assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause");
 250     assert(worker_i < (int) (ParallelGCThreads == 0 ? 1 : ParallelGCThreads), "should be a GC worker");
 251 
 252     if (_g1rs->refine_card(card_ptr, worker_i, true)) {
 253       // 'card_ptr' contains references that point into the collection
 254       // set. We need to record the card in the DCQS
 255       // (G1CollectedHeap::into_cset_dirty_card_queue_set())
 256       // that's used for that purpose.
 257       //
 258       // Enqueue the card
 259       _into_cset_dcq->enqueue(card_ptr);
 260     }
 261     return true;
 262   }
 263 };
 264 
 265 void G1RemSet::updateRS(DirtyCardQueue* into_cset_dcq, int worker_i) {
 266   double start = os::elapsedTime();
 267   // Apply the given closure to all remaining log entries.
 268   RefineRecordRefsIntoCSCardTableEntryClosure into_cset_update_rs_cl(_g1, into_cset_dcq);
 269 
 270   _g1->iterate_dirty_card_closure(&into_cset_update_rs_cl, into_cset_dcq, false, worker_i);
 271 
 272   // Now there should be no dirty cards.
 273   if (G1RSLogCheckCardTable) {
 274     CountNonCleanMemRegionClosure cl(_g1);
 275     _ct_bs->mod_card_iterate(&cl);
 276     // XXX This isn't true any more: keeping cards of young regions
 277     // marked dirty broke it.  Need some reasonable fix.
 278     guarantee(cl.n() == 0, "Card table should be clean.");
 279   }
 280 
 281   _g1p->phase_times()->record_update_rs_time(worker_i, (os::elapsedTime() - start) * 1000.0);
 282 }
 283 
 284 void G1RemSet::cleanupHRRS() {
 285   HeapRegionRemSet::cleanup();
 286 }
 287 
 288 void G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc,
 289                                              int worker_i) {
 290 #if CARD_REPEAT_HISTO
 291   ct_freq_update_histo_and_reset();
 292 #endif



 293 
 294   // We cache the value of 'oc' closure into the appropriate slot in the
 295   // _cset_rs_update_cl for this worker
 296   assert(worker_i < (int)n_workers(), "sanity");
 297   _cset_rs_update_cl[worker_i] = oc;
 298 
 299   // A DirtyCardQueue that is used to hold cards containing references
 300   // that point into the collection set. This DCQ is associated with a
 301   // special DirtyCardQueueSet (see g1CollectedHeap.hpp).  Under normal
 302   // circumstances (i.e. the pause successfully completes), these cards
 303   // are just discarded (there's no need to update the RSets of regions
 304   // that were in the collection set - after the pause these regions
 305   // are wholly 'free' of live objects. In the event of an evacuation
 306   // failure the cards/buffers in this queue set are:
 307   // * passed to the DirtyCardQueueSet that is used to manage deferred
 308   //   RSet updates, or
 309   // * scanned for references that point into the collection set
 310   //   and the RSet of the corresponding region in the collection set
 311   //   is updated immediately.
 312   DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());


 378     assert(r != NULL, "unexpected null");
 379 
 380     // Scan oops in the card looking for references into the collection set
 381     // Don't use addr_for(card_ptr + 1) which can ask for
 382     // a card beyond the heap.  This is not safe without a perm
 383     // gen.
 384     HeapWord* end   = start + CardTableModRefBS::card_size_in_words;
 385     MemRegion scanRegion(start, end);
 386 
 387     UpdateRSetImmediate update_rs_cl(_g1->g1_rem_set());
 388     FilterIntoCSClosure update_rs_cset_oop_cl(NULL, _g1, &update_rs_cl);
 389     FilterOutOfRegionClosure filter_then_update_rs_cset_oop_cl(r, &update_rs_cset_oop_cl);
 390 
 391     // We can pass false as the "filter_young" parameter here as:
 392     // * we should be in a STW pause,
 393     // * the DCQS to which this closure is applied is used to hold
 394     //   references that point into the collection set from the prior
 395     //   RSet updating,
 396     // * the post-write barrier shouldn't be logging updates to young
 397     //   regions (but there is a situation where this can happen - see
 398     //   the comment in G1RemSet::refine_card() below -
 399     //   that should not be applicable here), and
 400     // * during actual RSet updating, the filtering of cards in young
 401     //   regions in HeapRegion::oops_on_card_seq_iterate_careful is
 402     //   employed.
 403     // As a result, when this closure is applied to "refs into cset"
 404     // DCQS, we shouldn't see any cards in young regions.
 405     update_rs_cl.set_region(r);
 406     HeapWord* stop_point =
 407       r->oops_on_card_seq_iterate_careful(scanRegion,
 408                                           &filter_then_update_rs_cset_oop_cl,
 409                                           false /* filter_young */,
 410                                           NULL  /* card_ptr */);
 411 
 412     // Since this is performed in the event of an evacuation failure, we
 413     // we shouldn't see a non-null stop point
 414     assert(stop_point == NULL, "saw an unallocated region");
 415     return true;
 416   }
 417 };
 418 


 484       r->rem_set()->scrub(_ctbs, _region_bm, _card_bm);
 485     }
 486     return false;
 487   }
 488 };
 489 
 490 void G1RemSet::scrub(BitMap* region_bm, BitMap* card_bm) {
 491   ScrubRSClosure scrub_cl(region_bm, card_bm);
 492   _g1->heap_region_iterate(&scrub_cl);
 493 }
 494 
 495 void G1RemSet::scrub_par(BitMap* region_bm, BitMap* card_bm,
 496                                 uint worker_num, int claim_val) {
 497   ScrubRSClosure scrub_cl(region_bm, card_bm);
 498   _g1->heap_region_par_iterate_chunked(&scrub_cl,
 499                                        worker_num,
 500                                        n_workers(),
 501                                        claim_val);
 502 }
 503 


 504 G1TriggerClosure::G1TriggerClosure() :
 505   _triggered(false) { }
 506 
 507 G1InvokeIfNotTriggeredClosure::G1InvokeIfNotTriggeredClosure(G1TriggerClosure* t_cl,
 508                                                              OopClosure* oop_cl)  :
 509   _trigger_cl(t_cl), _oop_cl(oop_cl) { }
 510 
 511 G1Mux2Closure::G1Mux2Closure(OopClosure *c1, OopClosure *c2) :
 512   _c1(c1), _c2(c2) { }
 513 
 514 G1UpdateRSOrPushRefOopClosure::
 515 G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h,
 516                               G1RemSet* rs,
 517                               OopsInHeapRegionClosure* push_ref_cl,
 518                               bool record_refs_into_cset,
 519                               int worker_i) :
 520   _g1(g1h), _g1_rem_set(rs), _from(NULL),
 521   _record_refs_into_cset(record_refs_into_cset),
 522   _push_ref_cl(push_ref_cl), _worker_i(worker_i) { }
 523 
 524 
 525 bool G1RemSet::refine_card_helper(jbyte* card_ptr, int worker_i,
 526                                   bool check_for_refs_into_cset) {
 527   // Returns true if the given card contains references that point
 528   // into the collection set, if we're checking for such references;
 529   // false otherwise.
 530 
 531   // Construct the region representing the card.
 532   HeapWord* start = _ct_bs->addr_for(card_ptr);
 533   // And find the region containing it.
 534   HeapRegion* r = _g1->heap_region_containing(start);
 535   assert(r != NULL, "unexpected null");
 536 
 537   // Don't use addr_for(card_ptr + 1) which can ask for
 538   // a card beyond the heap.  This is not safe without a perm
 539   // gen at the upper end of the heap.
 540   HeapWord* end   = start + CardTableModRefBS::card_size_in_words;
 541   MemRegion dirtyRegion(start, end);
 542 
 543 #if CARD_REPEAT_HISTO
 544   init_ct_freq_table(_g1->max_capacity());
 545   ct_freq_note_card(_ct_bs->index_for(start));
 546 #endif
 547 
 548   OopsInHeapRegionClosure* oops_in_heap_closure = NULL;
 549   if (check_for_refs_into_cset) {
 550     // ConcurrentG1RefineThreads have worker numbers larger than what


 598   // unallocated portion will be filled in.  Alternatively, we might try
 599   // the full complexity of the technique used in "regular" precleaning.
 600   if (stop_point != NULL) {
 601     // The card might have gotten re-dirtied and re-enqueued while we
 602     // worked.  (In fact, it's pretty likely.)
 603     if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 604       *card_ptr = CardTableModRefBS::dirty_card_val();
 605       MutexLockerEx x(Shared_DirtyCardQ_lock,
 606                       Mutex::_no_safepoint_check_flag);
 607       DirtyCardQueue* sdcq =
 608         JavaThread::dirty_card_queue_set().shared_dirty_card_queue();
 609       sdcq->enqueue(card_ptr);
 610     }
 611   } else {
 612     _conc_refine_cards++;
 613   }
 614 
 615   return trigger_cl.triggered();
 616 }
 617 
 618 bool G1RemSet::refine_card(jbyte* card_ptr, int worker_i,
 619                            bool check_for_refs_into_cset) {
 620 
 621   // If the card is no longer dirty, nothing to do.
 622   if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 623     // No need to return that this card contains refs that point
 624     // into the collection set.
 625     return false;
 626   }
 627 
 628   // Construct the region representing the card.
 629   HeapWord* start = _ct_bs->addr_for(card_ptr);
 630   // And find the region containing it.
 631   HeapRegion* r = _g1->heap_region_containing(start);
 632   if (r == NULL) {
 633     // Again no need to return that this card contains refs that
 634     // point into the collection set.
 635     return false;  // Not in the G1 heap (might be in perm, for example.)
 636   }
 637 
 638   // Why do we have to check here whether a card is on a young region,
 639   // given that we dirty young regions and, as a result, the
 640   // post-barrier is supposed to filter them out and never to enqueue
 641   // them? When we allocate a new region as the "allocation region" we
 642   // actually dirty its cards after we release the lock, since card
 643   // dirtying while holding the lock was a performance bottleneck. So,
 644   // as a result, it is possible for other threads to actually
 645   // allocate objects in the region (after the acquire the lock)
 646   // before all the cards on the region are dirtied. This is unlikely,
 647   // and it doesn't happen often, but it can happen. So, the extra
 648   // check below filters out those cards.
 649   if (r->is_young()) {
 650     return false;
 651   }
 652 
 653   // While we are processing RSet buffers during the collection, we
 654   // actually don't want to scan any cards on the collection set,
 655   // since we don't want to update remebered sets with entries that
 656   // point into the collection set, given that live objects from the
 657   // collection set are about to move and such entries will be stale
 658   // very soon. This change also deals with a reliability issue which
 659   // involves scanning a card in the collection set and coming across
 660   // an array that was being chunked and looking malformed. Note,
 661   // however, that if evacuation fails, we have to scan any objects
 662   // that were not moved and create any missing entries.
 663   if (r->in_collection_set()) {
 664     return false;
 665   }
 666 
 667   // The result from the hot card cache insert call is either:
 668   //   * pointer to the current card
 669   //     (implying that the current card is not 'hot'),
 670   //   * null
 671   //     (meaning we had inserted the card ptr into the "hot" card cache,
 672   //     which had some headroom),
 673   //   * a pointer to a "hot" card that was evicted from the "hot" cache.

























 674   //
 675 
 676   // This gets set to true if the card being refined has
 677   // references that point into the collection set.
 678   bool has_refs_into_cset = false;
 679 
 680   G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
 681   if (hot_card_cache->use_cache()) {
 682     assert(!check_for_refs_into_cset, "sanity");
 683     assert(!SafepointSynchronize::is_at_safepoint(), "sanity");
 684 
 685     card_ptr = hot_card_cache->insert(card_ptr);
 686     if (card_ptr == NULL) {
 687       // There was no eviction. Nothing to do.
 688       return has_refs_into_cset;
 689     }
 690 
 691     start = _ct_bs->addr_for(card_ptr);
 692     r = _g1->heap_region_containing(start);
 693     if (r == NULL) {
 694       // Not in the G1 heap
 695       return has_refs_into_cset;
 696     }
 697 
 698     // Checking whether the region we got back from the cache
 699     // is young here is inappropriate. The region could have been
 700     // freed, reallocated and tagged as young while in the cache.
 701     // Hence we could see its young type change at any time.

















 702   }
 703 
 704   has_refs_into_cset = refine_card_helper(card_ptr, worker_i,
 705                                           check_for_refs_into_cset);

 706   // We should only be detecting that the card contains references
 707   // that point into the collection set if the current thread is
 708   // a GC worker thread.
 709   assert(!has_refs_into_cset || SafepointSynchronize::is_at_safepoint(),
 710            "invalid result at non safepoint");
 711 
 712   return has_refs_into_cset;
 713 }
 714 
 715 class HRRSStatsIter: public HeapRegionClosure {
 716   size_t _occupied;
 717   size_t _total_mem_sz;
 718   size_t _max_mem_sz;
 719   HeapRegion* _max_mem_sz_region;
 720 public:
 721   HRRSStatsIter() :
 722     _occupied(0),
 723     _total_mem_sz(0),
 724     _max_mem_sz(0),
 725     _max_mem_sz_region(NULL)
 726   {}
 727 
 728   bool doHeapRegion(HeapRegion* r) {
 729     if (r->continuesHumongous()) return false;
 730     size_t mem_sz = r->rem_set()->mem_size();
 731     if (mem_sz > _max_mem_sz) {
 732       _max_mem_sz = mem_sz;


 795   HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set();
 796   gclog_or_tty->print_cr("    Max size region = "HR_FORMAT", "
 797                          "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
 798                          HR_FORMAT_PARAMS(max_mem_sz_region),
 799                          (rem_set->mem_size() + K - 1)/K,
 800                          (rem_set->occupied() + K - 1)/K);
 801   gclog_or_tty->print_cr("    Did %d coarsenings.",
 802                          HeapRegionRemSet::n_coarsenings());
 803 }
 804 
 805 void G1RemSet::prepare_for_verify() {
 806   if (G1HRRSFlushLogBuffersOnVerify &&
 807       (VerifyBeforeGC || VerifyAfterGC)
 808       &&  !_g1->full_collection()) {
 809     cleanupHRRS();
 810     _g1->set_refine_cte_cl_concurrency(false);
 811     if (SafepointSynchronize::is_at_safepoint()) {
 812       DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
 813       dcqs.concatenate_logs();
 814     }
 815 
 816     G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
 817     bool use_hot_card_cache = hot_card_cache->use_cache();
 818     hot_card_cache->set_use_cache(false);
 819 
 820     DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
 821     updateRS(&into_cset_dcq, 0);
 822     _g1->into_cset_dirty_card_queue_set().clear();

 823 
 824     hot_card_cache->set_use_cache(use_hot_card_cache);
 825     assert(JavaThread::dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
 826   }
 827 }