src/hotspot/share/gc/shared/generation.hpp
author tschatzl
Thu, 03 May 2018 14:09:00 +0200
changeset 49964 99e698e94cc7
parent 48168 cb5d2d4453d0
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: 4574
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4574
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: 4574
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30291
diff changeset
    25
#ifndef SHARE_VM_GC_SHARED_GENERATION_HPP
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30291
diff changeset
    26
#define SHARE_VM_GC_SHARED_GENERATION_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    27
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30291
diff changeset
    28
#include "gc/shared/collectorCounters.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30291
diff changeset
    29
#include "gc/shared/referenceProcessor.hpp"
37073
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 35930
diff changeset
    30
#include "logging/log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    31
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    32
#include "memory/memRegion.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    33
#include "memory/universe.hpp"
30291
54cdc5c1a9cb 8068352: Move virtualspace.* out of src/share/vm/runtime to memory directory
coleenp
parents: 29800
diff changeset
    34
#include "memory/virtualspace.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    35
#include "runtime/mutex.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    36
#include "runtime/perfData.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    37
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// A Generation models a heap area for similarly-aged objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// It will contain one ore more spaces holding the actual objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// The Generation class hierarchy:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// Generation                      - abstract base class
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// - DefNewGeneration              - allocation area (copy collected)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
//   - ParNewGeneration            - a DefNewGeneration that is collected by
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
//                                   several threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// - CardGeneration                 - abstract class adding offset array behavior
27904
d606512952cc 8065993: Merge OneContigSpaceCardGeneration with TenuredGeneration
brutisso
parents: 27903
diff changeset
    48
//   - TenuredGeneration             - tenured (old object) space (markSweepCompact)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
//   - ConcurrentMarkSweepGeneration - Mostly Concurrent Mark Sweep Generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
//                                       (Detlefs-Printezis refinement of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
//                                       Boehm-Demers-Schenker)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// The system configurations currently allowed are:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    55
//   DefNewGeneration + TenuredGeneration
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    57
//   ParNewGeneration + ConcurrentMarkSweepGeneration
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
class DefNewGeneration;
48168
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
    61
