hotspot/src/share/vm/memory/referenceProcessor.hpp
author ysr
Wed, 07 Sep 2011 13:55:42 -0700
changeset 10526 3e92f211533f
parent 10524 6594ca81279a
child 10670 4ea0e7d2ffbc
permissions -rw-r--r--
4965777: GC changes to support use of discovered field for pending references Summary: If and when the reference handler thread is able to use the discovered field to link reference objects in its pending list, so will GC. In that case, GC will scan through this field once a reference object has been placed on the pending list, but not scan that field before that stage, as the field is used by the concurrent GC thread to link discovered objects. When ReferenceHandleR thread does not use the discovered field for the purpose of linking the elements in the pending list, as would be the case in older JDKs, the JVM will fall back to the old behaviour of using the next field for that purpose. Reviewed-by: jcoomes, mchung, stefank
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
     2
 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4885
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4885
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4885
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    25
#ifndef SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    26
#define SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    28
#include "memory/referencePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    29
#include "oops/instanceRefKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    30
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// ReferenceProcessor class encapsulates the per-"collector" processing
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    32
// of java.lang.Reference objects for GC. The interface is useful for supporting
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// a generational abstraction, in particular when there are multiple
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// generations that are being independently collected -- possibly
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// concurrently and/or incrementally.  Note, however, that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// ReferenceProcessor class abstracts away from a generational setting
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// by using only a heap interval (called "span" below), thus allowing
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// its use in a straightforward manner in a general, non-generational
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// setting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// The basic idea is that each ReferenceProcessor object concerns
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// itself with ("weak") reference processing in a specific "span"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// of the heap of interest to a specific collector. Currently,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// the span is a convex interval of the heap, but, efficiency
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// apart, there seems to be no reason it couldn't be extended
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// (with appropriate modifications) to any "non-convex interval".
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// forward references
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
class ReferencePolicy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
class AbstractRefProcTaskExecutor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
class DiscoveredList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
class ReferenceProcessor : public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
 protected:
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
    55
  // Compatibility with pre-4965777 JDK's
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
    56
  static bool _pending_list_uses_discovered_field;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  MemRegion   _span; // (right-open) interval of heap
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
                     // subject to wkref discovery
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  bool        _discovering_refs;      // true when discovery enabled
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  bool        _discovery_is_atomic;   // if discovery is atomic wrt
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
                                      // other collectors in configuration
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  bool        _discovery_is_mt;       // true if reference discovery is MT.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    63
  // If true, setting "next" field of a discovered refs list requires
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    64
  // write barrier(s).  (Must be true if used in a collector in which
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    65
  // elements of a discovered list may be moved during discovery: for
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    66
  // example, a collector like Garbage-First that moves objects during a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    67
  // long-term concurrent marking phase that does weak reference
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    68
  // discovery.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    69
  bool        _discovered_list_needs_barrier;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    70
  BarrierSet* _bs;                    // Cached copy of BarrierSet.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  bool        _enqueuing_is_done;     // true if all weak references enqueued
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  bool        _processing_is_mt;      // true during phases when
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
                                      // reference processing is MT.
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
    74
  int         _next_id;               // round-robin mod _num_q counter in
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
                                      // support of work distribution
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // For collectors that do not keep GC marking information
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // in the object header, this field holds a closure that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // helps the reference processor determine the reachability
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // of an oop (the field is currently initialized to NULL for
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // all collectors but the CMS collector).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  BoolObjectClosure* _is_alive_non_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    84
  // Soft ref clearing policies
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    85
  // . the default policy
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    86
  static ReferencePolicy*   _default_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    87
  // . the "clear all" policy
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    88
  static ReferencePolicy*   _always_clear_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    89
  // . the current policy below is either one of the above
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    90
  ReferencePolicy*          _current_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    91
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  // The discovered ref lists themselves
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    93
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
    94
  // The active MT'ness degree of the queues below
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    95
  int             _num_q;
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
    96
  // The maximum MT'ness degree of the queues below
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
    97
  int             _max_num_q;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    98
  // Arrays of lists of oops, one per thread
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    99
  DiscoveredList* _discoveredSoftRefs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  DiscoveredList* _discoveredWeakRefs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  DiscoveredList* _discoveredFinalRefs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  DiscoveredList* _discoveredPhantomRefs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
 public:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   105
  int num_q()                            { return _num_q; }
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   106
  int max_num_q()                        { return _max_num_q; }
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   107
  void set_active_mt_degree(int v)       { _num_q = v; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  DiscoveredList* discovered_soft_refs() { return _discoveredSoftRefs; }
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
   109
  ReferencePolicy* setup_policy(bool always_clear) {
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   110
    _current_soft_ref_policy = always_clear ?
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   111
      _always_clear_soft_ref_policy : _default_soft_ref_policy;
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
   112
    _current_soft_ref_policy->setup();   // snapshot the policy threshold
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   113
    return _current_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   114
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // Process references with a certain reachability level.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  void process_discovered_reflist(DiscoveredList               refs_lists[],
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
                                  ReferencePolicy*             policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
                                  bool                         clear_referent,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
                                  BoolObjectClosure*           is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
                                  OopClosure*                  keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
                                  VoidClosure*                 complete_gc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
                                  AbstractRefProcTaskExecutor* task_executor);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  void process_phaseJNI(BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
                        OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
                        VoidClosure*       complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // Work methods used by the method process_discovered_reflist
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // Phase1: keep alive all those referents that are otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  // dead but which must be kept alive by policy (and their closure).
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   132
  void process_phase1(DiscoveredList&     refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
                      ReferencePolicy*    policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
                      BoolObjectClosure*  is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
                      OopClosure*         keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
                      VoidClosure*        complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  // Phase2: remove all those references whose referents are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  // reachable.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   139
  inline void process_phase2(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
                             BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
                             OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
                             VoidClosure*       complete_gc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    if (discovery_is_atomic()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
      // complete_gc is ignored in this case for this phase
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   145
      pp2_work(refs_list, is_alive, keep_alive);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
      assert(complete_gc != NULL, "Error");
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   148
      pp2_work_concurrent_discovery(refs_list, is_alive,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
                                    keep_alive, complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  // Work methods in support of process_phase2
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   153
  void pp2_work(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
                BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
                OopClosure*        keep_alive);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  void pp2_work_concurrent_discovery(
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   157
                DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
                BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
                OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
                VoidClosure*       complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // Phase3: process the referents by either clearing them
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // or keeping them alive (and their closure)
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   163
  void process_phase3(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
                      bool               clear_referent,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
                      BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
                      OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
                      VoidClosure*       complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // Enqueue references with a certain reachability level
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   170
  void enqueue_discovered_reflist(DiscoveredList& refs_list, HeapWord* pending_list_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  // "Preclean" all the discovered reference lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // by removing references with strongly reachable referents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // The first argument is a predicate on an oop that indicates
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // its (strong) reachability and the second is a closure that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // may be used to incrementalize or abort the precleaning process.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // The caller is responsible for taking care of potential
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // interference with concurrent operations on these lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  // (or predicates involved) by other threads. Currently
4738
25586a89c1c3 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 1610
diff changeset
   180
  // only used by the CMS collector.  should_unload_classes is
25586a89c1c3 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 1610
diff changeset
   181
  // used to aid assertion checking when classes are collected.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  void preclean_discovered_references(BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
                                      OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
                                      VoidClosure*       complete_gc,
4738
25586a89c1c3 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 1610
diff changeset
   185
                                      YieldClosure*      yield,
25586a89c1c3 6895236: CMS: cmsOopClosures.inline.hpp:43 assert(..., "Should remember klasses in this context")
jmasa
parents: 1610
diff changeset
   186
                                      bool               should_unload_classes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // Delete entries in the discovered lists that have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // either a null referent or are not active. Such
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // Reference objects can result from the clearing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // or enqueueing of Reference objects concurrent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // with their discovery by a (concurrent) collector.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // For a definition of "active" see java.lang.ref.Reference;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // Refs are born active, become inactive when enqueued,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // and never become active again. The state of being
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // active is encoded as follows: A Ref is active
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // if and only if its "next" field is NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  void clean_up_discovered_references();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  void clean_up_discovered_reflist(DiscoveredList& refs_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // Returns the name of the discovered reference list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // occupying the i / _num_q slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  const char* list_name(int i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   205
  void enqueue_discovered_reflists(HeapWord* pending_list_addr, AbstractRefProcTaskExecutor* task_executor);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   206
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // "Preclean" the given discovered reference list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // by removing references with strongly reachable referents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Currently used in support of CMS only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  void preclean_discovered_reflist(DiscoveredList&    refs_list,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
                                   BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
                                   OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
                                   VoidClosure*       complete_gc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
                                   YieldClosure*      yield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   217
  // round-robin mod _num_q (not: _not_ mode _max_num_q)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  int next_id() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    int id = _next_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    if (++_next_id == _num_q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
      _next_id = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    return id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  DiscoveredList* get_discovered_list(ReferenceType rt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  inline void add_to_discovered_list_mt(DiscoveredList& refs_list, oop obj,
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   227
                                        HeapWord* discovered_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  void verify_ok_to_handle_reflists() PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   230
  void clear_discovered_references(DiscoveredList& refs_list);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  void abandon_partial_discovered_list(DiscoveredList& refs_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // Calculate the number of jni handles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  unsigned int count_jni_refs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // Balances reference queues.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  void balance_queues(DiscoveredList ref_lists[]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  // Update (advance) the soft ref master clock field.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  void update_soft_ref_master_clock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  ReferenceProcessor():
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    _span((HeapWord*)NULL, (HeapWord*)NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    _discoveredSoftRefs(NULL),  _discoveredWeakRefs(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    _discoveredFinalRefs(NULL), _discoveredPhantomRefs(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    _discovering_refs(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    _discovery_is_atomic(true),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    _enqueuing_is_done(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    _discovery_is_mt(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   252
    _discovered_list_needs_barrier(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   253
    _bs(NULL),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    _is_alive_non_header(NULL),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    _num_q(0),
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   256
    _max_num_q(0),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    _processing_is_mt(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    _next_id(0)
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   259
  { }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   261
  // Default parameters give you a vanilla reference processor.
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   262
  ReferenceProcessor(MemRegion span,
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   263
                     bool mt_processing = false, int mt_processing_degree = 1,
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   264
                     bool mt_discovery  = false, int mt_discovery_degree  = 1,
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   265
                     bool atomic_discovery = true,
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   266
                     BoolObjectClosure* is_alive_non_header = NULL,
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   267
                     bool discovered_list_needs_barrier = false);
4885
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   268
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  // RefDiscoveryPolicy values
4885
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   270
  enum DiscoveryPolicy {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    ReferenceBasedDiscovery = 0,
4885
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   272
    ReferentBasedDiscovery  = 1,
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   273
    DiscoveryPolicyMin      = ReferenceBasedDiscovery,
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   274
    DiscoveryPolicyMax      = ReferentBasedDiscovery
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  static void init_statics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // get and set "is_alive_non_header" field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  BoolObjectClosure* is_alive_non_header() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    return _is_alive_non_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  void set_is_alive_non_header(BoolObjectClosure* is_alive_non_header) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    _is_alive_non_header = is_alive_non_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  // get and set span
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  MemRegion span()                   { return _span; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  void      set_span(MemRegion span) { _span = span; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  // start and stop weak ref discovery
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  void enable_discovery()   { _discovering_refs = true;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  void disable_discovery()  { _discovering_refs = false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  bool discovery_enabled()  { return _discovering_refs;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // whether discovery is atomic wrt other collectors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  bool discovery_is_atomic() const { return _discovery_is_atomic; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  void set_atomic_discovery(bool atomic) { _discovery_is_atomic = atomic; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   301
  // whether the JDK in which we are embedded is a pre-4965777 JDK,
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   302
  // and thus whether or not it uses the discovered field to chain
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   303
  // the entries in the pending list.
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   304
  static bool pending_list_uses_discovered_field() {
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   305
    return _pending_list_uses_discovered_field;
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   306
  }
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   307
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // whether discovery is done by multiple threads same-old-timeously
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  bool discovery_is_mt() const { return _discovery_is_mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  void set_mt_discovery(bool mt) { _discovery_is_mt = mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // Whether we are in a phase when _processing_ is MT.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  bool processing_is_mt() const { return _processing_is_mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  void set_mt_processing(bool mt) { _processing_is_mt = mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // whether all enqueuing of weak references is complete
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  bool enqueuing_is_done()  { return _enqueuing_is_done; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  void set_enqueuing_is_done(bool v) { _enqueuing_is_done = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  // iterate over oops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  void weak_oops_do(OopClosure* f);       // weak roots
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   323
  // Balance each of the discovered lists.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   324
  void balance_all_queues();
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   325
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // Discover a Reference object, using appropriate discovery criteria
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  bool discover_reference(oop obj, ReferenceType rt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // Process references found during GC (called by the garbage collector)
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   330
  void process_discovered_references(BoolObjectClosure*           is_alive,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
                                     OopClosure*                  keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
                                     VoidClosure*                 complete_gc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
                                     AbstractRefProcTaskExecutor* task_executor);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  // Enqueue references at end of GC (called by the garbage collector)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  bool enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor = NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   339
  // If a discovery is in process that is being superceded, abandon it: all
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   340
  // the discovered lists will be empty, and all the objects on them will
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   341
  // have NULL discovered fields.  Must be called only at a safepoint.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   342
  void abandon_partial_discovery();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   343
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  void verify_no_references_recorded() PRODUCT_RETURN;
7420
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7397
diff changeset
   346
  void verify_referent(oop obj)        PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // clear the discovered lists (unlinking each entry).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  void clear_discovered_references() PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
// A utility class to disable reference discovery in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
// the scope which contains it, for given ReferenceProcessor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
class NoRefDiscovery: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  bool _was_discovering_refs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  NoRefDiscovery(ReferenceProcessor* rp) : _rp(rp) {
6459
3d75ed40a975 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 5547
diff changeset
   360
    _was_discovering_refs = _rp->discovery_enabled();
3d75ed40a975 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 5547
diff changeset
   361
    if (_was_discovering_refs) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
      _rp->disable_discovery();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  ~NoRefDiscovery() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
    if (_was_discovering_refs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
      _rp->enable_discovery();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
// A utility class to temporarily mutate the span of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
// given ReferenceProcessor in the scope that contains it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
class ReferenceProcessorSpanMutator: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  MemRegion           _saved_span;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  ReferenceProcessorSpanMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
                                MemRegion span):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    _saved_span = _rp->span();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
    _rp->set_span(span);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  ~ReferenceProcessorSpanMutator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    _rp->set_span(_saved_span);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
// A utility class to temporarily change the MT'ness of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
// reference discovery for the given ReferenceProcessor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
// in the scope that contains it.
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   397
class ReferenceProcessorMTDiscoveryMutator: StackObj {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  bool                _saved_mt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
 public:
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   403
  ReferenceProcessorMTDiscoveryMutator(ReferenceProcessor* rp,
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   404
                                       bool mt):
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
    _saved_mt = _rp->discovery_is_mt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
    _rp->set_mt_discovery(mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   410
  ~ReferenceProcessorMTDiscoveryMutator() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    _rp->set_mt_discovery(_saved_mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
// A utility class to temporarily change the disposition
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
// of the "is_alive_non_header" closure field of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
// given ReferenceProcessor in the scope that contains it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
class ReferenceProcessorIsAliveMutator: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  BoolObjectClosure*  _saved_cl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  ReferenceProcessorIsAliveMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
                                   BoolObjectClosure*  cl):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    _saved_cl = _rp->is_alive_non_header();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    _rp->set_is_alive_non_header(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  ~ReferenceProcessorIsAliveMutator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
    _rp->set_is_alive_non_header(_saved_cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
// A utility class to temporarily change the disposition
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
// of the "discovery_is_atomic" field of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
// given ReferenceProcessor in the scope that contains it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
class ReferenceProcessorAtomicMutator: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  bool                _saved_atomic_discovery;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  ReferenceProcessorAtomicMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
                                  bool atomic):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
    _saved_atomic_discovery = _rp->discovery_is_atomic();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    _rp->set_atomic_discovery(atomic);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  ~ReferenceProcessorAtomicMutator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    _rp->set_atomic_discovery(_saved_atomic_discovery);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
// A utility class to temporarily change the MT processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
// disposition of the given ReferenceProcessor instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
// in the scope that contains it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
class ReferenceProcessorMTProcMutator: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  bool  _saved_mt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  ReferenceProcessorMTProcMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
                                  bool mt):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    _saved_mt = _rp->processing_is_mt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    _rp->set_mt_processing(mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  ~ReferenceProcessorMTProcMutator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
    _rp->set_mt_processing(_saved_mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
// This class is an interface used to implement task execution for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
// reference processing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
class AbstractRefProcTaskExecutor {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  // Abstract tasks to execute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  class ProcessTask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  class EnqueueTask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  // Executes a task using worker threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  virtual void execute(ProcessTask& task) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  virtual void execute(EnqueueTask& task) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  // Switch to single threaded mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  virtual void set_single_threaded_mode() { };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
// Abstract reference processing task to execute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
class AbstractRefProcTaskExecutor::ProcessTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  ProcessTask(ReferenceProcessor& ref_processor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
              DiscoveredList      refs_lists[],
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
              bool                marks_oops_alive)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
    : _ref_processor(ref_processor),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
      _refs_lists(refs_lists),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
      _marks_oops_alive(marks_oops_alive)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  virtual void work(unsigned int work_id, BoolObjectClosure& is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
                    OopClosure& keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
                    VoidClosure& complete_gc) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  // Returns true if a task marks some oops as alive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  bool marks_oops_alive() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  { return _marks_oops_alive; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  ReferenceProcessor& _ref_processor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  DiscoveredList*     _refs_lists;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  const bool          _marks_oops_alive;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
// Abstract reference processing task to execute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
class AbstractRefProcTaskExecutor::EnqueueTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  EnqueueTask(ReferenceProcessor& ref_processor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
              DiscoveredList      refs_lists[],
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   529
              HeapWord*           pending_list_addr,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
              int                 n_queues)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
    : _ref_processor(ref_processor),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
      _refs_lists(refs_lists),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
      _pending_list_addr(pending_list_addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
      _n_queues(n_queues)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  virtual void work(unsigned int work_id) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  ReferenceProcessor& _ref_processor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  DiscoveredList*     _refs_lists;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   543
  HeapWord*           _pending_list_addr;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  int                 _n_queues;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
   546
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
   547
#endif // SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP