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

Print this page
rev 4561 : 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. Changes were also reviewed-by Vitaly Davidovich.
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   }


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


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


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




 528                                                    bool check_for_refs_into_cset) {








 529   // Construct the region representing the card.
 530   HeapWord* start = _ct_bs->addr_for(card_ptr);
 531   // And find the region containing it.
 532   HeapRegion* r = _g1->heap_region_containing(start);
 533   assert(r != NULL, "unexpected null");


































































 534 
 535   // Don't use addr_for(card_ptr + 1) which can ask for
 536   // a card beyond the heap.  This is not safe without a perm
 537   // gen at the upper end of the heap.
 538   HeapWord* end   = start + CardTableModRefBS::card_size_in_words;
 539   MemRegion dirtyRegion(start, end);
 540 
 541 #if CARD_REPEAT_HISTO
 542   init_ct_freq_table(_g1->max_capacity());
 543   ct_freq_note_card(_ct_bs->index_for(start));
 544 #endif
 545 
 546   OopsInHeapRegionClosure* oops_in_heap_closure = NULL;
 547   if (check_for_refs_into_cset) {
 548     // ConcurrentG1RefineThreads have worker numbers larger than what
 549     // _cset_rs_update_cl[] is set up to handle. But those threads should
 550     // only be active outside of a collection which means that when they
 551     // reach here they should have check_for_refs_into_cset == false.
 552     assert((size_t)worker_i < n_workers(), "index of worker larger than _cset_rs_update_cl[].length");
 553     oops_in_heap_closure = _cset_rs_update_cl[worker_i];


 593   // If stop_point is non-null, then we encountered an unallocated region
 594   // (perhaps the unfilled portion of a TLAB.)  For now, we'll dirty the
 595   // card and re-enqueue: if we put off the card until a GC pause, then the
 596   // unallocated portion will be filled in.  Alternatively, we might try
 597   // the full complexity of the technique used in "regular" precleaning.
 598   if (stop_point != NULL) {
 599     // The card might have gotten re-dirtied and re-enqueued while we
 600     // worked.  (In fact, it's pretty likely.)
 601     if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 602       *card_ptr = CardTableModRefBS::dirty_card_val();
 603       MutexLockerEx x(Shared_DirtyCardQ_lock,
 604                       Mutex::_no_safepoint_check_flag);
 605       DirtyCardQueue* sdcq =
 606         JavaThread::dirty_card_queue_set().shared_dirty_card_queue();
 607       sdcq->enqueue(card_ptr);
 608     }
 609   } else {
 610     _conc_refine_cards++;
 611   }
 612 
 613   return trigger_cl.triggered();
 614 }

 615 
 616 bool G1RemSet::concurrentRefineOneCard(jbyte* card_ptr, int worker_i,
 617                                               bool check_for_refs_into_cset) {
 618   // If the card is no longer dirty, nothing to do.
 619   if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 620     // No need to return that this card contains refs that point
 621     // into the collection set.
 622     return false;
 623   }
 624 
 625   // Construct the region representing the card.
 626   HeapWord* start = _ct_bs->addr_for(card_ptr);
 627   // And find the region containing it.
 628   HeapRegion* r = _g1->heap_region_containing(start);
 629   if (r == NULL) {
 630     // Again no need to return that this card contains refs that
 631     // point into the collection set.
 632     return false;  // Not in the G1 heap (might be in perm, for example.)
 633   }
 634   // Why do we have to check here whether a card is on a young region,
 635   // given that we dirty young regions and, as a result, the
 636   // post-barrier is supposed to filter them out and never to enqueue
 637   // them? When we allocate a new region as the "allocation region" we
 638   // actually dirty its cards after we release the lock, since card
 639   // dirtying while holding the lock was a performance bottleneck. So,
 640   // as a result, it is possible for other threads to actually
 641   // allocate objects in the region (after the acquire the lock)
 642   // before all the cards on the region are dirtied. This is unlikely,
 643   // and it doesn't happen often, but it can happen. So, the extra
 644   // check below filters out those cards.
 645   if (r->is_young()) {
 646     return false;
 647   }
 648   // While we are processing RSet buffers during the collection, we
 649   // actually don't want to scan any cards on the collection set,
 650   // since we don't want to update remebered sets with entries that
 651   // point into the collection set, given that live objects from the
 652   // collection set are about to move and such entries will be stale
 653   // very soon. This change also deals with a reliability issue which
 654   // involves scanning a card in the collection set and coming across
 655   // an array that was being chunked and looking malformed. Note,
 656   // however, that if evacuation fails, we have to scan any objects
 657   // that were not moved and create any missing entries.
 658   if (r->in_collection_set()) {
 659     return false;
 660   }
 661 
 662   // Should we defer processing the card?
 663   //
 664   // Previously the result from the insert_cache call would be
 665   // either card_ptr (implying that card_ptr was currently "cold"),
 666   // null (meaning we had inserted the card ptr into the "hot"
 667   // cache, which had some headroom), or a "hot" card ptr
 668   // extracted from the "hot" cache.
 669   //
 670   // Now that the _card_counts cache in the ConcurrentG1Refine
 671   // instance is an evicting hash table, the result we get back
 672   // could be from evicting the card ptr in an already occupied
 673   // bucket (in which case we have replaced the card ptr in the
 674   // bucket with card_ptr and "defer" is set to false). To avoid
 675   // having a data structure (updates to which would need a lock)
 676   // to hold these unprocessed dirty cards, we need to immediately
 677   // process card_ptr. The actions needed to be taken on return
 678   // from cache_insert are summarized in the following table:
 679   //
 680   // res      defer   action
 681   // --------------------------------------------------------------
 682   // null     false   card evicted from _card_counts & replaced with
 683   //                  card_ptr; evicted ptr added to hot cache.
 684   //                  No need to process res; immediately process card_ptr
 685   //
 686   // null     true    card not evicted from _card_counts; card_ptr added
 687   //                  to hot cache.
 688   //                  Nothing to do.
 689   //
 690   // non-null false   card evicted from _card_counts & replaced with
 691   //                  card_ptr; evicted ptr is currently "cold" or
 692   //                  caused an eviction from the hot cache.
 693   //                  Immediately process res; process card_ptr.
 694   //
 695   // non-null true    card not evicted from _card_counts; card_ptr is
 696   //                  currently cold, or caused an eviction from hot
 697   //                  cache.
 698   //                  Immediately process res; no need to process card_ptr.
 699 
 700 
 701   jbyte* res = card_ptr;
 702   bool defer = false;
 703 
 704   // This gets set to true if the card being refined has references
 705   // that point into the collection set.
 706   bool oops_into_cset = false;
 707 
 708   if (_cg1r->use_cache()) {
 709     jbyte* res = _cg1r->cache_insert(card_ptr, &defer);
 710     if (res != NULL && (res != card_ptr || defer)) {
 711       start = _ct_bs->addr_for(res);
 712       r = _g1->heap_region_containing(start);
 713       if (r != NULL) {
 714         // Checking whether the region we got back from the cache
 715         // is young here is inappropriate. The region could have been
 716         // freed, reallocated and tagged as young while in the cache.
 717         // Hence we could see its young type change at any time.
 718         //
 719         // Process card pointer we get back from the hot card cache. This
 720         // will check whether the region containing the card is young
 721         // _after_ checking that the region has been allocated from.
 722         oops_into_cset = concurrentRefineOneCard_impl(res, worker_i,
 723                                                       false /* check_for_refs_into_cset */);
 724         // The above call to concurrentRefineOneCard_impl is only
 725         // performed if the hot card cache is enabled. This cache is
 726         // disabled during an evacuation pause - which is the only
 727         // time when we need know if the card contains references
 728         // that point into the collection set. Also when the hot card
 729         // cache is enabled, this code is executed by the concurrent
 730         // refine threads - rather than the GC worker threads - and
 731         // concurrentRefineOneCard_impl will return false.
 732         assert(!oops_into_cset, "should not see true here");
 733       }
 734     }
 735   }
 736 
 737   if (!defer) {
 738     oops_into_cset =
 739       concurrentRefineOneCard_impl(card_ptr, worker_i, check_for_refs_into_cset);
 740     // We should only be detecting that the card contains references
 741     // that point into the collection set if the current thread is
 742     // a GC worker thread.
 743     assert(!oops_into_cset || SafepointSynchronize::is_at_safepoint(),
 744            "invalid result at non safepoint");
 745   }
 746   return oops_into_cset;
 747 }
 748 
 749 class HRRSStatsIter: public HeapRegionClosure {
 750   size_t _occupied;
 751   size_t _total_mem_sz;
 752   size_t _max_mem_sz;
 753   HeapRegion* _max_mem_sz_region;
 754 public:
 755   HRRSStatsIter() :
 756     _occupied(0),
 757     _total_mem_sz(0),
 758     _max_mem_sz(0),
 759     _max_mem_sz_region(NULL)
 760   {}
 761 
 762   bool doHeapRegion(HeapRegion* r) {
 763     if (r->continuesHumongous()) return false;
 764     size_t mem_sz = r->rem_set()->mem_size();
 765     if (mem_sz > _max_mem_sz) {
 766       _max_mem_sz = mem_sz;


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



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

 856     assert(JavaThread::dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
 857   }
 858 }
   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   }


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


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


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


 503 G1TriggerClosure::G1TriggerClosure() :
 504   _triggered(false) { }
 505 
 506 G1InvokeIfNotTriggeredClosure::G1InvokeIfNotTriggeredClosure(G1TriggerClosure* t_cl,
 507                                                              OopClosure* oop_cl)  :
 508   _trigger_cl(t_cl), _oop_cl(oop_cl) { }
 509 
 510 G1Mux2Closure::G1Mux2Closure(OopClosure *c1, OopClosure *c2) :
 511   _c1(c1), _c2(c2) { }
 512 
 513 G1UpdateRSOrPushRefOopClosure::
 514 G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h,
 515                               G1RemSet* rs,
 516                               OopsInHeapRegionClosure* push_ref_cl,
 517                               bool record_refs_into_cset,
 518                               int worker_i) :
 519   _g1(g1h), _g1_rem_set(rs), _from(NULL),
 520   _record_refs_into_cset(record_refs_into_cset),
 521   _push_ref_cl(push_ref_cl), _worker_i(worker_i) { }
 522 
 523 // Returns true if the given card contains references that point
 524 // into the collection set, if we're checking for such references;
 525 // false otherwise.
 526 
 527 bool G1RemSet::refine_card(jbyte* card_ptr, int worker_i,
 528                            bool check_for_refs_into_cset) {
 529 
 530   // If the card is no longer dirty, nothing to do.
 531   if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 532     // No need to return that this card contains refs that point
 533     // into the collection set.
 534     return false;
 535   }
 536 
 537   // Construct the region representing the card.
 538   HeapWord* start = _ct_bs->addr_for(card_ptr);
 539   // And find the region containing it.
 540   HeapRegion* r = _g1->heap_region_containing(start);
 541   if (r == NULL) {
 542     // Again no need to return that this card contains refs that
 543     // point into the collection set.
 544     return false;  // Not in the G1 heap (might be in perm, for example.)
 545   }
 546 
 547   // Why do we have to check here whether a card is on a young region,
 548   // given that we dirty young regions and, as a result, the
 549   // post-barrier is supposed to filter them out and never to enqueue
 550   // them? When we allocate a new region as the "allocation region" we
 551   // actually dirty its cards after we release the lock, since card
 552   // dirtying while holding the lock was a performance bottleneck. So,
 553   // as a result, it is possible for other threads to actually
 554   // allocate objects in the region (after the acquire the lock)
 555   // before all the cards on the region are dirtied. This is unlikely,
 556   // and it doesn't happen often, but it can happen. So, the extra
 557   // check below filters out those cards.
 558   if (r->is_young()) {
 559     return false;
 560   }
 561 
 562   // While we are processing RSet buffers during the collection, we
 563   // actually don't want to scan any cards on the collection set,
 564   // since we don't want to update remebered sets with entries that
 565   // point into the collection set, given that live objects from the
 566   // collection set are about to move and such entries will be stale
 567   // very soon. This change also deals with a reliability issue which
 568   // involves scanning a card in the collection set and coming across
 569   // an array that was being chunked and looking malformed. Note,
 570   // however, that if evacuation fails, we have to scan any objects
 571   // that were not moved and create any missing entries.
 572   if (r->in_collection_set()) {
 573     return false;
 574   }
 575 
 576   // The result from the hot card cache insert call is either:
 577   //   * pointer to the current card
 578   //     (implying that the current card is not 'hot'),
 579   //   * null
 580   //     (meaning we had inserted the card ptr into the "hot" card cache,
 581   //     which had some headroom),
 582   //   * a pointer to a "hot" card that was evicted from the "hot" cache.
 583   //
 584 
 585   G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
 586   if (hot_card_cache->use_cache()) {
 587     assert(!check_for_refs_into_cset, "sanity");
 588     assert(!SafepointSynchronize::is_at_safepoint(), "sanity");
 589 
 590     card_ptr = hot_card_cache->insert(card_ptr);
 591     if (card_ptr == NULL) {
 592       // There was no eviction. Nothing to do.
 593       return false;
 594     }
 595 
 596     start = _ct_bs->addr_for(card_ptr);
 597     r = _g1->heap_region_containing(start);
 598     if (r == NULL) {
 599       // Not in the G1 heap
 600       return false;
 601     }
 602 
 603     // Checking whether the region we got back from the cache
 604     // is young here is inappropriate. The region could have been
 605     // freed, reallocated and tagged as young while in the cache.
 606     // Hence we could see its young type change at any time.
 607   }
 608 
 609   // Don't use addr_for(card_ptr + 1) which can ask for
 610   // a card beyond the heap.  This is not safe without a perm
 611   // gen at the upper end of the heap.
 612   HeapWord* end   = start + CardTableModRefBS::card_size_in_words;
 613   MemRegion dirtyRegion(start, end);
 614 
 615 #if CARD_REPEAT_HISTO
 616   init_ct_freq_table(_g1->max_capacity());
 617   ct_freq_note_card(_ct_bs->index_for(start));
 618 #endif
 619 
 620   OopsInHeapRegionClosure* oops_in_heap_closure = NULL;
 621   if (check_for_refs_into_cset) {
 622     // ConcurrentG1RefineThreads have worker numbers larger than what
 623     // _cset_rs_update_cl[] is set up to handle. But those threads should
 624     // only be active outside of a collection which means that when they
 625     // reach here they should have check_for_refs_into_cset == false.
 626     assert((size_t)worker_i < n_workers(), "index of worker larger than _cset_rs_update_cl[].length");
 627     oops_in_heap_closure = _cset_rs_update_cl[worker_i];


 667   // If stop_point is non-null, then we encountered an unallocated region
 668   // (perhaps the unfilled portion of a TLAB.)  For now, we'll dirty the
 669   // card and re-enqueue: if we put off the card until a GC pause, then the
 670   // unallocated portion will be filled in.  Alternatively, we might try
 671   // the full complexity of the technique used in "regular" precleaning.
 672   if (stop_point != NULL) {
 673     // The card might have gotten re-dirtied and re-enqueued while we
 674     // worked.  (In fact, it's pretty likely.)
 675     if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
 676       *card_ptr = CardTableModRefBS::dirty_card_val();
 677       MutexLockerEx x(Shared_DirtyCardQ_lock,
 678                       Mutex::_no_safepoint_check_flag);
 679       DirtyCardQueue* sdcq =
 680         JavaThread::dirty_card_queue_set().shared_dirty_card_queue();
 681       sdcq->enqueue(card_ptr);
 682     }
 683   } else {
 684     _conc_refine_cards++;
 685   }
 686 
 687   // This gets set to true if the card being refined has
 688   // references that point into the collection set.
 689   bool has_refs_into_cset = trigger_cl.triggered();
 690 




























































































































 691   // We should only be detecting that the card contains references
 692   // that point into the collection set if the current thread is
 693   // a GC worker thread.
 694   assert(!has_refs_into_cset || SafepointSynchronize::is_at_safepoint(),
 695            "invalid result at non safepoint");
 696 
 697   return has_refs_into_cset;
 698 }
 699 
 700 class HRRSStatsIter: public HeapRegionClosure {
 701   size_t _occupied;
 702   size_t _total_mem_sz;
 703   size_t _max_mem_sz;
 704   HeapRegion* _max_mem_sz_region;
 705 public:
 706   HRRSStatsIter() :
 707     _occupied(0),
 708     _total_mem_sz(0),
 709     _max_mem_sz(0),
 710     _max_mem_sz_region(NULL)
 711   {}
 712 
 713   bool doHeapRegion(HeapRegion* r) {
 714     if (r->continuesHumongous()) return false;
 715     size_t mem_sz = r->rem_set()->mem_size();
 716     if (mem_sz > _max_mem_sz) {
 717       _max_mem_sz = mem_sz;


 780   HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set();
 781   gclog_or_tty->print_cr("    Max size region = "HR_FORMAT", "
 782                          "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
 783                          HR_FORMAT_PARAMS(max_mem_sz_region),
 784                          (rem_set->mem_size() + K - 1)/K,
 785                          (rem_set->occupied() + K - 1)/K);
 786   gclog_or_tty->print_cr("    Did %d coarsenings.",
 787                          HeapRegionRemSet::n_coarsenings());
 788 }
 789 
 790 void G1RemSet::prepare_for_verify() {
 791   if (G1HRRSFlushLogBuffersOnVerify &&
 792       (VerifyBeforeGC || VerifyAfterGC)
 793       &&  !_g1->full_collection()) {
 794     cleanupHRRS();
 795     _g1->set_refine_cte_cl_concurrency(false);
 796     if (SafepointSynchronize::is_at_safepoint()) {
 797       DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
 798       dcqs.concatenate_logs();
 799     }
 800 
 801     G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
 802     bool use_hot_card_cache = hot_card_cache->use_cache();
 803     hot_card_cache->set_use_cache(false);
 804 
 805     DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
 806     updateRS(&into_cset_dcq, 0);
 807     _g1->into_cset_dirty_card_queue_set().clear();

 808 
 809     hot_card_cache->set_use_cache(use_hot_card_cache);
 810     assert(JavaThread::dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
 811   }
 812 }