src/share/vm/memory/sharedHeap.hpp

Tue, 16 Feb 2016 21:42:29 +0000

author
poonam
date
Tue, 16 Feb 2016 21:42:29 +0000
changeset 8308
6acf14e730dd
parent 7659
38d6febe66af
child 7994
04ff2f6cd0eb
permissions
-rw-r--r--

8072725: Provide more granular levels for GC verification
Summary: Add option VerifySubSet to selectively verify the memory sub-systems
Reviewed-by: kevinw, jmasa

     1 /*
     2  * Copyright (c) 2000, 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  */
    25 #ifndef SHARE_VM_MEMORY_SHAREDHEAP_HPP
    26 #define SHARE_VM_MEMORY_SHAREDHEAP_HPP
    28 #include "gc_interface/collectedHeap.hpp"
    29 #include "memory/generation.hpp"
    31 // A "SharedHeap" is an implementation of a java heap for HotSpot.  This
    32 // is an abstract class: there may be many different kinds of heaps.  This
    33 // class defines the functions that a heap must implement, and contains
    34 // infrastructure common to all heaps.
    36 class Generation;
    37 class BarrierSet;
    38 class GenRemSet;
    39 class Space;
    40 class SpaceClosure;
    41 class OopClosure;
    42 class OopsInGenClosure;
    43 class ObjectClosure;
    44 class SubTasksDone;
    45 class WorkGang;
    46 class FlexibleWorkGang;
    47 class CollectorPolicy;
    48 class KlassClosure;
    50 // Note on use of FlexibleWorkGang's for GC.
    51 // There are three places where task completion is determined.
    52 // In
    53 //    1) ParallelTaskTerminator::offer_termination() where _n_threads
    54 //    must be set to the correct value so that count of workers that
    55 //    have offered termination will exactly match the number
    56 //    working on the task.  Tasks such as those derived from GCTask
    57 //    use ParallelTaskTerminator's.  Tasks that want load balancing
    58 //    by work stealing use this method to gauge completion.
    59 //    2) SubTasksDone has a variable _n_threads that is used in
    60 //    all_tasks_completed() to determine completion.  all_tasks_complete()
    61 //    counts the number of tasks that have been done and then reset
    62 //    the SubTasksDone so that it can be used again.  When the number of
    63 //    tasks is set to the number of GC workers, then _n_threads must
    64 //    be set to the number of active GC workers. G1RootProcessor and
    65 //    GenCollectedHeap have SubTasksDone.
    66 //    3) SequentialSubTasksDone has an _n_threads that is used in
    67 //    a way similar to SubTasksDone and has the same dependency on the
    68 //    number of active GC workers.  CompactibleFreeListSpace and Space
    69 //    have SequentialSubTasksDone's.
    70 //
    71 // Examples of using SubTasksDone and SequentialSubTasksDone:
    72 //  G1RootProcessor and GenCollectedHeap::process_roots() use
    73 //  SubTasksDone* _process_strong_tasks to claim tasks for workers
    74 //
    75 //  GenCollectedHeap::gen_process_roots() calls
    76 //      rem_set()->younger_refs_iterate()
    77 //  to scan the card table and which eventually calls down into
    78 //  CardTableModRefBS::par_non_clean_card_iterate_work().  This method
    79 //  uses SequentialSubTasksDone* _pst to claim tasks.
    80 //  Both SubTasksDone and SequentialSubTasksDone call their method
    81 //  all_tasks_completed() to count the number of GC workers that have
    82 //  finished their work.  That logic is "when all the workers are
    83 //  finished the tasks are finished".
    84 //
    85 //  The pattern that appears  in the code is to set _n_threads
    86 //  to a value > 1 before a task that you would like executed in parallel
    87 //  and then to set it to 0 after that task has completed.  A value of
    88 //  0 is a "special" value in set_n_threads() which translates to
    89 //  setting _n_threads to 1.
    90 //
    91 //  Some code uses _n_terminiation to decide if work should be done in
    92 //  parallel.  The notorious possibly_parallel_oops_do() in threads.cpp
    93 //  is an example of such code.  Look for variable "is_par" for other
    94 //  examples.
    95 //
    96 //  The active_workers is not reset to 0 after a parallel phase.  It's
    97 //  value may be used in later phases and in one instance at least
    98 //  (the parallel remark) it has to be used (the parallel remark depends
    99 //  on the partitioning done in the previous parallel scavenge).
   101 class SharedHeap : public CollectedHeap {
   102   friend class VMStructs;
   104   friend class VM_GC_Operation;
   105   friend class VM_CGC_Operation;
   107 protected:
   108   // There should be only a single instance of "SharedHeap" in a program.
   109   // This is enforced with the protected constructor below, which will also
   110   // set the static pointer "_sh" to that instance.
   111   static SharedHeap* _sh;
   113   // and the Gen Remembered Set, at least one good enough to scan the perm
   114   // gen.
   115   GenRemSet* _rem_set;
   117   // A gc policy, controls global gc resource issues
   118   CollectorPolicy *_collector_policy;
   120   // See the discussion below, in the specification of the reader function
   121   // for this variable.
   122   int _strong_roots_parity;
   124   // If we're doing parallel GC, use this gang of threads.
   125   FlexibleWorkGang* _workers;
   127   // Full initialization is done in a concrete subtype's "initialize"
   128   // function.
   129   SharedHeap(CollectorPolicy* policy_);
   131   // Returns true if the calling thread holds the heap lock,
   132   // or the calling thread is a par gc thread and the heap_lock is held
   133   // by the vm thread doing a gc operation.
   134   bool heap_lock_held_for_gc();
   135   // True if the heap_lock is held by the a non-gc thread invoking a gc
   136   // operation.
   137   bool _thread_holds_heap_lock_for_gc;
   139 public:
   140   static SharedHeap* heap() { return _sh; }
   142   void set_barrier_set(BarrierSet* bs);
   144   // Does operations required after initialization has been done.
   145   virtual void post_initialize();
   147   // Initialization of ("weak") reference processing support
   148   virtual void ref_processing_init();
   150   // This function returns the "GenRemSet" object that allows us to scan
   151   // generations in a fully generational heap.
   152   GenRemSet* rem_set() { return _rem_set; }
   154   // Iteration functions.
   155   void oop_iterate(ExtendedOopClosure* cl) = 0;
   157   // Iterate over all spaces in use in the heap, in an undefined order.
   158   virtual void space_iterate(SpaceClosure* cl) = 0;
   160   // A SharedHeap will contain some number of spaces.  This finds the
   161   // space whose reserved area contains the given address, or else returns
   162   // NULL.
   163   virtual Space* space_containing(const void* addr) const = 0;
   165   bool no_gc_in_progress() { return !is_gc_active(); }
   167   // Some collectors will perform "process_strong_roots" in parallel.
   168   // Such a call will involve claiming some fine-grained tasks, such as
   169   // scanning of threads.  To make this process simpler, we provide the
   170   // "strong_roots_parity()" method.  Collectors that start parallel tasks
   171   // whose threads invoke "process_strong_roots" must
   172   // call "change_strong_roots_parity" in sequential code starting such a
   173   // task.  (This also means that a parallel thread may only call
   174   // process_strong_roots once.)
   175   //
   176   // For calls to process_roots by sequential code, the parity is
   177   // updated automatically.
   178   //
   179   // The idea is that objects representing fine-grained tasks, such as
   180   // threads, will contain a "parity" field.  A task will is claimed in the
   181   // current "process_roots" call only if its parity field is the
   182   // same as the "strong_roots_parity"; task claiming is accomplished by
   183   // updating the parity field to the strong_roots_parity with a CAS.
   184   //
   185   // If the client meats this spec, then strong_roots_parity() will have
   186   // the following properties:
   187   //   a) to return a different value than was returned before the last
   188   //      call to change_strong_roots_parity, and
   189   //   c) to never return a distinguished value (zero) with which such
   190   //      task-claiming variables may be initialized, to indicate "never
   191   //      claimed".
   192  public:
   193   int strong_roots_parity() { return _strong_roots_parity; }
   195   // Call these in sequential code around process_roots.
   196   // strong_roots_prologue calls change_strong_roots_parity, if
   197   // parallel tasks are enabled.
   198   class StrongRootsScope : public MarkingCodeBlobClosure::MarkScope {
   199     SharedHeap*   _sh;
   201    public:
   202     StrongRootsScope(SharedHeap* heap, bool activate = true);
   203   };
   204   friend class StrongRootsScope;
   206  private:
   207   void change_strong_roots_parity();
   209  public:
   210   FlexibleWorkGang* workers() const { return _workers; }
   212   // The functions below are helper functions that a subclass of
   213   // "SharedHeap" can use in the implementation of its virtual
   214   // functions.
   216 public:
   218   // Do anything common to GC's.
   219   virtual void gc_prologue(bool full) = 0;
   220   virtual void gc_epilogue(bool full) = 0;
   222   // Sets the number of parallel threads that will be doing tasks
   223   // (such as process roots) subsequently.
   224   virtual void set_par_threads(uint t);
   226   //
   227   // New methods from CollectedHeap
   228   //
   230   // Some utilities.
   231   void print_size_transition(outputStream* out,
   232                              size_t bytes_before,
   233                              size_t bytes_after,
   234                              size_t capacity);
   235 };
   237 #endif // SHARE_VM_MEMORY_SHAREDHEAP_HPP

mercurial