src/hotspot/share/oops/instanceRefKlass.hpp
changeset 47216 71c04702a3d5
parent 46446 ababb65abf24
child 49982 9042ffe5b7fe
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 1997, 2017, 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 #ifndef SHARE_VM_OOPS_INSTANCEREFKLASS_HPP
       
    26 #define SHARE_VM_OOPS_INSTANCEREFKLASS_HPP
       
    27 
       
    28 #include "gc/shared/specialized_oop_closures.hpp"
       
    29 #include "oops/instanceKlass.hpp"
       
    30 #include "utilities/macros.hpp"
       
    31 
       
    32 class ClassFileParser;
       
    33 
       
    34 // An InstanceRefKlass is a specialized InstanceKlass for Java
       
    35 // classes that are subclasses of java/lang/ref/Reference.
       
    36 //
       
    37 // These classes are used to implement soft/weak/final/phantom
       
    38 // references and finalization, and need special treatment by the
       
    39 // garbage collector.
       
    40 //
       
    41 // During GC discovered reference objects are added (chained) to one
       
    42 // of the four lists below, depending on the type of reference.
       
    43 // The linked occurs through the next field in class java/lang/ref/Reference.
       
    44 //
       
    45 // Afterwards, the discovered references are processed in decreasing
       
    46 // order of reachability. Reference objects eligible for notification
       
    47 // are linked to the static pending_list in class java/lang/ref/Reference,
       
    48 // and the pending list lock object in the same class is notified.
       
    49 
       
    50 
       
    51 class InstanceRefKlass: public InstanceKlass {
       
    52   friend class InstanceKlass;
       
    53  private:
       
    54   InstanceRefKlass(const ClassFileParser& parser) : InstanceKlass(parser, InstanceKlass::_misc_kind_reference) {}
       
    55 
       
    56  public:
       
    57   InstanceRefKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
       
    58 
       
    59   // GC specific object visitors
       
    60   //
       
    61 #if INCLUDE_ALL_GCS
       
    62   // Parallel Scavenge
       
    63   void oop_ps_push_contents(  oop obj, PSPromotionManager* pm);
       
    64   // Parallel Compact
       
    65   void oop_pc_follow_contents(oop obj, ParCompactionManager* cm);
       
    66   void oop_pc_update_pointers(oop obj, ParCompactionManager* cm);
       
    67 #endif
       
    68 
       
    69   // Oop fields (and metadata) iterators
       
    70   //  [nv = true]  Use non-virtual calls to do_oop_nv.
       
    71   //  [nv = false] Use virtual calls to do_oop.
       
    72   //
       
    73   // The InstanceRefKlass iterators also support reference processing.
       
    74 
       
    75 
       
    76   // Forward iteration
       
    77 private:
       
    78   // Iterate over all oop fields and metadata.
       
    79   template <bool nv, class OopClosureType>
       
    80   inline void oop_oop_iterate(oop obj, OopClosureType* closure);
       
    81 
       
    82   // Reverse iteration
       
    83 #if INCLUDE_ALL_GCS
       
    84   // Iterate over all oop fields and metadata.
       
    85   template <bool nv, class OopClosureType>
       
    86   inline void oop_oop_iterate_reverse(oop obj, OopClosureType* closure);
       
    87 #endif // INCLUDE_ALL_GCS
       
    88 
       
    89   // Bounded range iteration
       
    90   // Iterate over all oop fields and metadata.
       
    91   template <bool nv, class OopClosureType>
       
    92   inline void oop_oop_iterate_bounded(oop obj, OopClosureType* closure, MemRegion mr);
       
    93 
       
    94   // Reference processing part of the iterators.
       
    95 
       
    96   // Specialized for [T = oop] or [T = narrowOop].
       
    97   template <bool nv, typename T, class OopClosureType, class Contains>
       
    98   inline void oop_oop_iterate_ref_processing_specialized(oop obj, OopClosureType* closure, Contains& contains);
       
    99 
       
   100   // Only perform reference processing if the referent object is within mr.
       
   101   template <bool nv, class OopClosureType>
       
   102   inline void oop_oop_iterate_ref_processing_bounded(oop obj, OopClosureType* closure, MemRegion mr);
       
   103 
       
   104   // Reference processing
       
   105   template <bool nv, class OopClosureType>
       
   106   inline void oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure);
       
   107 
       
   108   // Building blocks for specialized handling.
       
   109   template <bool nv, typename T, class OopClosureType, class Contains>
       
   110   static void do_referent(oop obj, OopClosureType* closure, Contains& contains);
       
   111 
       
   112   template <bool nv, typename T, class OopClosureType, class Contains>
       
   113   static void do_next(oop obj, OopClosureType* closure, Contains& contains);
       
   114 
       
   115   template <bool nv, typename T, class OopClosureType, class Contains>
       
   116   static void do_discovered(oop obj, OopClosureType* closure, Contains& contains);
       
   117 
       
   118   template <typename T, class OopClosureType>
       
   119   static bool try_discover(oop obj, ReferenceType type, OopClosureType* closure);
       
   120 
       
   121   // Do discovery while handling InstanceRefKlasses. Reference discovery
       
   122   // is only done if the closure provides a ReferenceProcessor.
       
   123   template <bool nv, typename T, class OopClosureType, class Contains>
       
   124   static void oop_oop_iterate_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains);
       
   125 
       
   126   // Used for a special case in G1 where the closure needs to be applied
       
   127   // to the discovered field. Reference discovery is also done if the
       
   128   // closure provides a ReferenceProcessor.
       
   129   template <bool nv, typename T, class OopClosureType, class Contains>
       
   130   static void oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains);
       
   131 
       
   132   // Apply the closure to all fields. No reference discovery is done.
       
   133   template <bool nv, typename T, class OopClosureType, class Contains>
       
   134   static void oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains);
       
   135 
       
   136   template <typename T>
       
   137   static void trace_reference_gc(const char *s, oop obj) NOT_DEBUG_RETURN;
       
   138 
       
   139  public:
       
   140 
       
   141   ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_OOP_ITERATE_DECL)
       
   142   ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_OOP_ITERATE_DECL)
       
   143 
       
   144 #if INCLUDE_ALL_GCS
       
   145   ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_OOP_ITERATE_DECL_BACKWARDS)
       
   146   ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_OOP_ITERATE_DECL_BACKWARDS)
       
   147 #endif // INCLUDE_ALL_GCS
       
   148 
       
   149   // Update non-static oop maps so 'referent', 'nextPending' and
       
   150   // 'discovered' will look like non-oops
       
   151   static void update_nonstatic_oop_maps(Klass* k);
       
   152 
       
   153  public:
       
   154   // Verification
       
   155   void oop_verify_on(oop obj, outputStream* st);
       
   156 };
       
   157 
       
   158 #endif // SHARE_VM_OOPS_INSTANCEREFKLASS_HPP