src/hotspot/share/gc/shared/referenceProcessor.cpp
author tschatzl
Thu, 03 May 2018 14:09:00 +0200
changeset 49964 99e698e94cc7
parent 49808 f1dcdc3cd6b7
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
/*
49041
44122f767467 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents: 47998
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: 4738
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4738
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: 4738
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: 6759
diff changeset
    25
#include "precompiled.hpp"
35498
392b50de06c6 8146401: Clean up oop.hpp: add inline directives and fix header files
goetz
parents: 35475
diff changeset
    26
#include "classfile/javaClasses.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    27
#include "classfile/systemDictionary.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30579
diff changeset
    28
#include "gc/shared/collectedHeap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30579
diff changeset
    29
#include "gc/shared/collectedHeap.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30579
diff changeset
    30
#include "gc/shared/gcTimer.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
    31
#include "gc/shared/gcTraceTime.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30579
diff changeset
    32
#include "gc/shared/referencePolicy.hpp"
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35498
diff changeset
    33
#include "gc/shared/referenceProcessor.inline.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
    34
#include "logging/log.hpp"
49360
886acec3b4c6 8199275: Fix inclusions of allocation.inline.hpp
stefank
parents: 49041
diff changeset
    35
#include "memory/allocation.inline.hpp"
37248
11a660dbbb8e 8132524: Missing includes to resourceArea.hpp
jprovino
parents: 37165
diff changeset
    36
#include "memory/resourceArea.hpp"
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
    37
#include "oops/access.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    38
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    39
#include "runtime/java.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
    41
ReferencePolicy* ReferenceProcessor::_always_clear_soft_ref_policy = NULL;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
    42
ReferencePolicy* ReferenceProcessor::_default_soft_ref_policy      = NULL;
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    43
jlong            ReferenceProcessor::_soft_ref_timestamp_clock = 0;
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
    44
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
void referenceProcessor_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  ReferenceProcessor::init_statics();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
void ReferenceProcessor::init_statics() {
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22496
diff changeset
    50
  // We need a monotonically non-decreasing time in ms but
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
    51
  // os::javaTimeMillis() does not guarantee monotonicity.
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
    52
  jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    53
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    54
  // Initialize the soft ref timestamp clock.
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    55
  _soft_ref_timestamp_clock = now;
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    56
  // Also update the soft ref clock in j.l.r.SoftReference
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    57
  java_lang_ref_SoftReference::set_clock(_soft_ref_timestamp_clock);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
    59
  _always_clear_soft_ref_policy = new AlwaysClearPolicy();
43455
96560cffef4d 8166002: Emulate client build on platforms with reduced virtual address space
jcm
parents: 40892
diff changeset
    60
  if (is_server_compilation_mode_vm()) {
96560cffef4d 8166002: Emulate client build on platforms with reduced virtual address space
jcm
parents: 40892
diff changeset
    61
    _default_soft_ref_policy = new LRUMaxHeapPolicy();
96560cffef4d 8166002: Emulate client build on platforms with reduced virtual address space
jcm
parents: 40892
diff changeset
    62
  } else {
96560cffef4d 8166002: Emulate client build on platforms with reduced virtual address space
jcm
parents: 40892
diff changeset
    63
    _default_soft_ref_policy = new LRUCurrentHeapPolicy();
96560cffef4d 8166002: Emulate client build on platforms with reduced virtual address space
jcm
parents: 40892
diff changeset
    64
  }
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
    65
  if (_always_clear_soft_ref_policy == NULL || _default_soft_ref_policy == NULL) {
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
    66
    vm_exit_during_initialization("Could not allocate reference policy object");
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
    67
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  guarantee(RefDiscoveryPolicy == ReferenceBasedDiscovery ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
            RefDiscoveryPolicy == ReferentBasedDiscovery,
22775
52bc5222f5f1 8026849: Fix typos in the GC code, part 2
jwilhelm
parents: 22768
diff changeset
    70
            "Unrecognized RefDiscoveryPolicy");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
28212
647b7d0efb88 8066827: Remove ReferenceProcessor::clean_up_discovered_references()
kbarrett
parents: 26831
diff changeset
    73
void ReferenceProcessor::enable_discovery(bool check_no_refs) {
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    74
#ifdef ASSERT
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    75
  // Verify that we're not currently discovering refs
28212
647b7d0efb88 8066827: Remove ReferenceProcessor::clean_up_discovered_references()
kbarrett
parents: 26831
diff changeset
    76
  assert(!_discovering_refs, "nested call?");
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    77
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    78
  if (check_no_refs) {
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    79
    // Verify that the discovered lists are empty
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    80
    verify_no_references_recorded();
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    81
  }
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    82
#endif // ASSERT
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    83
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    84
  // Someone could have modified the value of the static
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    85
  // field in the j.l.r.SoftReference class that holds the
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    86
  // soft reference timestamp clock using reflection or
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    87
  // Unsafe between GCs. Unconditionally update the static
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    88
  // field in ReferenceProcessor here so that we use the new
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    89
  // value during reference discovery.
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    90
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    91
  _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock();
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    92
  _discovering_refs = true;
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    93
}
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
    94
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
    95
ReferenceProcessor::ReferenceProcessor(BoolObjectClosure* is_subject_to_discovery,
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
    96
                                       bool      mt_processing,
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
    97
                                       uint      mt_processing_degree,
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
    98
                                       bool      mt_discovery,
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
    99
                                       uint      mt_discovery_degree,
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   100
                                       bool      atomic_discovery,
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   101
                                       BoolObjectClosure* is_alive_non_header)  :
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   102
  _is_subject_to_discovery(is_subject_to_discovery),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  _discovering_refs(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  _enqueuing_is_done(false),
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   105
  _is_alive_non_header(is_alive_non_header),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  _processing_is_mt(mt_processing),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  _next_id(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
{
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   109
  assert(is_subject_to_discovery != NULL, "must be set");
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   110
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  _discovery_is_atomic = atomic_discovery;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  _discovery_is_mt     = mt_discovery;
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   113
  _num_q               = MAX2(1U, mt_processing_degree);
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   114
  _max_num_q           = MAX2(_num_q, mt_discovery_degree);
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   115
  _discovered_refs     = NEW_C_HEAP_ARRAY(DiscoveredList,
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11396
diff changeset
   116
            _max_num_q * number_of_subclasses_of_ref(), mtGC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11396
diff changeset
   117
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   118
  if (_discovered_refs == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    vm_exit_during_initialization("Could not allocated RefProc Array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  }
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   121
  _discoveredSoftRefs    = &_discovered_refs[0];
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   122
  _discoveredWeakRefs    = &_discoveredSoftRefs[_max_num_q];
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   123
  _discoveredFinalRefs   = &_discoveredWeakRefs[_max_num_q];
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   124
  _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q];
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   125
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   126
  // Initialize all entries to NULL
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   127
  for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   128
    _discovered_refs[i].set_head(NULL);
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   129
    _discovered_refs[i].set_length(0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  }
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   131
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   132
  setup_policy(false /* default soft ref policy */);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