class GCMemoryManager;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
class GenerationSpec;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
class CompactibleSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
class ContiguousSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
class CompactPoint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
class OopsInGenClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
class OopClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
class ScanClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
class FastScanClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
class GenCollectedHeap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
class GCStats;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
// A "ScratchBlock" represents a block of memory in one generation usable by
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
// another.  It represents "num_words" free words, starting at and including
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
// the address of "this".
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
struct ScratchBlock {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  ScratchBlock* next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  size_t num_words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  HeapWord scratch_space[1];  // Actually, of size "num_words-2" (assuming
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
                              // first two fields are word-sized.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12379
diff changeset
    83
class Generation: public CHeapObj<mtGC> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  jlong _time_of_last_gc; // time when last gc on this generation happened (ms)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  MemRegion _prev_used_region; // for collectors that want to "remember" a value for
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
                               // used region at some specific point during collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
48168
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
    90
  GCMemoryManager* _gc_manager;
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
    91
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // Minimum and maximum addresses for memory reserved (not necessarily
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // committed) for generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // Used by card marking code. Must not overlap with address ranges of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // other generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  MemRegion _reserved;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // Memory area reserved for generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  VirtualSpace _virtual_space;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // ("Weak") Reference processing support
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 48168
diff changeset
   103
  SpanSubjectToDiscoveryClosure _span_based_discoverer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  ReferenceProcessor* _ref_processor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // Performance Counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  CollectorCounters* _gc_counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Statistics for garbage collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  GCStats* _gc_stats;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // Initialize the generation.
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   113
  Generation(ReservedSpace rs, size_t initial_byte_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // Apply "cl->do_oop" to (the address of) (exactly) all the ref fields in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // "sp" that point into younger generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // The iteration is only over objects allocated at the start of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // iterations; objects allocated as a result of applying the closure are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  // not included.
30870
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   120
  void younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl, uint n_threads);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // The set of possible generation kinds.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  enum Name {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    DefNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    ParNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    MarkSweepCompact,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    ConcurrentMarkSweep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    Other
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  enum SomePublicConstants {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    // Generations are GenGrain-aligned and have size that are multiples of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    // GenGrain.
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   135
    // Note: on ARM we add 1 bit for card_table_base to be properly aligned
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   136
    // (we expect its low byte to be zero - see implementation of post_barrier)
29474
81a5c5330d08 8072383: resolve conflicts between open and closed ports
dlong
parents: 28031
diff changeset
   137
    LogOfGenGrain = 16 ARM32_ONLY(+1),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    GenGrain = 1 << LogOfGenGrain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // allocate and initialize ("weak") refs processing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  virtual void ref_processor_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  void set_ref_processor(ReferenceProcessor* rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    assert(_ref_processor == NULL, "clobbering existing _ref_processor");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    _ref_processor = rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  virtual Generation::Name kind() { return Generation::Other; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // This properly belongs in the collector, but for now this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  // will do.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  virtual bool refs_discovery_is_atomic() const { return true;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  virtual bool refs_discovery_is_mt()     const { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
33580
c2d95df2c54e 8139772: Cleanups in Generation related code
jwilhelm
parents: 33212
diff changeset
   155
  // Space inquiries (results in bytes)
c2d95df2c54e 8139772: Cleanups in Generation related code
jwilhelm
parents: 33212
diff changeset
   156
  size_t initial_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  virtual size_t capacity() const = 0;  // The maximum number of object bytes the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
                                        // generation can currently hold.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  virtual size_t used() const = 0;      // The number of used bytes in the gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  virtual size_t free() const = 0;      // The number of free bytes in the gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // Support for java.lang.Runtime.maxMemory(); see CollectedHeap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // Returns the total number of bytes  available in a generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // for the allocation of objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  virtual size_t max_capacity() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // If this is a young generation, the maximum number of bytes that can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // allocated in this generation before a GC is triggered.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  virtual size_t capacity_before_gc() const { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // The largest number of contiguous free bytes in the generation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  // including expansion  (Assumes called at a safepoint.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  virtual size_t contiguous_available() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // The largest number of contiguous free bytes in this or any higher generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  virtual size_t max_contiguous_available() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   177
  // Returns true if promotions of the specified amount are
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   178
  // likely to succeed without a promotion failure.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  // Promotion of the full amount is not guaranteed but
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   180
  // might be attempted in the worst case.
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   181
  virtual bool promotion_attempt_is_safe(size_t max_promotion_in_bytes) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   183
  // For a non-young generation, this interface can be used to inform a
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   184
  // generation that a promotion attempt into that generation failed.
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   185
  // Typically used to enable diagnostic output for post-mortem analysis,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   186
  // but other uses of the interface are not ruled out.
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   187
  virtual void promotion_failure_occurred() { /* does nothing */ }
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   188
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // Return an estimate of the maximum allocation that could be performed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // in the generation without triggering any collection or expansion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // activity.  It is "unsafe" because no locks are taken; the result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // should be treated as an approximation, not a guarantee, for use in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // heuristic resizing decisions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  virtual size_t unsafe_max_alloc_nogc() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Returns true if this generation cannot be expanded further
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // without a GC. Override as appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  virtual bool is_maximal_no_gc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    return _virtual_space.uncommitted_size() == 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  MemRegion reserved() const { return _reserved; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // Returns a region guaranteed to contain all the objects in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  virtual MemRegion used_region() const { return _reserved; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  MemRegion prev_used_region() const { return _prev_used_region; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  virtual void  save_used_region()   { _prev_used_region = used_region(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 7397
diff changeset
   211
  // Returns "TRUE" iff "p" points into the committed areas in the generation.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // For some kinds of generations, this may be an expensive operation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // To avoid performance problems stemming from its inadvertent use in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // product jvm's, we restrict its use to assertion checking or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // verification only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  virtual bool is_in(const void* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  /* Returns "TRUE" iff "p" points into the reserved area of the generation. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  bool is_in_reserved(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    return _reserved.contains(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  // If some space in the generation contains the given "addr", return a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  // pointer to that space, else return "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  virtual Space* space_containing(const void* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  // Iteration - do not use for time critical operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  virtual void space_iterate(SpaceClosure* blk, bool usedOnly = false) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // Returns the first space, if any, in the generation that can participate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // in compaction, or else "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  virtual CompactibleSpace* first_compaction_space() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // Returns "true" iff this generation should be used to allocate an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // object of the given size.  Young generations might
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // wish to exclude very large objects, for example, since, if allocated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  // often, they would greatly increase the frequency of young-gen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  virtual bool should_allocate(size_t word_size, bool is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    bool result = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    size_t overflow_limit = (size_t)1 << (BitsPerSize_t - LogHeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    if (!is_tlab || supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
      result = (word_size > 0) && (word_size < overflow_limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  // Allocate and returns a block of the requested size, or returns "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  // Assumes the caller has done any necessary locking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  virtual HeapWord* allocate(size_t word_size, bool is_tlab) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // Like "allocate", but performs any necessary locking internally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  virtual HeapWord* par_allocate(size_t word_size, bool is_tlab) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  // Some generation may offer a region for shared, contiguous allocation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // via inlined code (by exporting the address of the top and end fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // defining the extent of the contiguous allocation region.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  // This function returns "true" iff the heap supports this kind of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // allocation.  (More precisely, this means the style of allocation that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // increments *top_addr()" with a CAS.) (Default is "no".)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // A generation that supports this allocation style must use lock-free
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // allocation for *all* allocation, since there are times when lock free
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  // allocation will be concurrent with plain "allocate" calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  virtual bool supports_inline_contig_alloc() const { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  // These functions return the addresses of the fields that define the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // boundaries of the contiguous allocation area.  (These fields should be
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   269
  // physically near to one another.)
41283
2615c024f3eb 8033552: Fix missing missing volatile specifiers in CAS operations in GC code
eosterlund
parents: 37073
diff changeset
   270
  virtual HeapWord* volatile* top_addr() const { return NULL; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  virtual HeapWord** end_addr() const { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  // Thread-local allocation buffers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  virtual bool supports_tlab_allocation() const { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  virtual size_t tlab_capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    guarantee(false, "Generation doesn't support thread local allocation buffers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  }
22552
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   279
  virtual size_t tlab_used() const {
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   280
    guarantee(false, "Generation doesn't support thread local allocation buffers");
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   281
    return 0;
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   282
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  virtual size_t unsafe_max_tlab_alloc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    guarantee(false, "Generation doesn't support thread local allocation buffers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  // "obj" is the address of an object in a younger generation.  Allocate space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  // for "obj" in the current (or some higher) generation, and copy "obj" into
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // the newly allocated space, if possible, returning the result (or NULL if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // the allocation failed).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // The "obj_size" argument is just obj->size(), passed along so the caller can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  // avoid repeating the virtual call to retrieve it.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   295
  virtual oop promote(oop obj, size_t obj_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // Thread "thread_num" (0 <= i < ParalleGCThreads) wants to promote
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  // object "obj", whose original mark word was "m", and whose size is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // "word_sz".  If possible, allocate space for "obj", copy obj into it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // (taking care to copy "m" into the mark word when done, since the mark
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  // word of "obj" may have been overwritten with a forwarding pointer, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // also taking care to copy the klass pointer *last*.  Returns the new
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  // object if successful, or else NULL.
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   304
  virtual oop par_promote(int thread_num, oop obj, markOop m, size_t word_sz);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // Informs the current generation that all par_promote_alloc's in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // collection have been completed; any supporting data structures can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // reset.  Default is to do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  virtual void par_promote_alloc_done(int thread_num) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  // Informs the current generation that all oop_since_save_marks_iterates
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // performed by "thread_num" in the current collection, if any, have been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  // completed; any supporting data structures can be reset.  Default is to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  // do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  virtual void par_oop_since_save_marks_iterate_done(int thread_num) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // Returns "true" iff collect() should subsequently be called on this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  // this generation. See comment below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // This is a generic implementation which can be overridden.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // Note: in the current (1.4) implementation, when genCollectedHeap's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // incremental_collection_will_fail flag is set, all allocations are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // slow path (the only fast-path place to allocate is DefNew, which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // will be full if the flag is set).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  // Thus, older generations which collect younger generations should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // test this flag and collect if it is set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  virtual bool should_collect(bool   full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
                              size_t word_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
                              bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    return (full || should_allocate(word_size, is_tlab));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   333
  // Returns true if the collection is likely to be safely
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   334
  // completed. Even if this method returns true, a collection
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   335
  // may not be guaranteed to succeed, and the system should be
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   336
  // able to safely unwind and recover from that failure, albeit
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   337
  // at some additional cost.
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   338
  virtual bool collection_attempt_is_safe() {
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   339
    guarantee(false, "Are you sure you want to call this method?");
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   340
    return true;
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   341
  }
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6176
diff changeset
   342
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  // Perform a garbage collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // If full is true attempt a full garbage collection of this generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // Otherwise, attempting to (at least) free enough space to support an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // allocation of the given "word_size".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  virtual void collect(bool   full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
                       bool   clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
                       size_t word_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
                       bool   is_tlab) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  // Perform a heap collection, attempting to create (at least) enough
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // space to support an allocation of the given "word_size".  If
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  // successful, perform the allocation and return the resulting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  // "oop" (initializing the allocated block). If the allocation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  // still unsuccessful, return "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  virtual HeapWord* expand_and_allocate(size_t word_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
                                        bool is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
                                        bool parallel = false) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  // Some generations may require some cleanup or preparation actions before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  // allowing a collection.  The default is to do nothing.
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   363
  virtual void gc_prologue(bool full) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  // Some generations may require some cleanup actions after a collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  // The default is to do nothing.
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   367
  virtual void gc_epilogue(bool full) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   369
  // Save the high water marks for the used space in a generation.
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   370
  virtual void record_spaces_top() {}
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   371
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  // Some generations may need to be "fixed-up" after some allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  // activity to make them parsable again. The default is to do nothing.
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   374
  virtual void ensure_parsability() {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  // Time (in ms) when we were last collected or now if a collection is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  virtual jlong time_of_last_gc(jlong now) {
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
   379
    // Both _time_of_last_gc and now are set using a time source
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
   380
    // that guarantees monotonically non-decreasing values provided
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
   381
    // the underlying platform provides such a source. So we still
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
   382
    // have to guard against non-monotonicity.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
    NOT_PRODUCT(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
      if (now < _time_of_last_gc) {
37073
c39d0903390b 8151605: Change warning() to log_warning(gc) in the GC code
brutisso
parents: 35930
diff changeset
   385
        log_warning(gc)("time warp: " JLONG_FORMAT " to " JLONG_FORMAT, _time_of_last_gc, now);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
    )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
    return _time_of_last_gc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  virtual void update_time_of_last_gc(jlong now)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
    _time_of_last_gc = now;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   395
  // Generations may keep statistics about collection. This method
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   396
  // updates those statistics. current_generation is the generation
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   397
  // that was most recently collected. This allows the generation to
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   398
  // decide what statistics are valid to collect. For example, the
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   399
  // generation can decide to gather the amount of promoted data if
33580
c2d95df2c54e 8139772: Cleanups in Generation related code
jwilhelm
parents: 33212
diff changeset
   400
  // the collection of the young generation has completed.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  GCStats* gc_stats() const { return _gc_stats; }
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 30870
diff changeset
   402
  virtual void update_gc_stats(Generation* current_generation, bool full) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  // Mark sweep support phase2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  virtual void prepare_for_compaction(CompactPoint* cp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  // Mark sweep support phase3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  virtual void adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // Mark sweep support phase4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  virtual void compact();
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   410
  virtual void post_compact() { ShouldNotReachHere(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // Support for CMS's rescan. In this general form we return a pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  // to an abstract object that can be used, based on specific previously
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  // decided protocols, to exchange information between generations,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  // information that may be useful for speeding up certain types of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // garbage collectors. A NULL value indicates to the client that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // no data recording is expected by the provider. The data-recorder is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  // expected to be GC worker thread-local, with the worker index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  // indicated by "thr_num".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  virtual void* get_data_recorder(int thr_num) { return NULL; }
18994
d32a17b7502c 6990419: CMS Remaining work for 6572569: consistently skewed work distribution in (long) re-mark pauses
jmasa
parents: 18687
diff changeset
   421
  virtual void sample_eden_chunk() {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  // Some generations may require some cleanup actions before allowing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  // a verification.
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   425
  virtual void prepare_for_verify() {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  // Accessing "marks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // This function gives a generation a chance to note a point between
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  // collections.  For example, a contiguous generation might note the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  // beginning allocation point post-collection, which might allow some later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  // operations to be optimized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  virtual void save_marks() {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // This function allows generations to initialize any "saved marks".  That
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  // is, should only be called when the generation is empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  virtual void reset_saved_marks() {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  // This function is "true" iff any no allocations have occurred in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  // generation since the last call to "save_marks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  virtual bool no_allocs_since_save_marks() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  // Apply "cl->apply" to (the addresses of) all reference fields in objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // allocated in the current generation since the last call to "save_marks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  // If more objects are allocated in this generation as a result of applying
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  // the closure, iterates over reference fields in those objects as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // Calls "save_marks" at the end of the iteration.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // General signature...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  virtual void oop_since_save_marks_iterate_v(OopsInGenClosure* cl) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // ...and specializations for de-virtualization.  (The general
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   451
  // implementation of the _nv versions call the virtual version.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  // Note that the _nv suffix is not really semantically necessary,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  // but it avoids some not-so-useful warnings on Solaris.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
#define Generation_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix)             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  virtual void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) {    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
    oop_since_save_marks_iterate_v((OopsInGenClosure*)cl);                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(Generation_SINCE_SAVE_MARKS_DECL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
#undef Generation_SINCE_SAVE_MARKS_DECL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  // The "requestor" generation is performing some garbage collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  // action for which it would be useful to have scratch space.  If
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  // the target is not the requestor, no gc actions will be required
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  // of the target.  The requestor promises to allocate no more than
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  // "max_alloc_words" in the target generation (via promotion say,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  // if the requestor is a young generation and the target is older).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  // If the target generation can provide any scratch space, it adds
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  // it to "list", leaving "list" pointing to the head of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  // augmented list.  The default is to offer no space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  virtual void contribute_scratch(ScratchBlock*& list, Generation* requestor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
                                  size_t max_alloc_words) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   474
  // Give each generation an opportunity to do clean up for any
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   475
  // contributed scratch.
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31358
diff changeset
   476
  virtual void reset_scratch() {}
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   477
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  // When an older generation has been collected, and perhaps resized,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  // this method will be invoked on all younger generations (from older to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  // younger), allowing them to resize themselves as appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  virtual void compute_new_size() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  // Printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  virtual const char* name() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  virtual const char* short_name() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  // Reference Processing accessor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  ReferenceProcessor* const ref_processor() { return _ref_processor; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  // Iteration.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  // Iterate over all the ref-containing fields of all objects in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  // generation, calling "cl.do_oop" on each.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   494
  virtual void oop_iterate(ExtendedOopClosure* cl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  // Iterate over all objects in the generation, calling "cl.do_object" on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  // each.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  virtual void object_iterate(ObjectClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   500
  // Iterate over all safe objects in the generation, calling "cl.do_object" on
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   501
  // each.  An object is safe if its references point to other objects in
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   502
  // the heap.  This defaults to object_iterate() unless overridden.
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   503
  virtual void safe_object_iterate(ObjectClosure* cl);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   504
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // Apply "cl->do_oop" to (the address of) all and only all the ref fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  // in the current generation that contain pointers to objects in younger
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  // generations. Objects allocated since the last "save_marks" call are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  // excluded.
30870
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   509
  virtual void younger_refs_iterate(OopsInGenClosure* cl, uint n_threads) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  // Inform a generation that it longer contains references to objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  // in any younger generation.    [e.g. Because younger gens are empty,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  // clear the card table.]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  virtual void clear_remembered_set() { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  // Inform a generation that some of its objects have moved.  [e.g. The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // generation's spaces were compacted, invalidating the card table.]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  virtual void invalidate_remembered_set() { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // Block abstraction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  // Returns the address of the start of the "block" that contains the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  // address "addr".  We say "blocks" instead of "object" since some heaps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  // may not pack objects densely; a chunk may either be an object or a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  // non-object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  virtual HeapWord* block_start(const void* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  // Requires "addr" to be the start of a chunk, and returns its size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  // "addr + size" is required to be the start of a new chunk, or the end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  // of the active area of the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  virtual size_t block_size(const HeapWord* addr) const ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  // Requires "addr" to be the start of a block, and returns "TRUE" iff
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  // the block is an object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  virtual bool block_is_obj(const HeapWord* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  void print_heap_change(size_t prev_used) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  virtual void print() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  virtual void print_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11251
diff changeset
   542
  virtual void verify() = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  struct StatRecord {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
    int invocations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
    elapsedTimer accumulated_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
    StatRecord() :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
      invocations(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
      accumulated_time(elapsedTimer()) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  StatRecord _stat_record;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  StatRecord* stat_record() { return &_stat_record; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  virtual void print_summary_info_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  // Performance Counter support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  virtual void update_counters() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  virtual CollectorCounters* counters() { return _gc_counters; }
48168
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   561
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   562
  GCMemoryManager* gc_manager() const {
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   563
    assert(_gc_manager != NULL, "not initialized yet");
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   564
    return _gc_manager;
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   565
  }
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   566
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   567
  void set_gc_manager(GCMemoryManager* gc_manager) {
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   568
    _gc_manager = gc_manager;
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   569
  }
cb5d2d4453d0 8191564: Refactor GC related servicability code into GC specific subclasses
rkennke
parents: 47546
diff changeset
   570
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30291
diff changeset
   573
#endif // SHARE_VM_GC_SHARED_GENERATION_HPP