src/hotspot/share/gc/shared/generation.cpp
author tschatzl
Thu, 03 May 2018 14:09:00 +0200
changeset 49964 99e698e94cc7
parent 49594 898ef81cbc0e
child 49982 9042ffe5b7fe
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
/*
47546
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
     2
 * Copyright (c) 1997, 2017, 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: 4106
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4106
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: 4106
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: 6985
diff changeset
    25
#include "precompiled.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    26
#include "gc/serial/genMarkSweep.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    27
#include "gc/shared/blockOffsetTable.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    28
#include "gc/shared/cardTableRS.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    29
#include "gc/shared/collectedHeap.inline.hpp"
49594
898ef81cbc0e 8200106: Move NoSafepointVerifier out from gcLocker.hpp
stefank
parents: 49049
diff changeset
    30
#include "gc/shared/gcLocker.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    31
#include "gc/shared/gcTimer.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    32
#include "gc/shared/gcTrace.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    33
#include "gc/shared/genCollectedHeap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    34
#include "gc/shared/genOopClosures.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    35
#include "gc/shared/genOopClosures.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    36
#include "gc/shared/generation.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    37
#include "gc/shared/space.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    38
#include "gc/shared/spaceDecorator.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33580
diff changeset
    39
#include "logging/log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    40
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    41
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    42
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    43
#include "utilities/copy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    44
#include "utilities/events.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
    46
Generation::Generation(ReservedSpace rs, size_t initial_size) :
48168
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
    47
  _ref_processor(NULL),
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
    48
  _gc_manager(NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  if (!_virtual_space.initialize(rs, initial_size)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
    vm_exit_during_initialization("Could not reserve enough space for "
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
                    "object heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  }
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
    53
  // Mangle all of the the initial generation.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
    54
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
    55
    MemRegion mangle_region((HeapWord*)_virtual_space.low(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
    56
      (HeapWord*)_virtual_space.high());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
    57
    SpaceMangler::mangle_region(mangle_region);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
    58
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  _reserved = MemRegion((HeapWord*)_virtual_space.low_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
          (HeapWord*)_virtual_space.high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
33580
c2d95df2c54e 8139772: Cleanups in Generation related code
jwilhelm
parents: 33212
diff changeset
    63
size_t Generation::initial_size() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  GenCollectedHeap* gch = GenCollectedHeap::heap();
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
    65
  if (gch->is_young_gen(this)) {
49049
effb50eeea4e 8198528: Move GenerationSpecs from GenCollectorPolicy to GenCollectedHeap
stefank
parents: 48168
diff changeset
    66
    return gch->young_gen_spec()->init_size();
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
    67
  }
49049
effb50eeea4e 8198528: Move GenerationSpecs from GenCollectorPolicy to GenCollectedHeap
stefank
parents: 48168
diff changeset
    68
  return gch->old_gen_spec()->init_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
size_t Generation::max_capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  return reserved().byte_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
// By default we get a single threaded default reference processor;
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 7397
diff changeset
    76
// generations needing multi-threaded refs processing or discovery override this method.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
void Generation::ref_processor_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  assert(_ref_processor == NULL, "a reference processor already exists");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  assert(!_reserved.is_empty(), "empty generation?");
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49594
diff changeset
    80
  _span_based_discoverer.set_span(_reserved);
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49594
diff changeset
    81
  _ref_processor = new ReferenceProcessor(&_span_based_discoverer);    // a vanilla reference processor
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  if (_ref_processor == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    vm_exit_during_initialization("Could not allocate ReferenceProcessor object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
void Generation::print() const { print_on(tty); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
void Generation::print_on(outputStream* st)  const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  st->print(" %-20s", name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
             capacity()/K, used()/K);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
29800
fa5f7a2bf717 8076073: shared: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29794
diff changeset
    94
              p2i(_virtual_space.low_boundary()),
fa5f7a2bf717 8076073: shared: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29794
diff changeset
    95
              p2i(_virtual_space.high()),
fa5f7a2bf717 8076073: shared: PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC needs to be removed from source files
david
parents: 29794
diff changeset
    96
              p2i(_virtual_space.high_boundary()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
void Generation::print_summary_info_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  StatRecord* sr = stat_record();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  double time = sr->accumulated_time.seconds();
47546
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
   102
  st->print_cr("Accumulated %s generation GC time %3.7f secs, "
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
   103
               "%u GC's, avg GC time %3.7f",
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
   104
               GenCollectedHeap::heap()->is_young_gen(this) ? "young" : "old" ,
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
   105
               time,
64ba55ba8516 8184286: print_tracing_info() does not use Unified Logging for output
sjohanss
parents: 47216
diff changeset
   106
               sr->invocations,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
               sr->invocations > 0 ? time / sr->invocations : 0.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
// Utility iterator classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
class GenerationIsInReservedClosure : public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  const void* _p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  Space* sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  virtual void do_space(Space* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    if (sp == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
      if (s->is_in_reserved(_p)) sp = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  GenerationIsInReservedClosure(const void* p) : _p(p), sp(NULL) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
class GenerationIsInClosure : public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  const void* _p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  Space* sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  virtual void do_space(Space* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    if (sp == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
      if (s->is_in(_p)) sp = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  GenerationIsInClosure(const void* p) : _p(p), sp(NULL) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
bool Generation::is_in(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  GenerationIsInClosure blk(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  ((Generation*)this)->space_iterate(&blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  return blk.sp != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
size_t Generation::max_contiguous_available() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // The largest number of contiguous free words in this or any higher generation.
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   144
  size_t avail = contiguous_available();
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   145
  size_t old_avail = 0;
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   146
  if (GenCollectedHeap::heap()->is_young_gen(this)) {
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   147
    old_avail = GenCollectedHeap::heap()->old_gen()->contiguous_available();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  }
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   149
  return MAX2(avail, old_avail);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 5547
diff changeset
   152
bool Generation::promotion_attempt_is_safe(size_t max_promotion_in_bytes) const {
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 5547
diff changeset
   153
  size_t available = max_contiguous_available();
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 5547
diff changeset
   154
  bool   res = (available >= max_promotion_in_bytes);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33580
diff changeset
   155
  log_trace(gc)("Generation: promo attempt is%s safe: available(" SIZE_FORMAT ") %s max_promo(" SIZE_FORMAT ")",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33580
diff changeset
   156
                res? "":" not", available, res? ">=":"<", max_promotion_in_bytes);
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 5547
diff changeset
   157
  return res;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
// Ignores "ref" and calls allocate().
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   161
oop Generation::promote(oop obj, size_t obj_size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  assert(obj_size == (size_t)obj->size(), "bad obj_size passed in");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
#ifndef PRODUCT
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29800
diff changeset
   165
  if (GenCollectedHeap::heap()->promotion_should_fail()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  HeapWord* result = allocate(obj_size, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    Copy::aligned_disjoint_words((HeapWord*)obj, result, obj_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    return oop(result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    GenCollectedHeap* gch = GenCollectedHeap::heap();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   176
    return gch->handle_failed_promotion(this, obj, obj_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
oop Generation::par_promote(int thread_num,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
                            oop obj, markOop m, size_t word_sz) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // Could do a bad general impl here that gets a lock.  But no.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  ShouldNotCallThis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
Space* Generation::space_containing(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  GenerationIsInReservedClosure blk(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // Cast away const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  ((Generation*)this)->space_iterate(&blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  return blk.sp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
// Some of these are mediocre general implementations.  Should be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
// overridden to get better performance.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
class GenerationBlockStartClosure : public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  const void* _p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  HeapWord* _start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  virtual void do_space(Space* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    if (_start == NULL && s->is_in_reserved(_p)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
      _start = s->block_start(_p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  GenerationBlockStartClosure(const void* p) { _p = p; _start = NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
HeapWord* Generation::block_start(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  GenerationBlockStartClosure blk(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // Cast away const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  ((Generation*)this)->space_iterate(&blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  return blk._start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
class GenerationBlockSizeClosure : public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  const HeapWord* _p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  size_t size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  virtual void do_space(Space* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    if (size == 0 && s->is_in_reserved(_p)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
      size = s->block_size(_p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  GenerationBlockSizeClosure(const HeapWord* p) { _p = p; size = 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
size_t Generation::block_size(const HeapWord* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  GenerationBlockSizeClosure blk(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // Cast away const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  ((Generation*)this)->space_iterate(&blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  assert(blk.size > 0, "seems reasonable");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  return blk.size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
class GenerationBlockIsObjClosure : public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  const HeapWord* _p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  bool is_obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  virtual void do_space(Space* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    if (!is_obj && s->is_in_reserved(_p)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
      is_obj |= s->block_is_obj(_p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  GenerationBlockIsObjClosure(const HeapWord* p) { _p = p; is_obj = false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
bool Generation::block_is_obj(const HeapWord* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  GenerationBlockIsObjClosure blk(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  // Cast away const
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  ((Generation*)this)->space_iterate(&blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  return blk.is_obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
class GenerationOopIterateClosure : public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
 public:
23508
3b15250ea28f 8038399: Remove dead oop_iterate MemRegion variants from SharedHeap, Generation and Space classes
mgerdin
parents: 21767
diff changeset
   257
  ExtendedOopClosure* _cl;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  virtual void do_space(Space* s) {
23508
3b15250ea28f 8038399: Remove dead oop_iterate MemRegion variants from SharedHeap, Generation and Space classes
mgerdin
parents: 21767
diff changeset
   259
    s->oop_iterate(_cl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  }
23508
3b15250ea28f 8038399: Remove dead oop_iterate MemRegion variants from SharedHeap, Generation and Space classes
mgerdin
parents: 21767
diff changeset
   261
  GenerationOopIterateClosure(ExtendedOopClosure* cl) :
3b15250ea28f 8038399: Remove dead oop_iterate MemRegion variants from SharedHeap, Generation and Space classes
mgerdin
parents: 21767
diff changeset
   262
    _cl(cl) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   265
void Generation::oop_iterate(ExtendedOopClosure* cl) {
23508
3b15250ea28f 8038399: Remove dead oop_iterate MemRegion variants from SharedHeap, Generation and Space classes
mgerdin
parents: 21767
diff changeset
   266
  GenerationOopIterateClosure blk(cl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  space_iterate(&blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
void Generation::younger_refs_in_space_iterate(Space* sp,
30870
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   271
                                               OopsInGenClosure* cl,
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   272
                                               uint n_threads) {
33212
906b3d079b13 8139434: Unify GenRemSet and CardTableRS
david
parents: 31592
diff changeset
   273
  CardTableRS* rs = GenCollectedHeap::heap()->rem_set();
30870
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   274
  rs->younger_refs_in_space_iterate(sp, cl, n_threads);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
class GenerationObjIterateClosure : public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  ObjectClosure* _cl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  virtual void do_space(Space* s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    s->object_iterate(_cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  GenerationObjIterateClosure(ObjectClosure* cl) : _cl(cl) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
void Generation::object_iterate(ObjectClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  GenerationObjIterateClosure blk(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  space_iterate(&blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   292
class GenerationSafeObjIterateClosure : public SpaceClosure {
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   293
 private:
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   294
  ObjectClosure* _cl;
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   295
 public:
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   296
  virtual void do_space(Space* s) {
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   297
    s->safe_object_iterate(_cl);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   298
  }
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   299
  GenerationSafeObjIterateClosure(ObjectClosure* cl) : _cl(cl) {}
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   300
};
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   301
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   302
void Generation::safe_object_iterate(ObjectClosure* cl) {
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   303
  GenerationSafeObjIterateClosure blk(cl);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   304
  space_iterate(&blk);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   305
}
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   306
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
void Generation::prepare_for_compaction(CompactPoint* cp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // Generic implementation, can be specialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  CompactibleSpace* space = first_compaction_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  while (space != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
    space->prepare_for_compaction(cp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    space = space->next_compaction_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
class AdjustPointersClosure: public SpaceClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  void do_space(Space* sp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    sp->adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
void Generation::adjust_pointers() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // Note that this is done over all spaces, not just the compactible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  // ones.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  AdjustPointersClosure blk;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  space_iterate(&blk, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
void Generation::compact() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  CompactibleSpace* sp = first_compaction_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  while (sp != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    sp->compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    sp = sp->next_compaction_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
}