src/hotspot/share/gc/shared/referenceProcessor.hpp
author tschatzl
Thu, 03 May 2018 14:09:00 +0200
changeset 49964 99e698e94cc7
parent 49827 a4672513d6e3
child 49967 672ded60a082
permissions -rw-r--r--
8201492: Properly implement non-contiguous generations for Reference discovery Summary: Collectors like G1 implementing non-contiguous generations previously used an inexact but conservative area for discovery. Concurrent and STW reference processing could discover the same reference multiple times, potentially missing referents during evacuation. So these collectors had to take extra measures while concurrent marking/reference discovery has been running. This change makes discovery exact for G1 (and any collector using non-contiguous generations) so that concurrent discovery and STW discovery discover on strictly disjoint memory areas. This means that the mentioned situation can not occur any more, and extra work is not required any more too. Reviewed-by: kbarrett, sjohanss
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
49827
a4672513d6e3 8201646: Introduce ReferenceDiscoverer interface
pliden
parents: 47648
diff changeset
     2
 * Copyright (c) 2001, 2018, 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
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30558
diff changeset
    25
#ifndef SHARE_VM_GC_SHARED_REFERENCEPROCESSOR_HPP
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30558
diff changeset
    26
#define SHARE_VM_GC_SHARED_REFERENCEPROCESSOR_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    27
49827
a4672513d6e3 8201646: Introduce ReferenceDiscoverer interface
pliden
parents: 47648
diff changeset
    28
#include "gc/shared/referenceDiscoverer.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30558
diff changeset
    29
#include "gc/shared/referencePolicy.hpp"
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
    30
#include "gc/shared/referenceProcessorPhaseTimes.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30558
diff changeset
    31
#include "gc/shared/referenceProcessorStats.hpp"
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 13728
diff changeset
    32
#include "memory/referenceType.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    33
#include "oops/instanceRefKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
    34
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 13728
diff changeset
    35
class GCTimer;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 13728
diff changeset
    36
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// ReferenceProcessor class encapsulates the per-"collector" processing
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
    38
// of java.lang.Reference objects for GC. The interface is useful for supporting
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// a generational abstraction, in particular when there are multiple
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// generations that are being independently collected -- possibly
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
    41
// concurrently and/or incrementally.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// ReferenceProcessor class abstracts away from a generational setting
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
    43
// by using a closure that determines whether a given reference or referent are
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
    44
// subject to this ReferenceProcessor's discovery, thus allowing its use in a
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
    45
// straightforward manner in a general, non-generational, non-contiguous generation
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
    46