void ReferenceProcessor::verify_no_references_recorded() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  guarantee(!_discovering_refs, "Discovering refs?");
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   138
  for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   139
    guarantee(_discovered_refs[i].is_empty(),
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   140
              "Found non-empty discovered list at %u", i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
void ReferenceProcessor::weak_oops_do(OopClosure* f) {
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   146
  for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   147
    if (UseCompressedOops) {
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   148
      f->do_oop((narrowOop*)_discovered_refs[i].adr_head());
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   149
    } else {
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   150
      f->do_oop((oop*)_discovered_refs[i].adr_head());
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   151
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   155
void ReferenceProcessor::update_soft_ref_master_clock() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  // Update (advance) the soft ref master clock field. This must be done
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // after processing the soft ref list.
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
   158
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22496
diff changeset
   159
  // We need a monotonically non-decreasing time in ms but
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
   160
  // os::javaTimeMillis() does not guarantee monotonicity.
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
   161
  jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   162
  jlong soft_ref_clock = java_lang_ref_SoftReference::clock();
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   163
  assert(soft_ref_clock == _soft_ref_timestamp_clock, "soft ref clocks out of sync");
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   164
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  NOT_PRODUCT(
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   166
  if (now < _soft_ref_timestamp_clock) {
37073
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 37067
diff changeset
   167
    log_warning(gc)("time warp: " JLONG_FORMAT " to " JLONG_FORMAT,
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 37067
diff changeset
   168
                    _soft_ref_timestamp_clock, now);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  )
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
   171
  // The values of now and _soft_ref_timestamp_clock are set using
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
   172
  // javaTimeNanos(), which is guaranteed to be monotonically
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
   173
  // non-decreasing provided the underlying platform provides such
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 10747
diff changeset
   174
  // a time source (and it is bug free).
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22496
diff changeset
   175
  // In product mode, however, protect ourselves from non-monotonicity.
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   176
  if (now > _soft_ref_timestamp_clock) {
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   177
    _soft_ref_timestamp_clock = now;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    java_lang_ref_SoftReference::set_clock(now);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Else leave clock stalled at its old value until time progresses
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // past clock value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   184
size_t ReferenceProcessor::total_count(DiscoveredList lists[]) const {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   185
  size_t total = 0;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   186
  for (uint i = 0; i < _max_num_q; ++i) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   187
    total += lists[i].length();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   188
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   189
  return total;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   190
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   191
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   192
ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   193
  BoolObjectClosure*            is_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   194
  OopClosure*                   keep_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   195
  VoidClosure*                  complete_gc,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   196
  AbstractRefProcTaskExecutor*  task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   197
  ReferenceProcessorPhaseTimes* phase_times) {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   198
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   199
  double start_time = os::elapsedTime();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  assert(!enqueuing_is_done(), "If here enqueuing should not be complete");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // Stop treating discovered references specially.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  disable_discovery();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   205
  // If discovery was concurrent, someone could have modified
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   206
  // the value of the static field in the j.l.r.SoftReference
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   207
  // class that holds the soft reference timestamp clock using
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   208
  // reflection or Unsafe between when discovery was enabled and
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   209
  // now. Unconditionally update the static field in ReferenceProcessor
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   210
  // here so that we use the new value during processing of the
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   211
  // discovered soft refs.
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   212
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   213
  _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock();
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   214
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   215
  ReferenceProcessorStats stats(total_count(_discoveredSoftRefs),
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   216
                                total_count(_discoveredWeakRefs),
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   217
                                total_count(_discoveredFinalRefs),
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   218
                                total_count(_discoveredPhantomRefs));
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents: 32817
diff changeset
   219
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  // Soft references
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   222
    RefProcPhaseTimesTracker tt(REF_SOFT, phase_times, this);
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents: 32817
diff changeset
   223
    process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true,
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   224
                               is_alive, keep_alive, complete_gc, task_executor, phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  update_soft_ref_master_clock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // Weak references
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   231
    RefProcPhaseTimesTracker tt(REF_WEAK, phase_times, this);
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents: 32817
diff changeset
   232
    process_discovered_reflist(_discoveredWeakRefs, NULL, true,
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   233
                               is_alive, keep_alive, complete_gc, task_executor, phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // Final references
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   238
    RefProcPhaseTimesTracker tt(REF_FINAL, phase_times, this);
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents: 32817
diff changeset
   239
    process_discovered_reflist(_discoveredFinalRefs, NULL, false,
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   240
                               is_alive, keep_alive, complete_gc, task_executor, phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // Phantom references
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   245
    RefProcPhaseTimesTracker tt(REF_PHANTOM, phase_times, this);
35225
2b16576599d7 8071507: (ref) Clear phantom reference as soft and weak references do
kbarrett
parents: 35061
diff changeset
   246
    process_discovered_reflist(_discoveredPhantomRefs, NULL, true,
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   247
                               is_alive, keep_alive, complete_gc, task_executor, phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
47648
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47216
diff changeset
   250
  if (task_executor != NULL) {
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47216
diff changeset
   251
    // Record the work done by the parallel workers.
226b1fc611b9 8189359: Move native weak oops cleaning out of ReferenceProcessor
stefank
parents: 47216
diff changeset
   252
    task_executor->set_single_threaded_mode();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   254
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   255
  phase_times->set_total_time_ms((os::elapsedTime() - start_time) * 1000);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   256
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents: 32817
diff changeset
   257
  return stats;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   260
void ReferenceProcessor::enqueue_discovered_references(AbstractRefProcTaskExecutor*  task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   261
                                                       ReferenceProcessorPhaseTimes* phase_times) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // Enqueue references that are not made active again, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // clear the decks for the next collection (cycle).
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   264
  enqueue_discovered_reflists(task_executor, phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  // Stop treating discovered references specially.
40892
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   267
  disable_discovery();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
40892
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   270
void ReferenceProcessor::enqueue_discovered_reflist(DiscoveredList& refs_list) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // Given a list of refs linked through the "discovered" field
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   272
  // (java.lang.ref.Reference.discovered), self-loop their "next" field
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   273
  // thus distinguishing them from active References, then
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   274
  // prepend them to the pending list.
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   275
  //
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   276
  // The Java threads will see the Reference objects linked together through
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   277
  // the discovered field. Instead of trying to do the write barrier updates
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   278
  // in all places in the reference processor where we manipulate the discovered
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   279
  // field we make sure to do the barrier here where we anyway iterate through
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   280
  // all linked Reference objects. Note that it is important to not dirty any
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   281
  // cards during reference processing since this will cause card table
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   282
  // verification to fail for G1.
36198
658f3871f6a2 8150302: Reference processing logging prints the "from list" incorrectly
jmasa
parents: 35862
diff changeset
   283
  log_develop_trace(gc, ref)("ReferenceProcessor::enqueue_discovered_reflist list " INTPTR_FORMAT, p2i(&refs_list));
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   284
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   285
  oop obj = NULL;
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   286
  oop next_d = refs_list.head();
30558
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   287
  // Walk down the list, self-looping the next field
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   288
  // so that the References are not considered active.
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   289
  while (obj != next_d) {
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   290
    obj = next_d;
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33198
diff changeset
   291
    assert(obj->is_instance(), "should be an instance object");
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33198
diff changeset
   292
    assert(InstanceKlass::cast(obj->klass())->is_reference_instance_klass(), "should be reference object");
30558
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   293
    next_d = java_lang_ref_Reference::discovered(obj);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   294
    log_develop_trace(gc, ref)("        obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT, p2i(obj), p2i(next_d));
30558
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   295
    assert(java_lang_ref_Reference::next(obj) == NULL,
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   296
           "Reference not active; should not be discovered");
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   297
    // Self-loop next, so as to make Ref not active.
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   298
    java_lang_ref_Reference::set_next_raw(obj, obj);
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   299
    if (next_d != obj) {
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   300
      HeapAccess<AS_NO_KEEPALIVE>::oop_store_at(obj, java_lang_ref_Reference::discovered_offset, next_d);
30558
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   301
    } else {
baec90a2699f 8031401: Remove unused code in the reference processor
kbarrett
parents: 29807
diff changeset
   302
      // This is the last object.
40892
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   303
      // Swap refs_list into pending list and set obj's
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   304
      // discovered to what we read from the pending list.
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   305
      oop old = Universe::swap_reference_pending_list(refs_list.head());
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   306
      HeapAccess<AS_NO_KEEPALIVE>::oop_store_at(obj, java_lang_ref_Reference::discovered_offset, old);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// Parallel enqueue task
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
class RefProcEnqueueTask: public AbstractRefProcTaskExecutor::EnqueueTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
public:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   314
  RefProcEnqueueTask(ReferenceProcessor&           ref_processor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   315
                     DiscoveredList                discovered_refs[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   316
                     int                           n_queues,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   317
                     ReferenceProcessorPhaseTimes* phase_times)
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   318
    : EnqueueTask(ref_processor, discovered_refs, n_queues, phase_times)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   321
  virtual void work(unsigned int work_id) {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   322
    RefProcWorkerTimeTracker tt(ReferenceProcessorPhaseTimes::RefEnqueue, _phase_times, work_id);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   323
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   324
    assert(work_id < (unsigned int)_ref_processor.max_num_q(), "Index out-of-bounds");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    // Simplest first cut: static partitioning.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    int index = work_id;
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   327
    // The increment on "index" must correspond to the maximum number of queues
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   328
    // (n_queues) with which that ReferenceProcessor was created.  That
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   329
    // is because of the "clever" way the discovered references lists were
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   330
    // allocated and are indexed into.
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7420
diff changeset
   331
    assert(_n_queues == (int) _ref_processor.max_num_q(), "Different number not expected");
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   332
    for (int j = 0;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   333
         j < ReferenceProcessor::number_of_subclasses_of_ref();
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   334
         j++, index += _n_queues) {
40892
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   335
      _ref_processor.enqueue_discovered_reflist(_refs_lists[index]);
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   336
      _refs_lists[index].set_head(NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
      _refs_lists[index].set_length(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
// Enqueue references that are not made active again
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   343
void ReferenceProcessor::enqueue_discovered_reflists(AbstractRefProcTaskExecutor*  task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   344
                                                     ReferenceProcessorPhaseTimes* phase_times) {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   345
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   346
  ReferenceProcessorStats stats(total_count(_discoveredSoftRefs),
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   347
                                total_count(_discoveredWeakRefs),
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   348
                                total_count(_discoveredFinalRefs),
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   349
                                total_count(_discoveredPhantomRefs));
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   350
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   351
  RefProcEnqueueTimeTracker tt(phase_times, stats);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   352
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  if (_processing_is_mt && task_executor != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
    // Parallel code
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   355
    RefProcEnqueueTask tsk(*this, _discovered_refs, _max_num_q, phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
    task_executor->execute(tsk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    // Serial code: call the parent class's implementation
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   359
    for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
40892
330a02d935ad 8156500: Move Reference pending list into VM to prevent deadlocks
kbarrett
parents: 37494
diff changeset
   360
      enqueue_discovered_reflist(_discovered_refs[i]);
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   361
      _discovered_refs[i].set_head(NULL);
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10683
diff changeset
   362
      _discovered_refs[i].set_length(0);
1
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
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   367
void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) {
49041
44122f767467 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents: 47998
diff changeset
   368
  _discovered_addr = java_lang_ref_Reference::discovered_addr_raw(_ref);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   369
  oop discovered = java_lang_ref_Reference::discovered(_ref);
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
   370
  assert(_discovered_addr && oopDesc::is_oop_or_null(discovered),
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 33103
diff changeset
   371
         "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   372
  _next = discovered;
49041
44122f767467 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents: 47998
diff changeset
   373
  _referent_addr = java_lang_ref_Reference::referent_addr_raw(_ref);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   374
  _referent = java_lang_ref_Reference::referent(_ref);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  assert(Universe::heap()->is_in_reserved_or_null(_referent),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
         "Wrong oop found in java.lang.Reference object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  assert(allow_null_referent ?
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
   378
             oopDesc::is_oop_or_null(_referent)
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
   379
           : oopDesc::is_oop(_referent),
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 33103
diff changeset
   380
         "Expected an oop%s for referent field at " PTR_FORMAT,
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 33103
diff changeset
   381
         (allow_null_referent ? " or NULL" : ""),
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 33103
diff changeset
   382
         p2i(_referent));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   385
void DiscoveredListIterator::remove() {
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
   386
  assert(oopDesc::is_oop(_ref), "Dropping a bad reference");
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   387
  RawAccess<>::oop_store(_discovered_addr, oop(NULL));
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   388
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   389
  // First _prev_next ref actually points into DiscoveredList (gross).
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   390
  oop new_next;
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   391
  if (_next == _ref) {
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   392
    // At the end of the list, we should make _prev point to itself.
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   393
    // If _ref is the first ref, then _prev_next will be in the DiscoveredList,
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   394
    // and _prev will be NULL.
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   395
    new_next = _prev;
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   396
  } else {
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   397
    new_next = _next;
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   398
  }
22768
363a44995a71 8031703: Missing post-barrier in ReferenceProcessor
pliden
parents: 22551
diff changeset
   399
  // Remove Reference object from discovered list. Note that G1 does not need a
363a44995a71 8031703: Missing post-barrier in ReferenceProcessor
pliden
parents: 22551
diff changeset
   400
  // pre-barrier here because we know the Reference has already been found/marked,
363a44995a71 8031703: Missing post-barrier in ReferenceProcessor
pliden
parents: 22551
diff changeset
   401
  // that's how it ended up in the discovered list in the first place.
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   402
  RawAccess<>::oop_store(_prev_next, new_next);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  NOT_PRODUCT(_removed++);
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   404
  _refs_list.dec_length(1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
   407
void DiscoveredListIterator::clear_referent() {
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   408
  RawAccess<>::oop_store(_referent_addr, oop(NULL));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
// NOTE: process_phase*() are largely similar, and at a high level
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
// merely iterate over the extant list applying a predicate to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
// each of its elements and possibly removing that element from the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
// list and applying some further closures to that element.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
// We should consider the possibility of replacing these
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
// process_phase*() methods by abstracting them into
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
// a single general iterator invocation that receives appropriate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
// closures that accomplish this work.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
// (SoftReferences only) Traverse the list and remove any SoftReferences whose
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
// referents are not alive, but that should be kept alive for policy reasons.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
// Keep alive the transitive closure of all such referents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
void
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   424
ReferenceProcessor::process_phase1(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
                                   ReferencePolicy*   policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
                                   BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
                                   OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
                                   VoidClosure*       complete_gc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  assert(policy != NULL, "Must have a non-NULL policy");
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   430
  DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  // Decide which softly reachable refs should be kept alive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  while (iter.has_next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
    iter.load_ptrs(DEBUG_ONLY(!discovery_is_atomic() /* allow_null_referent */));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    bool referent_is_dead = (iter.referent() != NULL) && !iter.is_referent_alive();
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   435
    if (referent_is_dead &&
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
   436
        !policy->should_clear_reference(iter.obj(), _soft_ref_timestamp_clock)) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   437
      log_develop_trace(gc, ref)("Dropping reference (" INTPTR_FORMAT ": %s"  ") by policy",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   438
                                 p2i(iter.obj()), iter.obj()->klass()->internal_name());
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   439
      // Remove Reference object from list
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   440
      iter.remove();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
      // keep the referent around
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
      iter.make_referent_alive();
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   443
      iter.move_to_next();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
      iter.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // Close the reachable set
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  complete_gc->do_void();
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   450
  log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " dead Refs out of " SIZE_FORMAT " discovered Refs by policy, from list " INTPTR_FORMAT,
36198
658f3871f6a2 8150302: Reference processing logging prints the "from list" incorrectly
jmasa
parents: 35862
diff changeset
   451
                             iter.removed(), iter.processed(), p2i(&refs_list));
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   452
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   454
void ReferenceProcessor::process_phase2(DiscoveredList&    refs_list,
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   455
                                        BoolObjectClosure* is_alive,
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   456
                                        OopClosure*        keep_alive,
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   457
                                        VoidClosure*       complete_gc) {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   458
  if (discovery_is_atomic()) {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   459
    // complete_gc is ignored in this case for this phase
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   460
    pp2_work(refs_list, is_alive, keep_alive);
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   461
  } else {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   462
    assert(complete_gc != NULL, "Error");
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   463
    pp2_work_concurrent_discovery(refs_list, is_alive,
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   464
                                  keep_alive, complete_gc);
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   465
  }
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   466
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
// Traverse the list and remove any Refs that are not active, or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
// whose referents are either alive or NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
void
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   470
ReferenceProcessor::pp2_work(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
                             BoolObjectClosure* is_alive,
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   472
                             OopClosure*        keep_alive) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  assert(discovery_is_atomic(), "Error");
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   474
  DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  while (iter.has_next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
    iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */));
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   477
    DEBUG_ONLY(oop next = java_lang_ref_Reference::next(iter.obj());)
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   478
    assert(next == NULL, "Should not discover inactive Reference");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
    if (iter.is_referent_alive()) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   480
      log_develop_trace(gc, ref)("Dropping strongly reachable reference (" INTPTR_FORMAT ": %s)",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   481
                                 p2i(iter.obj()), iter.obj()->klass()->internal_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
      // The referent is reachable after all.
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   483
      // Remove Reference object from list.
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   484
      iter.remove();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
      // Update the referent pointer as necessary: Note that this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
      // should not entail any recursive marking because the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
      // referent must already have been traversed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
      iter.make_referent_alive();
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   489
      iter.move_to_next();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
      iter.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  NOT_PRODUCT(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   495
    if (iter.processed() > 0) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   496
      log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT
29800
fa5f7a2bf717 8076073: shared: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29580
diff changeset
   497
        " Refs in discovered list " INTPTR_FORMAT,
36198
658f3871f6a2 8150302: Reference processing logging prints the "from list" incorrectly
jmasa
parents: 35862
diff changeset
   498
        iter.removed(), iter.processed(), p2i(&refs_list));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
    }
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
void
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   504
ReferenceProcessor::pp2_work_concurrent_discovery(DiscoveredList&    refs_list,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   505
                                                  BoolObjectClosure* is_alive,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   506
                                                  OopClosure*        keep_alive,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   507
                                                  VoidClosure*       complete_gc) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  assert(!discovery_is_atomic(), "Error");
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   509
  DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  while (iter.has_next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */));
49041
44122f767467 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents: 47998
diff changeset
   512
    HeapWord* next_addr = java_lang_ref_Reference::next_addr_raw(iter.obj());
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   513
    oop next = java_lang_ref_Reference::next(iter.obj());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    if ((iter.referent() == NULL || iter.is_referent_alive() ||
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   515
         next != NULL)) {
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
   516
      assert(oopDesc::is_oop_or_null(next), "Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
      // Remove Reference object from list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
      iter.remove();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
      // Trace the cohorts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
      iter.make_referent_alive();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   521
      if (UseCompressedOops) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   522
        keep_alive->do_oop((narrowOop*)next_addr);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   523
      } else {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   524
        keep_alive->do_oop((oop*)next_addr);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   525
      }
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   526
      iter.move_to_next();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      iter.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  // Now close the newly reachable set
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  complete_gc->do_void();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  NOT_PRODUCT(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   534
    if (iter.processed() > 0) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   535
      log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT
29800
fa5f7a2bf717 8076073: shared: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29580
diff changeset
   536
        " Refs in discovered list " INTPTR_FORMAT,
36198
658f3871f6a2 8150302: Reference processing logging prints the "from list" incorrectly
jmasa
parents: 35862
diff changeset
   537
        iter.removed(), iter.processed(), p2i(&refs_list));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
// Traverse the list and process the referents, by either
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   543
// clearing them or keeping them (and their reachable
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
// closure) alive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
void
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   546
ReferenceProcessor::process_phase3(DiscoveredList&    refs_list,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
                                   bool               clear_referent,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
                                   BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
                                   OopClosure*        keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
                                   VoidClosure*       complete_gc) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   551
  ResourceMark rm;
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   552
  DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  while (iter.has_next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
    iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
    if (clear_referent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
      // NULL out referent pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
      iter.clear_referent();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
      // keep the referent around
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
      iter.make_referent_alive();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    }
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   562
    log_develop_trace(gc, ref)("Adding %sreference (" INTPTR_FORMAT ": %s) as pending",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   563
                               clear_referent ? "cleared " : "", p2i(iter.obj()), iter.obj()->klass()->internal_name());
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
   564
    assert(oopDesc::is_oop(iter.obj(), UseConcMarkSweepGC), "Adding a bad reference");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    iter.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // Close the reachable set
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  complete_gc->do_void();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
void
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   572
ReferenceProcessor::clear_discovered_references(DiscoveredList& refs_list) {
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   573
  oop obj = NULL;
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   574
  oop next = refs_list.head();
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   575
  while (next != obj) {
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   576
    obj = next;
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   577
    next = java_lang_ref_Reference::discovered(obj);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   578
    java_lang_ref_Reference::set_discovered_raw(obj, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  }
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   580
  refs_list.set_head(NULL);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   581
  refs_list.set_length(0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   584
void ReferenceProcessor::abandon_partial_discovery() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   585
  // loop over the lists
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   586
  for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   587
    if ((i % _max_num_q) == 0) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   588
      log_develop_trace(gc, ref)("Abandoning %s discovered list", list_name(i));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   589
    }
30766
8afe4435d599 8058265: No callers of ReferenceProcessor::clear_discovered_references
kbarrett
parents: 30764
diff changeset
   590
    clear_discovered_references(_discovered_refs[i]);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   594
size_t ReferenceProcessor::total_reference_count(ReferenceType type) const {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   595
  DiscoveredList* list = NULL;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   596
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   597
  switch (type) {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   598
    case REF_SOFT:
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   599
      list = _discoveredSoftRefs;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   600
      break;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   601
    case REF_WEAK:
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   602
      list = _discoveredWeakRefs;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   603
      break;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   604
    case REF_FINAL:
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   605
      list = _discoveredFinalRefs;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   606
      break;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   607
    case REF_PHANTOM:
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   608
      list = _discoveredPhantomRefs;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   609
      break;
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   610
    case REF_OTHER:
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   611
    case REF_NONE:
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   612
    default:
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   613
      ShouldNotReachHere();
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   614
  }
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   615
  return total_count(list);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   616
}
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   617
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
class RefProcPhase1Task: public AbstractRefProcTaskExecutor::ProcessTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
public:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   620
  RefProcPhase1Task(ReferenceProcessor&           ref_processor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   621
                    DiscoveredList                refs_lists[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   622
                    ReferencePolicy*              policy,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   623
                    bool                          marks_oops_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   624
                    ReferenceProcessorPhaseTimes* phase_times)
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   625
    : ProcessTask(ref_processor, refs_lists, marks_oops_alive, phase_times),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
      _policy(policy)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  virtual void work(unsigned int i, BoolObjectClosure& is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
                    OopClosure& keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
                    VoidClosure& complete_gc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   632
    RefProcWorkerTimeTracker tt(ReferenceProcessorPhaseTimes::RefPhase1, _phase_times, i);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   633
37067
1d728037b6a6 8134749: SoftReferences declared dead too early
pliden
parents: 36198
diff changeset
   634
    _ref_processor.process_phase1(_refs_lists[i], _policy,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
                                  &is_alive, &keep_alive, &complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  ReferencePolicy* _policy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
class RefProcPhase2Task: public AbstractRefProcTaskExecutor::ProcessTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
public:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   643
  RefProcPhase2Task(ReferenceProcessor&           ref_processor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   644
                    DiscoveredList                refs_lists[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   645
                    bool                          marks_oops_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   646
                    ReferenceProcessorPhaseTimes* phase_times)
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   647
    : ProcessTask(ref_processor, refs_lists, marks_oops_alive, phase_times)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  virtual void work(unsigned int i, BoolObjectClosure& is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
                    OopClosure& keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
                    VoidClosure& complete_gc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   653
    RefProcWorkerTimeTracker tt(ReferenceProcessorPhaseTimes::RefPhase2, _phase_times, i);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   654
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
    _ref_processor.process_phase2(_refs_lists[i],
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
                                  &is_alive, &keep_alive, &complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
class RefProcPhase3Task: public AbstractRefProcTaskExecutor::ProcessTask {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
public:
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   662
  RefProcPhase3Task(ReferenceProcessor&           ref_processor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   663
                    DiscoveredList                refs_lists[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   664
                    bool                         clear_referent,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   665
                    bool                          marks_oops_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   666
                    ReferenceProcessorPhaseTimes* phase_times)
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   667
    : ProcessTask(ref_processor, refs_lists, marks_oops_alive, phase_times),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
      _clear_referent(clear_referent)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  virtual void work(unsigned int i, BoolObjectClosure& is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
                    OopClosure& keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
                    VoidClosure& complete_gc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   674
    RefProcWorkerTimeTracker tt(ReferenceProcessorPhaseTimes::RefPhase3, _phase_times, i);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   675
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    _ref_processor.process_phase3(_refs_lists[i], _clear_referent,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
                                  &is_alive, &keep_alive, &complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  bool _clear_referent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   683
#ifndef PRODUCT
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   684
void ReferenceProcessor::log_reflist_counts(DiscoveredList ref_lists[], uint active_length, size_t total_refs) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   685
  if (!log_is_enabled(Trace, gc, ref)) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   686
    return;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   687
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   688
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   689
  stringStream st;
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   690
  for (uint i = 0; i < active_length; ++i) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   691
    st.print(SIZE_FORMAT " ", ref_lists[i].length());
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   692
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   693
  log_develop_trace(gc, ref)("%s= " SIZE_FORMAT, st.as_string(), total_refs);
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   694
#ifdef ASSERT
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   695
  for (uint i = active_length; i < _max_num_q; i++) {
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   696
    assert(ref_lists[i].length() == 0, SIZE_FORMAT " unexpected References in %u",
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   697
           ref_lists[i].length(), i);
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   698
  }
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   699
#endif
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   700
}
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   701
#endif
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   702
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   703
void ReferenceProcessor::set_active_mt_degree(uint v) {
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   704
  _num_q = v;
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   705
  _next_id = 0;
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   706
}
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   707
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
// Balances reference queues.
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   709
// Move entries from all queues[0, 1, ..., _max_num_q-1] to
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   710
// queues[0, 1, ..., _num_q-1] because only the first _num_q
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   711
// corresponding to the active workers will be processed.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
void ReferenceProcessor::balance_queues(DiscoveredList ref_lists[])
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  // calculate total length
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  size_t total_refs = 0;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   716
  log_develop_trace(gc, ref)("Balance ref_lists ");
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   717
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   718
  for (uint i = 0; i < _max_num_q; ++i) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    total_refs += ref_lists[i].length();
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   720
  }
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   721
  log_reflist_counts(ref_lists, _max_num_q, total_refs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  size_t avg_refs = total_refs / _num_q + 1;
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   723
  uint to_idx = 0;
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   724
  for (uint from_idx = 0; from_idx < _max_num_q; from_idx++) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   725
    bool move_all = false;
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   726
    if (from_idx >= _num_q) {
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   727
      move_all = ref_lists[from_idx].length() > 0;
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   728
    }
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   729
    while ((ref_lists[from_idx].length() > avg_refs) ||
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   730
           move_all) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
      assert(to_idx < _num_q, "Sanity Check!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
      if (ref_lists[to_idx].length() < avg_refs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
        // move superfluous refs
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   734
        size_t refs_to_move;
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   735
        // Move all the Ref's if the from queue will not be processed.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   736
        if (move_all) {
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   737
          refs_to_move = MIN2(ref_lists[from_idx].length(),
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   738
                              avg_refs - ref_lists[to_idx].length());
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   739
        } else {
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   740
          refs_to_move = MIN2(ref_lists[from_idx].length() - avg_refs,
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   741
                              avg_refs - ref_lists[to_idx].length());
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   742
        }
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   743
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   744
        assert(refs_to_move > 0, "otherwise the code below will fail");
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   745
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
        oop move_head = ref_lists[from_idx].head();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
        oop move_tail = move_head;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
        oop new_head  = move_head;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
        // find an element to split the list on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
        for (size_t j = 0; j < refs_to_move; ++j) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
          move_tail = new_head;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   752
          new_head = java_lang_ref_Reference::discovered(new_head);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
        }
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   754
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   755
        // Add the chain to the to list.
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   756
        if (ref_lists[to_idx].head() == NULL) {
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   757
          // to list is empty. Make a loop at the end.
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   758
          java_lang_ref_Reference::set_discovered_raw(move_tail, move_tail);
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   759
        } else {
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
   760
          java_lang_ref_Reference::set_discovered_raw(move_tail, ref_lists[to_idx].head());
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   761
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
        ref_lists[to_idx].set_head(move_head);
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   763
        ref_lists[to_idx].inc_length(refs_to_move);
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   764
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   765
        // Remove the chain from the from list.
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   766
        if (move_tail == new_head) {
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   767
          // We found the end of the from list.
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   768
          ref_lists[from_idx].set_head(NULL);
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   769
        } else {
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   770
          ref_lists[from_idx].set_head(new_head);
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   771
        }
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   772
        ref_lists[from_idx].dec_length(refs_to_move);
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   773
        if (ref_lists[from_idx].length() == 0) {
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   774
          break;
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   775
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
      } else {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   777
        to_idx = (to_idx + 1) % _num_q;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  }
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   781
#ifdef ASSERT
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   782
  size_t balanced_total_refs = 0;
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   783
  for (uint i = 0; i < _num_q; ++i) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   784
    balanced_total_refs += ref_lists[i].length();
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   785
  }
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   786
  log_reflist_counts(ref_lists, _num_q, balanced_total_refs);
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   787
  assert(total_refs == balanced_total_refs, "Balancing was incomplete");
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   788
#endif
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   789
}
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   790
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   791
void ReferenceProcessor::balance_all_queues() {
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   792
  balance_queues(_discoveredSoftRefs);
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   793
  balance_queues(_discoveredWeakRefs);
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   794
  balance_queues(_discoveredFinalRefs);
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   795
  balance_queues(_discoveredPhantomRefs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
33103
116b558af514 8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
brutisso
parents: 32817
diff changeset
   798
void ReferenceProcessor::process_discovered_reflist(
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   799
  DiscoveredList                refs_lists[],
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   800
  ReferencePolicy*              policy,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   801
  bool                          clear_referent,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   802
  BoolObjectClosure*            is_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   803
  OopClosure*                   keep_alive,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   804
  VoidClosure*                  complete_gc,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   805
  AbstractRefProcTaskExecutor*  task_executor,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   806
  ReferenceProcessorPhaseTimes* phase_times)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
{
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   808
  bool mt_processing = task_executor != NULL && _processing_is_mt;
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   809
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   810
  phase_times->set_processing_is_mt(mt_processing);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   811
49808
f1dcdc3cd6b7 8201487: Do not rebalance reference processing queues if not doing parallel reference processing
tschatzl
parents: 49360
diff changeset
   812
  if (mt_processing && ParallelRefProcBalancingEnabled) {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   813
    RefProcBalanceQueuesTimeTracker tt(phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
    balance_queues(refs_lists);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   816
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // Phase 1 (soft refs only):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  // . Traverse the list and remove any SoftReferences whose
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  //   referents are not alive, but that should be kept alive for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  //   policy reasons. Keep alive the transitive closure of all
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  //   such referents.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  if (policy != NULL) {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   823
    RefProcParPhaseTimeTracker tt(ReferenceProcessorPhaseTimes::RefPhase1, phase_times);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   824
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
   825
    if (mt_processing) {
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   826
      RefProcPhase1Task phase1(*this, refs_lists, policy, true /*marks_oops_alive*/, phase_times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
      task_executor->execute(phase1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
    } else {
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   829
      for (uint i = 0; i < _max_num_q; i++) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
        process_phase1(refs_lists[i], policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
                       is_alive, keep_alive, complete_gc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
  } else { // policy == NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    assert(refs_lists != _discoveredSoftRefs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
           "Policy must be specified for soft references.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  // Phase 2:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  // . Traverse the list and remove any refs whose referents are alive.
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   841
  {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   842
    RefProcParPhaseTimeTracker tt(ReferenceProcessorPhaseTimes::RefPhase2, phase_times);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   843
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   844
    if (mt_processing) {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   845
      RefProcPhase2Task phase2(*this, refs_lists, !discovery_is_atomic() /*marks_oops_alive*/, phase_times);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   846
      task_executor->execute(phase2);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   847
    } else {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   848
      for (uint i = 0; i < _max_num_q; i++) {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   849
        process_phase2(refs_lists[i], is_alive, keep_alive, complete_gc);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   850
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  // Phase 3:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  // . Traverse the list and process referents as appropriate.
46795
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   856
  {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   857
    RefProcParPhaseTimeTracker tt(ReferenceProcessorPhaseTimes::RefPhase3, phase_times);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   858
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   859
    if (mt_processing) {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   860
      RefProcPhase3Task phase3(*this, refs_lists, clear_referent, true /*marks_oops_alive*/, phase_times);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   861
      task_executor->execute(phase3);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   862
    } else {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   863
      for (uint i = 0; i < _max_num_q; i++) {
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   864
        process_phase3(refs_lists[i], clear_referent,
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   865
                       is_alive, keep_alive, complete_gc);
623a5e42deb6 8173335: Improve logging for j.l.ref.reference processing
sangheki
parents: 43455
diff changeset
   866
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt) {
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   872
  uint id = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  // Determine the queue index to use for this object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  if (_discovery_is_mt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    // During a multi-threaded discovery phase,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
    // each thread saves to its "own" list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
    Thread* thr = Thread::current();
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7397
diff changeset
   878
    id = thr->as_Worker_thread()->id();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
    // single-threaded discovery, we save in round-robin
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
    // fashion to each of the lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    if (_processing_is_mt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
      id = next_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  }
37165
ed7da23aaa16 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
jmasa
parents: 37106
diff changeset
   886
  assert(id < _max_num_q, "Id is out-of-bounds id %u and max id %u)", id, _max_num_q);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  // Get the discovered queue to which we will add
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  DiscoveredList* list = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  switch (rt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
    case REF_OTHER:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
      // Unknown reference type, no special treatment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
    case REF_SOFT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
      list = &_discoveredSoftRefs[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
    case REF_WEAK:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
      list = &_discoveredWeakRefs[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
    case REF_FINAL:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
      list = &_discoveredFinalRefs[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
    case REF_PHANTOM:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
      list = &_discoveredPhantomRefs[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
    case REF_NONE:
13738
d67be49a5beb 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 13728
diff changeset
   907
      // we should not reach here if we are an InstanceRefKlass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
    default:
32817
acc2744fd84b 8136627: Backout JDK-8133818 Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
kbarrett
parents: 32623
diff changeset
   909
      ShouldNotReachHere();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  }
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   911
  log_develop_trace(gc, ref)("Thread %d gets list " INTPTR_FORMAT, id, p2i(list));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  return list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   915
inline void
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   916
ReferenceProcessor::add_to_discovered_list_mt(DiscoveredList& refs_list,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   917
                                              oop             obj,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   918
                                              HeapWord*       discovered_addr) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  assert(_discovery_is_mt, "!_discovery_is_mt should have been handled by caller");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  // First we must make sure this object is only enqueued once. CAS in a non null
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  // discovered_addr.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   922
  oop current_head = refs_list.head();
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   923
  // The last ref must have its discovered field pointing to itself.
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
   924
  oop next_discovered = (current_head != NULL) ? current_head : obj;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   925
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   926
  oop retest = RawAccess<>::oop_atomic_cmpxchg(next_discovered, discovered_addr, oop(NULL));
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   927
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  if (retest == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
    // This thread just won the right to enqueue the object.
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   930
    // We have separate lists for enqueueing, so no synchronization
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
    // is necessary.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   932
    refs_list.set_head(obj);
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
   933
    refs_list.inc_length(1);
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7397
diff changeset
   934
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   935
    log_develop_trace(gc, ref)("Discovered reference (mt) (" INTPTR_FORMAT ": %s)",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   936
                               p2i(obj), obj->klass()->internal_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
    // If retest was non NULL, another thread beat us to it:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
    // The reference has already been discovered...
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   940
    log_develop_trace(gc, ref)("Already discovered reference (" INTPTR_FORMAT ": %s)",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
   941
                               p2i(obj), obj->klass()->internal_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  }
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
   943
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
7420
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   945
#ifndef PRODUCT
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   946
// Non-atomic (i.e. concurrent) discovery might allow us
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   947
// to observe j.l.References with NULL referents, being those
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   948
// cleared concurrently by mutators during (or after) discovery.
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   949
void ReferenceProcessor::verify_referent(oop obj) {
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   950
  bool da = discovery_is_atomic();
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   951
  oop referent = java_lang_ref_Reference::referent(obj);
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
   952
  assert(da ? oopDesc::is_oop(referent) : oopDesc::is_oop_or_null(referent),
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 33103
diff changeset
   953
         "Bad referent " INTPTR_FORMAT " found in Reference "
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 33103
diff changeset
   954
         INTPTR_FORMAT " during %satomic discovery ",
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 33103
diff changeset
   955
         p2i(referent), p2i(obj), da ? "" : "non-");
7420
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   956
}
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   957
#endif
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
   958
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   959
bool ReferenceProcessor::is_subject_to_discovery(oop const obj) const {
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   960
  return _is_subject_to_discovery->do_object_b(obj);
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   961
}
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
   962
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
// We mention two of several possible choices here:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
// #0: if the reference object is not in the "originating generation"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
//     (or part of the heap being collected, indicated by our "span"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
//     we don't treat it specially (i.e. we scan it as we would
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
//     a normal oop, treating its references as strong references).
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   968
//     This means that references can't be discovered unless their
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
//     referent is also in the same span. This is the simplest,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
//     most "local" and most conservative approach, albeit one
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
//     that may cause weak references to be enqueued least promptly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
//     We call this choice the "ReferenceBasedDiscovery" policy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
// #1: the reference object may be in any generation (span), but if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
//     the referent is in the generation (span) being currently collected
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
//     then we can discover the reference object, provided
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
//     the object has not already been discovered by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
//     a different concurrently running collector (as may be the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
//     case, for instance, if the reference object is in CMS and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
//     the referent in DefNewGeneration), and provided the processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
//     of this reference object by the current collector will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
//     appear atomic to every other collector in the system.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
//     (Thus, for instance, a concurrent collector may not
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
//     discover references in other generations even if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
//     referent is in its own generation). This policy may,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
//     in certain cases, enqueue references somewhat sooner than
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
//     might Policy #0 above, but at marginally increased cost
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
//     and complexity in processing these references.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
//     We call this choice the "RefeferentBasedDiscovery" policy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
bool ReferenceProcessor::discover_reference(oop obj, ReferenceType rt) {
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   990
  // Make sure we are discovering refs (rather than processing discovered refs).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  if (!_discovering_refs || !RegisterReferences) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  }
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   994
  // We only discover active references.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
   995
  oop next = java_lang_ref_Reference::next(obj);
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
   996
  if (next != NULL) {   // Ref is no longer active
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  if (RefDiscoveryPolicy == ReferenceBasedDiscovery &&
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
  1001
      !is_subject_to_discovery(obj)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
    // Reference is not in the originating generation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
    // don't treat it specially (i.e. we want to scan it as a normal
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
    // object with strong references).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
  1008
  // We only discover references whose referents are not (yet)
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
  1009
  // known to be strongly reachable.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  if (is_alive_non_header() != NULL) {
7420
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
  1011
    verify_referent(obj);
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
  1012
    if (is_alive_non_header()->do_object_b(java_lang_ref_Reference::referent(obj))) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
      return false;  // referent is reachable
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  }
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1016
  if (rt == REF_SOFT) {
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1017
    // For soft refs we can decide now if these are not
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1018
    // current candidates for clearing, in which case we
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1019
    // can mark through them now, rather than delaying that
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1020
    // to the reference-processing phase. Since all current
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1021
    // time-stamp policies advance the soft-ref clock only
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 32607
diff changeset
  1022
    // at a full collection cycle, this is always currently
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1023
    // accurate.
10683
4b5a5a507864 7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
johnc
parents: 10670
diff changeset
  1024
    if (!_current_soft_ref_policy->should_clear_reference(obj, _soft_ref_timestamp_clock)) {
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1025
      return false;
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1026
    }
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1605
diff changeset
  1027
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
  1029
  ResourceMark rm;      // Needed for tracing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
  1030
49041
44122f767467 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents: 47998
diff changeset
  1031
  HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr_raw(obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  1032
  const oop  discovered = java_lang_ref_Reference::discovered(obj);
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
  1033
  assert(oopDesc::is_oop_or_null(discovered), "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1034
  if (discovered != NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
    // The reference has already been discovered...
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1036
    log_develop_trace(gc, ref)("Already discovered reference (" INTPTR_FORMAT ": %s)",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1037
                               p2i(obj), obj->klass()->internal_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
    if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
      // assumes that an object is not processed twice;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
      // if it's been already discovered it must be on another
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
      // generation's discovered list; so we won't discover it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
      assert(RefDiscoveryPolicy == ReferenceBasedDiscovery,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
             "Unrecognized policy");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
      // Check assumption that an object is not potentially
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
      // discovered twice except by concurrent collectors that potentially
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
      // trace the same Reference object twice.
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7397
diff changeset
  1049
      assert(UseConcMarkSweepGC || UseG1GC,
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7397
diff changeset
  1050
             "Only possible with a concurrent marking collector");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
7420
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
  1056
    verify_referent(obj);
10526
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
  1057
    // Discover if and only if EITHER:
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
  1058
    // .. reference is in our span, OR
3e92f211533f 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 10524
diff changeset
  1059
    // .. we are an atomic collector and referent is in our span
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
  1060
    if (is_subject_to_discovery(obj) ||
7420
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
  1061
        (discovery_is_atomic() &&
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
  1062
         is_subject_to_discovery(java_lang_ref_Reference::referent(obj)))) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
    assert(RefDiscoveryPolicy == ReferenceBasedDiscovery &&
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49808
diff changeset
  1068
           is_subject_to_discovery(obj), "code inconsistency");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  // Get the right type of discovered queue head.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  DiscoveredList* list = get_discovered_list(rt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  if (list == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
    return false;   // nothing special needs to be done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  if (_discovery_is_mt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
    add_to_discovered_list_mt(*list, obj, discovered_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  } else {
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
  1080
    // We do a raw store here: the field will be visited later when processing
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
  1081
    // the discovered references.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  1082
    oop current_head = list->head();
10524
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
  1083
    // The last ref must have its discovered field pointing to itself.
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
  1084
    oop next_discovered = (current_head != NULL) ? current_head : obj;
6594ca81279a 7085906: Replace the permgen allocated sentinelRef with a self-looped end
stefank
parents: 8688
diff changeset
  1085
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  1086
    assert(discovered == NULL, "control point invariant");
47998
fb0275c320a0 8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents: 47648
diff changeset
  1087
    RawAccess<>::oop_store(discovered_addr, next_discovered);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
    list->set_head(obj);
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1089
    list->inc_length(1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1091
    log_develop_trace(gc, ref)("Discovered reference (" INTPTR_FORMAT ": %s)", p2i(obj), obj->klass()->internal_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  }
46968
9119841280f4 8160399: is_oop_or_null involves undefined behavior
coleenp
parents: 46795
diff changeset
  1093
  assert(oopDesc::is_oop(obj), "Discovered a bad reference");
7420
24071b15dde6 7005259: CMS: BubbleUpRef asserts referent(obj)->is_oop() failed: Enqueued a bad referent
ysr
parents: 7399
diff changeset
  1094
  verify_referent(obj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
37494
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1098
bool ReferenceProcessor::has_discovered_references() {
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1099
  for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1100
    if (!_discovered_refs[i].is_empty()) {
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1101
      return true;
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1102
    }
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1103
  }
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1104
  return false;
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1105
}
bf6caf8e99cb 8153745: Avoid spawning G1ParPreserveCMReferentsTask when there is no work to be done
sjohanss
parents: 37248
diff changeset
  1106
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
// Preclean the discovered references by removing those
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
// whose referents are alive, and by marking from those that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
// are not active. These lists can be handled here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
// in any order and, indeed, concurrently.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
void ReferenceProcessor::preclean_discovered_references(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  BoolObjectClosure* is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  OopClosure* keep_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  VoidClosure* complete_gc,
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
  1115
  YieldClosure* yield,
33107
77bf0d2069a3 8134953: Make the GC ID available in a central place
brutisso
parents: 33105
diff changeset
  1116
  GCTimer* gc_timer) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  // Soft references
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1120
    GCTraceTime(Debug, gc, ref) tm("Preclean SoftReferences", gc_timer);
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
  1121
    for (uint i = 0; i < _max_num_q; i++) {
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1122
      if (yield->should_return()) {
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1123
        return;
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1124
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
      preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
                                  keep_alive, complete_gc, yield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  // Weak references
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1132
    GCTraceTime(Debug, gc, ref) tm("Preclean WeakReferences", gc_timer);
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
  1133
    for (uint i = 0; i < _max_num_q; i++) {
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1134
      if (yield->should_return()) {
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1135
        return;
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1136
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
      preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
                                  keep_alive, complete_gc, yield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  // Final references
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1144
    GCTraceTime(Debug, gc, ref) tm("Preclean FinalReferences", gc_timer);
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
  1145
    for (uint i = 0; i < _max_num_q; i++) {
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1146
      if (yield->should_return()) {
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1147
        return;
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1148
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
      preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
                                  keep_alive, complete_gc, yield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  // Phantom references
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1156
    GCTraceTime(Debug, gc, ref) tm("Preclean PhantomReferences", gc_timer);
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
  1157
    for (uint i = 0; i < _max_num_q; i++) {
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1158
      if (yield->should_return()) {
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1159
        return;
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1160
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
      preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
                                  keep_alive, complete_gc, yield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
// Walk the given discovered ref list, and remove all reference objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
// whose referents are still alive, whose referents are NULL or which
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1169
// are not active (have a non-NULL next field). NOTE: When we are
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1170
// thus precleaning the ref lists (which happens single-threaded today),
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22496
diff changeset
  1171
// we do not disable refs discovery to honor the correct semantics of
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1172
// java.lang.Reference. As a result, we need to be careful below
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1173
// that ref removal steps interleave safely with ref discovery steps
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1174
// (in this thread).
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1175
void
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1176
ReferenceProcessor::preclean_discovered_reflist(DiscoveredList&    refs_list,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1177
                                                BoolObjectClosure* is_alive,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1178
                                                OopClosure*        keep_alive,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1179
                                                VoidClosure*       complete_gc,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1180
                                                YieldClosure*      yield) {
24845
e8b8894a77df 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 24424
diff changeset
  1181
  DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  while (iter.has_next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
    iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */));
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1184
    oop obj = iter.obj();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1185
    oop next = java_lang_ref_Reference::next(obj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
    if (iter.referent() == NULL || iter.is_referent_alive() ||
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1187
        next != NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
      // The referent has been cleared, or is alive, or the Reference is not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
      // active; we need to trace and mark its cohort.
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1190
      log_develop_trace(gc, ref)("Precleaning Reference (" INTPTR_FORMAT ": %s)",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1191
                                 p2i(iter.obj()), iter.obj()->klass()->internal_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
      // Remove Reference object from list
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
      iter.remove();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
      // Keep alive its cohort.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
      iter.make_referent_alive();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1196
      if (UseCompressedOops) {
49041
44122f767467 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents: 47998
diff changeset
  1197
        narrowOop* next_addr = (narrowOop*)java_lang_ref_Reference::next_addr_raw(obj);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1198
        keep_alive->do_oop(next_addr);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1199
      } else {
49041
44122f767467 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents: 47998
diff changeset
  1200
        oop* next_addr = (oop*)java_lang_ref_Reference::next_addr_raw(obj);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1201
        keep_alive->do_oop(next_addr);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 178
diff changeset
  1202
      }
1605
6b43d186eb8d 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 1388
diff changeset
  1203
      iter.move_to_next();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
      iter.next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  // Close the reachable set
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  complete_gc->do_void();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
  NOT_PRODUCT(
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1212
    if (iter.processed() > 0) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33611
diff changeset
  1213
      log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " Refs out of " SIZE_FORMAT " Refs in discovered list " INTPTR_FORMAT,
36198
658f3871f6a2 8150302: Reference processing logging prints the "from list" incorrectly
jmasa
parents: 35862
diff changeset
  1214
        iter.removed(), iter.processed(), p2i(&refs_list));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
  1219
const char* ReferenceProcessor::list_name(uint i) {
29580
a67a581cfe11 8073315: Enable gcc -Wtype-limits and fix upcoming issues.
goetz
parents: 28510
diff changeset
  1220
   assert(i <= _max_num_q * number_of_subclasses_of_ref(),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
  1221
          "Out of bounds index");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10526
diff changeset
  1222
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
  1223
   int j = i / _max_num_q;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
   switch (j) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
     case 0: return "SoftRef";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
     case 1: return "WeakRef";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
     case 2: return "FinalRef";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
     case 3: return "PhantomRef";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
   ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
   return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
}