// (or heap) setting.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
// forward references
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
class ReferencePolicy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
class AbstractRefProcTaskExecutor;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    52
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    53
// List of discovered references.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    54
class DiscoveredList {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    55
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    56
  DiscoveredList() : _len(0), _compressed_head(0), _oop_head(NULL) { }
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35475
diff changeset
    57
  inline oop head() const;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    58
  HeapWord* adr_head() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    59
    return UseCompressedOops ? (HeapWord*)&_compressed_head :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    60
                               (HeapWord*)&_oop_head;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    61
  }
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35475
diff changeset
    62
  inline void set_head(oop o);
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35475
diff changeset
    63
  inline bool is_empty() const;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    64
  size_t length()               { return _len; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    65
  void   set_length(size_t len) { _len = len;  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    66
  void   inc_length(size_t inc) { _len += inc; assert(_len > 0, "Error"); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    67
  void   dec_length(size_t dec) { _len -= dec; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    68
private:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    69
  // Set value depending on UseCompressedOops. This could be a template class
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    70
  // but then we have to fix all the instantiations and declarations that use this class.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    71
  oop       _oop_head;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    72
  narrowOop _compressed_head;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    73
  size_t _len;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    74
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    75
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    76
// Iterator for the list of discovered references.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    77
class DiscoveredListIterator {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    78
private:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    79
  DiscoveredList&    _refs_list;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    80
  HeapWord*          _prev_next;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    81
  oop                _prev;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    82
  oop                _ref;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    83
  HeapWord*          _discovered_addr;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    84
  oop                _next;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    85
  HeapWord*          _referent_addr;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    86
  oop                _referent;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    87
  OopClosure*        _keep_alive;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    88
  BoolObjectClosure* _is_alive;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    89
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    90
  DEBUG_ONLY(
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    91
  oop                _first_seen; // cyclic linked list check
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    92
  )
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    93
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    94
  NOT_PRODUCT(
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    95
  size_t             _processed;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    96
  size_t             _removed;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    97
  )
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    98
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
    99
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   100
  inline DiscoveredListIterator(DiscoveredList&    refs_list,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   101
                                OopClosure*        keep_alive,
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35475
diff changeset
   102
                                BoolObjectClosure* is_alive);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   103
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   104
  // End Of List.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   105
  inline bool has_next() const { return _ref != NULL; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   106
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   107
  // Get oop to the Reference object.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   108
  inline oop obj() const { return _ref; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   109
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   110
  // Get oop to the referent object.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   111
  inline oop referent() const { return _referent; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   112
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   113
  // Returns true if referent is alive.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   114
  inline bool is_referent_alive() const {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   115
    return _is_alive->do_object_b(_referent);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   116
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   117
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   118
  // Loads data for the current reference.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   119
  // The "allow_null_referent" argument tells us to allow for the possibility
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   120
  // of a NULL referent in the discovered Reference object. This typically
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   121
  // happens in the case of concurrent collectors that may have done the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   122
  // discovery concurrently, or interleaved, with mutator execution.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   123
  void load_ptrs(DEBUG_ONLY(bool allow_null_referent));
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   124
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   125
  // Move to the next discovered reference.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   126
  inline void next() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   127
    _prev_next = _discovered_addr;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   128
    _prev = _ref;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   129
    move_to_next();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   130
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   131
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   132
  // Remove the current reference from the list
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   133
  void remove();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   134
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   135
  // Make the referent alive.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   136
  inline void make_referent_alive() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   137
    if (UseCompressedOops) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   138
      _keep_alive->do_oop((narrowOop*)_referent_addr);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   139
    } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   140
      _keep_alive->do_oop((oop*)_referent_addr);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   141
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   142
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   143
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   144
  // NULL out referent pointer.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   145
  void clear_referent();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   146
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   147
  // Statistics
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   148
  NOT_PRODUCT(
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   149
  inline size_t processed() const { return _processed; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   150
  inline size_t removed() const   { return _removed; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   151
  )
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   152
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   153
  inline void move_to_next() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   154
    if (_ref == _next) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   155
      // End of the list.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   156
      _ref = NULL;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   157
    } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   158
      _ref = _next;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   159
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   160
    assert(_ref != _first_seen, "cyclic ref_list found");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   161
    NOT_PRODUCT(_processed++);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   162
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   163
};
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
49827
a4672513d6e3 8201646: Introduce ReferenceDiscoverer interface
pliden
parents: 47648
diff changeset
   165
class ReferenceProcessor : public ReferenceDiscoverer {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   166
  size_t total_count(DiscoveredList lists[]) const;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 13728
diff changeset
   167
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   168
  // The SoftReference master timestamp clock
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   169
  static jlong _soft_ref_timestamp_clock;
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   170
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   171
  BoolObjectClosure* _is_subject_to_discovery; // determines whether a given oop is subject
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   172
                                               // to this ReferenceProcessor's discovery
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   173
                                               // (and further processing).
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   174
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   175
  bool        _discovering_refs;        // true when discovery enabled
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   176
  bool        _discovery_is_atomic;     // if discovery is atomic wrt
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   177
                                        // other collectors in configuration
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   178
  bool        _discovery_is_mt;         // true if reference discovery is MT.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   179
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   180
  bool        _enqueuing_is_done;       // true if all weak references enqueued
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   181
  bool        _processing_is_mt;        // true during phases when
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   182
                                        // reference processing is MT.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   183
  uint        _next_id;                 // round-robin mod _num_q counter in
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   184
                                        // support of work distribution
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   185
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   186
  // For collectors that do not keep GC liveness information
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // in the object header, this field holds a closure that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // helps the reference processor determine the reachability
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   189
  // of an oop. It is currently initialized to NULL for all
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   190
  // collectors except for CMS and G1.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  BoolObjectClosure* _is_alive_non_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   193
  // Soft ref clearing policies
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   194
  // . the default policy
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   195
  static ReferencePolicy*   _default_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   196
  // . the "clear all" policy
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   197
  static ReferencePolicy*   _always_clear_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   198
  // . the current policy below is either one of the above
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   199
  ReferencePolicy*          _current_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   200
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // 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
   202
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   203
  // The active MT'ness degree of the queues below
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   204
  uint             _num_q;
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   205
  // The maximum MT'ness degree of the queues below
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   206
  uint             _max_num_q;
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   207
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   208
  // Master array of discovered oops
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   209
  DiscoveredList* _discovered_refs;
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   210
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   211
  // Arrays of lists of oops, one per thread (pointers into master array above)
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   212
  DiscoveredList* _discoveredSoftRefs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  DiscoveredList* _discoveredWeakRefs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  DiscoveredList* _discoveredFinalRefs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  DiscoveredList* _discoveredPhantomRefs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
 public:
35475
c5e6cb508475 8143847: Remove REF_CLEANER reference category
kbarrett
parents: 35061
diff changeset
   218
  static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_OTHER); }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   219
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   220
  uint num_q()                             { return _num_q; }
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   221
  uint max_num_q()                         { return _max_num_q; }
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 35862
diff changeset
   222
  void set_active_mt_degree(uint v);
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   223
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   224
  DiscoveredList* discovered_refs()        { return _discovered_refs; }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   225
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
   226
  ReferencePolicy* setup_policy(bool always_clear) {
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   227
    _current_soft_ref_policy = always_clear ?
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   228
      _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
   229
    _current_soft_ref_policy->setup();   // snapshot the policy threshold
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   230
    return _current_soft_ref_policy;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   231
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // Process references with a certain reachability level.
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   234
  void process_discovered_reflist(DiscoveredList                refs_lists[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   235
                                  ReferencePolicy*              policy,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   236
                                  bool                          clear_referent,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   237
                                  BoolObjectClosure*            is_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   238
                                  OopClosure*                   keep_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   239
                                  VoidClosure*                  complete_gc,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   240
                                  AbstractRefProcTaskExecutor*  task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   241
                                  ReferenceProcessorPhaseTimes* phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // Work methods used by the method process_discovered_reflist
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  // Phase1: keep alive all those referents that are otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // 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
   246
  void process_phase1(DiscoveredList&     refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
                      ReferencePolicy*    policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
                      BoolObjectClosure*  is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
                      OopClosure*         keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
                      VoidClosure*        complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  // Phase2: remove all those references whose referents are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // reachable.
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   253
  void process_phase2(DiscoveredList&    refs_list,
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   254
                      BoolObjectClosure* is_alive,
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   255
                      OopClosure*        keep_alive,
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   256
                      VoidClosure*       complete_gc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // 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
   258
  void pp2_work(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
                BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
                OopClosure*        keep_alive);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  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
   262
                DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
                BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
                OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
                VoidClosure*       complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  // Phase3: process the referents by either clearing them
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  // 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
   268
  void process_phase3(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
                      bool               clear_referent,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
                      BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
                      OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
                      VoidClosure*       complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // Enqueue references with a certain reachability level
40892
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   275
  void enqueue_discovered_reflist(DiscoveredList& refs_list);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // "Preclean" all the discovered reference lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  // by removing references with strongly reachable referents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  // The first argument is a predicate on an oop that indicates
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // its (strong) reachability and the second is a closure that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  // may be used to incrementalize or abort the precleaning process.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // The caller is responsible for taking care of potential
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // interference with concurrent operations on these lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  // (or predicates involved) by other threads. Currently
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   285
  // only used by the CMS collector.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  void preclean_discovered_references(BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
                                      OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
                                      VoidClosure*       complete_gc,
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 13728
diff changeset
   289
                                      YieldClosure*      yield,
33107
77bf0d2069a3 8134953: Make the GC ID available in a central place
brutisso
parents: 33103
diff changeset
   290
                                      GCTimer*           gc_timer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  // Returns the name of the discovered reference list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // occupying the i / _num_q slot.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   294
  const char* list_name(uint i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   296
  void enqueue_discovered_reflists(AbstractRefProcTaskExecutor* task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   297
                                   ReferenceProcessorPhaseTimes* phase_times);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   298
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // "Preclean" the given discovered reference list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // by removing references with strongly reachable referents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  // Currently used in support of CMS only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  void preclean_discovered_reflist(DiscoveredList&    refs_list,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
                                   BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
                                   OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
                                   VoidClosure*       complete_gc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
                                   YieldClosure*      yield);
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   307
private:
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   308
  // round-robin mod _num_q (not: _not_ mode _max_num_q)
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   309
  uint next_id() {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   310
    uint id = _next_id;
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 35862
diff changeset
   311
    assert(!_discovery_is_mt, "Round robin should only be used in serial discovery");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    if (++_next_id == _num_q) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
      _next_id = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    }
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 35862
diff changeset
   315
    assert(_next_id < _num_q, "_next_id %u _num_q %u _max_num_q %u", _next_id, _num_q, _max_num_q);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    return id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  DiscoveredList* get_discovered_list(ReferenceType rt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  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
   320
                                        HeapWord* discovered_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   322
  void clear_discovered_references(DiscoveredList& refs_list);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 35862
diff changeset
   324
  void log_reflist_counts(DiscoveredList ref_lists[], uint active_length, size_t total_count) PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // Balances reference queues.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  void balance_queues(DiscoveredList ref_lists[]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // Update (advance) the soft ref master clock field.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  void update_soft_ref_master_clock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   332
  bool is_subject_to_discovery(oop const obj) const;
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   333
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   334
public:
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   335
  // Default parameters give you a vanilla reference processor.
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   336
  ReferenceProcessor(BoolObjectClosure* is_subject_to_discovery,
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   337
                     bool mt_processing = false, uint mt_processing_degree = 1,
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 10747
diff changeset
   338
                     bool mt_discovery  = false, uint mt_discovery_degree  = 1,
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   339
                     bool atomic_discovery = true,
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 22768
diff changeset
   340
                     BoolObjectClosure* is_alive_non_header = NULL);
4885
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   341
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  // RefDiscoveryPolicy values
4885
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   343
  enum DiscoveryPolicy {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    ReferenceBasedDiscovery = 0,
4885
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   345
    ReferentBasedDiscovery  = 1,
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   346
    DiscoveryPolicyMin      = ReferenceBasedDiscovery,
cee90a57b58f 6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents: 4738
diff changeset
   347
    DiscoveryPolicyMax      = ReferentBasedDiscovery
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  static void init_statics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // get and set "is_alive_non_header" field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  BoolObjectClosure* is_alive_non_header() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
    return _is_alive_non_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  void set_is_alive_non_header(BoolObjectClosure* is_alive_non_header) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    _is_alive_non_header = is_alive_non_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   361
  BoolObjectClosure* is_subject_to_discovery_closure() const { return _is_subject_to_discovery; }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   362
  void set_is_subject_to_discovery_closure(BoolObjectClosure* cl) { _is_subject_to_discovery = cl; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  // start and stop weak ref discovery
28212
647b7d0efb88 8066827: Remove ReferenceProcessor::clean_up_discovered_references()
kbarrett
parents: 25350
diff changeset
   365
  void enable_discovery(bool check_no_refs = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  void disable_discovery()  { _discovering_refs = false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  bool discovery_enabled()  { return _discovering_refs;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  // whether discovery is atomic wrt other collectors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  bool discovery_is_atomic() const { return _discovery_is_atomic; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  void set_atomic_discovery(bool atomic) { _discovery_is_atomic = atomic; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  // whether discovery is done by multiple threads same-old-timeously
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  bool discovery_is_mt() const { return _discovery_is_mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  void set_mt_discovery(bool mt) { _discovery_is_mt = mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // Whether we are in a phase when _processing_ is MT.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  bool processing_is_mt() const { return _processing_is_mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  void set_mt_processing(bool mt) { _processing_is_mt = mt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22496
diff changeset
   381
  // whether all enqueueing of weak references is complete
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  bool enqueuing_is_done()  { return _enqueuing_is_done; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  void set_enqueuing_is_done(bool v) { _enqueuing_is_done = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  // iterate over oops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  void weak_oops_do(OopClosure* f);       // weak roots
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   388
  // Balance each of the discovered lists.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   389
  void balance_all_queues();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   390
  void verify_list(DiscoveredList& ref_list);
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   391
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  // Discover a Reference object, using appropriate discovery criteria
49827
a4672513d6e3 8201646: Introduce ReferenceDiscoverer interface
pliden
parents: 47648
diff changeset
   393
  virtual bool discover_reference(oop obj, ReferenceType rt);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
37494
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37165
diff changeset
   395
  // Has discovered references that need handling
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37165
diff changeset
   396
  bool has_discovered_references();
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37165
diff changeset
   397
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  // Process references found during GC (called by the garbage collector)
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 13728
diff changeset
   399
  ReferenceProcessorStats
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   400
  process_discovered_references(BoolObjectClosure*            is_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   401
                                OopClosure*                   keep_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   402
                                VoidClosure*                  complete_gc,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   403
                                AbstractRefProcTaskExecutor*  task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   404
                                ReferenceProcessorPhaseTimes* phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  // Enqueue references at end of GC (called by the garbage collector)
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   407
  void enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   408
                                     ReferenceProcessorPhaseTimes* phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   410
  // 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
   411
  // 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
   412
  // 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
   413
  void abandon_partial_discovery();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   414
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   415
  size_t total_reference_count(ReferenceType rt) const;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   416
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  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
   419
  void verify_referent(oop obj)        PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   422
// A subject-to-discovery closure that uses a single memory span to determine the area that
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   423
// is subject to discovery. Useful for collectors which have contiguous generations.
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   424
class SpanSubjectToDiscoveryClosure : public BoolObjectClosure {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   425
  MemRegion _span;
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   426
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   427
public:
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   428
  SpanSubjectToDiscoveryClosure() : BoolObjectClosure(), _span() { }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   429
  SpanSubjectToDiscoveryClosure(MemRegion span) : BoolObjectClosure(), _span(span) { }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   430
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   431
  MemRegion span() const { return _span; }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   432
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   433
  void set_span(MemRegion mr) {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   434
    _span = mr;
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   435
  }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   436
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   437
  virtual bool do_object_b(oop obj) {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   438
    return _span.contains(obj);
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   439
  }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   440
};
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   441
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
// A utility class to disable reference discovery in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
// the scope which contains it, for given ReferenceProcessor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
class NoRefDiscovery: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  bool _was_discovering_refs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  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
   450
    _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
   451
    if (_was_discovering_refs) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
      _rp->disable_discovery();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  ~NoRefDiscovery() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    if (_was_discovering_refs) {
28212
647b7d0efb88 8066827: Remove ReferenceProcessor::clean_up_discovered_references()
kbarrett
parents: 25350
diff changeset
   458
      _rp->enable_discovery(false /*check_no_refs*/);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   463
// A utility class to temporarily mutate the subject discovery closure of the
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   464
// given ReferenceProcessor in the scope that contains it.
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   465
class ReferenceProcessorSubjectToDiscoveryMutator : StackObj {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   466
  ReferenceProcessor* _rp;
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   467
  BoolObjectClosure* _saved_cl;
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   468
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   469
public:
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   470
  ReferenceProcessorSubjectToDiscoveryMutator(ReferenceProcessor* rp, BoolObjectClosure* cl):
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   471
    _rp(rp) {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   472
    _saved_cl = _rp->is_subject_to_discovery_closure();
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   473
    _rp->set_is_subject_to_discovery_closure(cl);
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   474
  }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   475
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   476
  ~ReferenceProcessorSubjectToDiscoveryMutator() {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   477
    _rp->set_is_subject_to_discovery_closure(_saved_cl);
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   478
  }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   479
};
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
// A utility class to temporarily mutate the span of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
// given ReferenceProcessor in the scope that contains it.
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   483
class ReferenceProcessorSpanMutator : StackObj {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  ReferenceProcessor* _rp;
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   485
  SpanSubjectToDiscoveryClosure _discoverer;
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   486
  BoolObjectClosure* _old_discoverer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   488
public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  ReferenceProcessorSpanMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
                                MemRegion span):
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   491
    _rp(rp),
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   492
    _discoverer(span),
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   493
    _old_discoverer(rp->is_subject_to_discovery_closure()) {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   494
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   495
    rp->set_is_subject_to_discovery_closure(&_discoverer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  ~ReferenceProcessorSpanMutator() {
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49827
diff changeset
   499
    _rp->set_is_subject_to_discovery_closure(_old_discoverer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
// A utility class to temporarily change the MT'ness of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
// reference discovery for the given ReferenceProcessor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
// in the scope that contains it.
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   506
class ReferenceProcessorMTDiscoveryMutator: StackObj {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  bool                _saved_mt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
 public:
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   512
  ReferenceProcessorMTDiscoveryMutator(ReferenceProcessor* rp,
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   513
                                       bool mt):
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    _saved_mt = _rp->discovery_is_mt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
    _rp->set_mt_discovery(mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   519
  ~ReferenceProcessorMTDiscoveryMutator() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
    _rp->set_mt_discovery(_saved_mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
// A utility class to temporarily change the disposition
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
// of the "is_alive_non_header" closure field of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
// given ReferenceProcessor in the scope that contains it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
class ReferenceProcessorIsAliveMutator: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  BoolObjectClosure*  _saved_cl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  ReferenceProcessorIsAliveMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
                                   BoolObjectClosure*  cl):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
    _saved_cl = _rp->is_alive_non_header();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    _rp->set_is_alive_non_header(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  ~ReferenceProcessorIsAliveMutator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    _rp->set_is_alive_non_header(_saved_cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
// A utility class to temporarily change the disposition
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
// of the "discovery_is_atomic" field of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
// given ReferenceProcessor in the scope that contains it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
class ReferenceProcessorAtomicMutator: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  bool                _saved_atomic_discovery;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  ReferenceProcessorAtomicMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
                                  bool atomic):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
    _saved_atomic_discovery = _rp->discovery_is_atomic();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    _rp->set_atomic_discovery(atomic);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  ~ReferenceProcessorAtomicMutator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    _rp->set_atomic_discovery(_saved_atomic_discovery);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
// A utility class to temporarily change the MT processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
// disposition of the given ReferenceProcessor instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
// in the scope that contains it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
class ReferenceProcessorMTProcMutator: StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  ReferenceProcessor* _rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  bool  _saved_mt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  ReferenceProcessorMTProcMutator(ReferenceProcessor* rp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
                                  bool mt):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    _rp(rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    _saved_mt = _rp->processing_is_mt();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    _rp->set_mt_processing(mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  ~ReferenceProcessorMTProcMutator() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    _rp->set_mt_processing(_saved_mt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
// This class is an interface used to implement task execution for the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
// reference processing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
class AbstractRefProcTaskExecutor {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  // Abstract tasks to execute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  class ProcessTask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  class EnqueueTask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  // Executes a task using worker threads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  virtual void execute(ProcessTask& task) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  virtual void execute(EnqueueTask& task) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  // Switch to single threaded mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  virtual void set_single_threaded_mode() { };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
// Abstract reference processing task to execute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
class AbstractRefProcTaskExecutor::ProcessTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
protected:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   609
  ProcessTask(ReferenceProcessor&           ref_processor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   610
              DiscoveredList                refs_lists[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   611
              bool                          marks_oops_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   612
              ReferenceProcessorPhaseTimes* phase_times)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
    : _ref_processor(ref_processor),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
      _refs_lists(refs_lists),
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   615
      _phase_times(phase_times),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
      _marks_oops_alive(marks_oops_alive)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  virtual void work(unsigned int work_id, BoolObjectClosure& is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
                    OopClosure& keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
                    VoidClosure& complete_gc) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  // Returns true if a task marks some oops as alive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  bool marks_oops_alive() const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  { return _marks_oops_alive; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
protected:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   629
  ReferenceProcessor&           _ref_processor;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   630
  DiscoveredList*               _refs_lists;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   631
  ReferenceProcessorPhaseTimes* _phase_times;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   632
  const bool                    _marks_oops_alive;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
// Abstract reference processing task to execute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
class AbstractRefProcTaskExecutor::EnqueueTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
protected:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   638
  EnqueueTask(ReferenceProcessor&           ref_processor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   639
              DiscoveredList                refs_lists[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   640
              int                           n_queues,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   641
              ReferenceProcessorPhaseTimes* phase_times)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    : _ref_processor(ref_processor),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
      _refs_lists(refs_lists),
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   644
      _n_queues(n_queues),
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   645
      _phase_times(phase_times)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  virtual void work(unsigned int work_id) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
protected:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   652
  ReferenceProcessor&           _ref_processor;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   653
  DiscoveredList*               _refs_lists;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   654
  ReferenceProcessorPhaseTimes* _phase_times;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 46564
diff changeset
   655
  int                           _n_queues;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6769
diff changeset
   657
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30558
diff changeset
   658
#endif // SHARE_VM_GC_SHARED_REFERENCEPROCESSOR_HPP