hotspot/src/share/vm/memory/generation.hpp
author ysr
Wed, 23 Dec 2009 09:23:54 -0800
changeset 4574 b2d5b0975515
parent 2105 347008ce7984
child 5547 f4b087cbb361
permissions -rw-r--r--
6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
2105
347008ce7984 6814575: Update copyright year
xdono
parents: 1893
diff changeset
     2
 * Copyright 1997-2009 Sun Microsystems, Inc.  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
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
// A Generation models a heap area for similarly-aged objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
// It will contain one ore more spaces holding the actual objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
// The Generation class hierarchy:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
// Generation                      - abstract base class
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// - DefNewGeneration              - allocation area (copy collected)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
//   - ParNewGeneration            - a DefNewGeneration that is collected by
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
//                                   several threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// - CardGeneration                 - abstract class adding offset array behavior
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
//   - OneContigSpaceCardGeneration - abstract class holding a single
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
//                                    contiguous space with card marking
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
//     - TenuredGeneration         - tenured (old object) space (markSweepCompact)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
//     - CompactingPermGenGen      - reflective object area (klasses, methods, symbols, ...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
//   - ConcurrentMarkSweepGeneration - Mostly Concurrent Mark Sweep Generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//                                       (Detlefs-Printezis refinement of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
//                                       Boehm-Demers-Schenker)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// The system configurations currently allowed are:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
//   DefNewGeneration + TenuredGeneration + PermGeneration
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
//   DefNewGeneration + ConcurrentMarkSweepGeneration + ConcurrentMarkSweepPermGen
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//   ParNewGeneration + TenuredGeneration + PermGeneration
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
//   ParNewGeneration + ConcurrentMarkSweepGeneration + ConcurrentMarkSweepPermGen
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
class DefNewGeneration;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
class GenerationSpec;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
class CompactibleSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
class ContiguousSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
class CompactPoint;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
class OopsInGenClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
class OopClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
class ScanClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
class FastScanClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
class GenCollectedHeap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
class GenRemSet;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
class GCStats;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
// A "ScratchBlock" represents a block of memory in one generation usable by
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
// another.  It represents "num_words" free words, starting at and including
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
// the address of "this".
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
struct ScratchBlock {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  ScratchBlock* next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  size_t num_words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  HeapWord scratch_space[1];  // Actually, of size "num_words-2" (assuming
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
                              // first two fields are word-sized.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
class Generation: public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  jlong _time_of_last_gc; // time when last gc on this generation happened (ms)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  MemRegion _prev_used_region; // for collectors that want to "remember" a value for
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
                               // used region at some specific point during collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  // Minimum and maximum addresses for memory reserved (not necessarily
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // committed) for generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // Used by card marking code. Must not overlap with address ranges of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // other generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  MemRegion _reserved;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // Memory area reserved for generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  VirtualSpace _virtual_space;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // Level in the generation hierarchy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  int _level;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // ("Weak") Reference processing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  ReferenceProcessor* _ref_processor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // Performance Counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  CollectorCounters* _gc_counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // Statistics for garbage collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  GCStats* _gc_stats;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // Returns the next generation in the configuration, or else NULL if this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // is the highest generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  Generation* next_gen() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Initialize the generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  Generation(ReservedSpace rs, size_t initial_byte_size, int level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // Apply "cl->do_oop" to (the address of) (exactly) all the ref fields in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  // "sp" that point into younger generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // The iteration is only over objects allocated at the start of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // iterations; objects allocated as a result of applying the closure are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // not included.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  void younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // The set of possible generation kinds.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  enum Name {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    ASParNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    ASConcurrentMarkSweep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    DefNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    ParNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    MarkSweepCompact,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    ConcurrentMarkSweep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    Other
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  enum SomePublicConstants {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    // Generations are GenGrain-aligned and have size that are multiples of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    // GenGrain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    LogOfGenGrain = 16,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    GenGrain = 1 << LogOfGenGrain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  // allocate and initialize ("weak") refs processing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  virtual void ref_processor_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  void set_ref_processor(ReferenceProcessor* rp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    assert(_ref_processor == NULL, "clobbering existing _ref_processor");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    _ref_processor = rp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  virtual Generation::Name kind() { return Generation::Other; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  GenerationSpec* spec();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // This properly belongs in the collector, but for now this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  // will do.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  virtual bool refs_discovery_is_atomic() const { return true;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  virtual bool refs_discovery_is_mt()     const { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  // Space enquiries (results in bytes)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  virtual size_t capacity() const = 0;  // The maximum number of object bytes the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
                                        // generation can currently hold.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  virtual size_t used() const = 0;      // The number of used bytes in the gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  virtual size_t free() const = 0;      // The number of free bytes in the gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // Support for java.lang.Runtime.maxMemory(); see CollectedHeap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // Returns the total number of bytes  available in a generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // for the allocation of objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  virtual size_t max_capacity() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // If this is a young generation, the maximum number of bytes that can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // allocated in this generation before a GC is triggered.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  virtual size_t capacity_before_gc() const { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // The largest number of contiguous free bytes in the generation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // including expansion  (Assumes called at a safepoint.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  virtual size_t contiguous_available() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // The largest number of contiguous free bytes in this or any higher generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  virtual size_t max_contiguous_available() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // Returns true if promotions of the specified amount can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // be attempted safely (without a vm failure).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // Promotion of the full amount is not guaranteed but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // can be attempted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  //   younger_handles_promotion_failure
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  // is true if the younger generation handles a promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  virtual bool promotion_attempt_is_safe(size_t promotion_in_bytes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    bool younger_handles_promotion_failure) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   184
  // 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
   185
  // generation that a promotion attempt into that generation failed.
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   186
  // Typically used to enable diagnostic output for post-mortem analysis,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   187
  // but other uses of the interface are not ruled out.
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   188
  virtual void promotion_failure_occurred() { /* does nothing */ }
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   189
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // Return an estimate of the maximum allocation that could be performed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // in the generation without triggering any collection or expansion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // activity.  It is "unsafe" because no locks are taken; the result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // should be treated as an approximation, not a guarantee, for use in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // heuristic resizing decisions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  virtual size_t unsafe_max_alloc_nogc() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Returns true if this generation cannot be expanded further
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // without a GC. Override as appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  virtual bool is_maximal_no_gc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    return _virtual_space.uncommitted_size() == 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  MemRegion reserved() const { return _reserved; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // Returns a region guaranteed to contain all the objects in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  virtual MemRegion used_region() const { return _reserved; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  MemRegion prev_used_region() const { return _prev_used_region; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  virtual void  save_used_region()   { _prev_used_region = used_region(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // Returns "TRUE" iff "p" points into an allocated object in the generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // For some kinds of generations, this may be an expensive operation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // To avoid performance problems stemming from its inadvertent use in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // product jvm's, we restrict its use to assertion checking or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // verification only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  virtual bool is_in(const void* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  /* Returns "TRUE" iff "p" points into the reserved area of the generation. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  bool is_in_reserved(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    return _reserved.contains(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  // Check that the generation kind is DefNewGeneration or a sub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  // class of DefNewGeneration and return a DefNewGeneration*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  DefNewGeneration*  as_DefNewGeneration();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // If some space in the generation contains the given "addr", return a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // pointer to that space, else return "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  virtual Space* space_containing(const void* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // Iteration - do not use for time critical operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  virtual void space_iterate(SpaceClosure* blk, bool usedOnly = false) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // Returns the first space, if any, in the generation that can participate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // in compaction, or else "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  virtual CompactibleSpace* first_compaction_space() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  // Returns "true" iff this generation should be used to allocate an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  // object of the given size.  Young generations might
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // wish to exclude very large objects, for example, since, if allocated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  // often, they would greatly increase the frequency of young-gen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  virtual bool should_allocate(size_t word_size, bool is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    bool result = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    size_t overflow_limit = (size_t)1 << (BitsPerSize_t - LogHeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    if (!is_tlab || supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
      result = (word_size > 0) && (word_size < overflow_limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // Allocate and returns a block of the requested size, or returns "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  // Assumes the caller has done any necessary locking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  virtual HeapWord* allocate(size_t word_size, bool is_tlab) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // Like "allocate", but performs any necessary locking internally.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  virtual HeapWord* par_allocate(size_t word_size, bool is_tlab) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // A 'younger' gen has reached an allocation limit, and uses this to notify
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // the next older gen.  The return value is a new limit, or NULL if none.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // caller must do the necessary locking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  virtual HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
                                             size_t word_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // Some generation may offer a region for shared, contiguous allocation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  // via inlined code (by exporting the address of the top and end fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  // defining the extent of the contiguous allocation region.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // This function returns "true" iff the heap supports this kind of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  // allocation.  (More precisely, this means the style of allocation that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // increments *top_addr()" with a CAS.) (Default is "no".)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // A generation that supports this allocation style must use lock-free
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // allocation for *all* allocation, since there are times when lock free
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // allocation will be concurrent with plain "allocate" calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  virtual bool supports_inline_contig_alloc() const { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // These functions return the addresses of the fields that define the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  // boundaries of the contiguous allocation area.  (These fields should be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // physicall near to one another.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  virtual HeapWord** top_addr() const { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  virtual HeapWord** end_addr() const { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  // Thread-local allocation buffers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  virtual bool supports_tlab_allocation() const { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  virtual size_t tlab_capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    guarantee(false, "Generation doesn't support thread local allocation buffers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  virtual size_t unsafe_max_tlab_alloc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    guarantee(false, "Generation doesn't support thread local allocation buffers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // "obj" is the address of an object in a younger generation.  Allocate space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  // for "obj" in the current (or some higher) generation, and copy "obj" into
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // the newly allocated space, if possible, returning the result (or NULL if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // the allocation failed).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // The "obj_size" argument is just obj->size(), passed along so the caller can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  // 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
   304
  virtual oop promote(oop obj, size_t obj_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // Thread "thread_num" (0 <= i < ParalleGCThreads) wants to promote
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // object "obj", whose original mark word was "m", and whose size is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // "word_sz".  If possible, allocate space for "obj", copy obj into it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  // (taking care to copy "m" into the mark word when done, since the mark
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  // word of "obj" may have been overwritten with a forwarding pointer, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  // also taking care to copy the klass pointer *last*.  Returns the new
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // object if successful, or else NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  virtual oop par_promote(int thread_num,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
                          oop obj, markOop m, size_t word_sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // Undo, if possible, the most recent par_promote_alloc allocation by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // "thread_num" ("obj", of "word_sz").
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  virtual void par_promote_alloc_undo(int thread_num,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
                                      HeapWord* obj, size_t word_sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // Informs the current generation that all par_promote_alloc's in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // collection have been completed; any supporting data structures can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // reset.  Default is to do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  virtual void par_promote_alloc_done(int thread_num) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // Informs the current generation that all oop_since_save_marks_iterates
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // performed by "thread_num" in the current collection, if any, have been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  // completed; any supporting data structures can be reset.  Default is to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  virtual void par_oop_since_save_marks_iterate_done(int thread_num) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  // This generation will collect all younger generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // during a full collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  virtual bool full_collects_younger_generations() const { return false; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  // This generation does in-place marking, meaning that mark words
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  // are mutated during the marking phase and presumably reinitialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  // to a canonical value after the GC. This is currently used by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  // biased locking implementation to determine whether additional
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  // work is required during the GC prologue and epilogue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  virtual bool performs_in_place_marking() const { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  // Returns "true" iff collect() should subsequently be called on this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // this generation. See comment below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // This is a generic implementation which can be overridden.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  // Note: in the current (1.4) implementation, when genCollectedHeap's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // incremental_collection_will_fail flag is set, all allocations are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // slow path (the only fast-path place to allocate is DefNew, which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // will be full if the flag is set).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  // Thus, older generations which collect younger generations should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  // test this flag and collect if it is set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  virtual bool should_collect(bool   full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
                              size_t word_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
                              bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
    return (full || should_allocate(word_size, is_tlab));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  // Perform a garbage collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  // If full is true attempt a full garbage collection of this generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  // Otherwise, attempting to (at least) free enough space to support an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  // allocation of the given "word_size".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  virtual void collect(bool   full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
                       bool   clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
                       size_t word_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
                       bool   is_tlab) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // Perform a heap collection, attempting to create (at least) enough
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  // space to support an allocation of the given "word_size".  If
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  // successful, perform the allocation and return the resulting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // "oop" (initializing the allocated block). If the allocation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  // still unsuccessful, return "NULL".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  virtual HeapWord* expand_and_allocate(size_t word_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
                                        bool is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
                                        bool parallel = false) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // Some generations may require some cleanup or preparation actions before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  // allowing a collection.  The default is to do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  virtual void gc_prologue(bool full) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  // Some generations may require some cleanup actions after a collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  // The default is to do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  virtual void gc_epilogue(bool full) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   385
  // Save the high water marks for the used space in a generation.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   386
  virtual void record_spaces_top() {};
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   387
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  // Some generations may need to be "fixed-up" after some allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  // activity to make them parsable again. The default is to do nothing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  virtual void ensure_parsability() {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  // Time (in ms) when we were last collected or now if a collection is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  // in progress.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  virtual jlong time_of_last_gc(jlong now) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
    // XXX See note in genCollectedHeap::millis_since_last_gc()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    NOT_PRODUCT(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
      if (now < _time_of_last_gc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
        warning("time warp: %d to %d", _time_of_last_gc, now);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    return _time_of_last_gc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  virtual void update_time_of_last_gc(jlong now)  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    _time_of_last_gc = now;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // Generations may keep statistics about collection.  This
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  // method updates those statistics.  current_level is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  // the level of the collection that has most recently
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // occurred.  This allows the generation to decide what
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // statistics are valid to collect.  For example, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  // generation can decide to gather the amount of promoted data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  // if the collection of the younger generations has completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  GCStats* gc_stats() const { return _gc_stats; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  virtual void update_gc_stats(int current_level, bool full) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  // Mark sweep support phase2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  virtual void prepare_for_compaction(CompactPoint* cp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  // Mark sweep support phase3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  virtual void pre_adjust_pointers() {ShouldNotReachHere();}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  virtual void adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  // Mark sweep support phase4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  virtual void compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  virtual void post_compact() {ShouldNotReachHere();}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  // Support for CMS's rescan. In this general form we return a pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  // to an abstract object that can be used, based on specific previously
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // decided protocols, to exchange information between generations,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  // information that may be useful for speeding up certain types of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  // garbage collectors. A NULL value indicates to the client that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  // no data recording is expected by the provider. The data-recorder is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // expected to be GC worker thread-local, with the worker index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  // indicated by "thr_num".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  virtual void* get_data_recorder(int thr_num) { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  // Some generations may require some cleanup actions before allowing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  // a verification.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  virtual void prepare_for_verify() {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  // Accessing "marks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  // This function gives a generation a chance to note a point between
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // collections.  For example, a contiguous generation might note the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  // beginning allocation point post-collection, which might allow some later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  // operations to be optimized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  virtual void save_marks() {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // This function allows generations to initialize any "saved marks".  That
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // is, should only be called when the generation is empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  virtual void reset_saved_marks() {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  // This function is "true" iff any no allocations have occurred in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  // generation since the last call to "save_marks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  virtual bool no_allocs_since_save_marks() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  // Apply "cl->apply" to (the addresses of) all reference fields in objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  // allocated in the current generation since the last call to "save_marks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  // If more objects are allocated in this generation as a result of applying
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  // the closure, iterates over reference fields in those objects as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  // Calls "save_marks" at the end of the iteration.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  // General signature...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  virtual void oop_since_save_marks_iterate_v(OopsInGenClosure* cl) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  // ...and specializations for de-virtualization.  (The general
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  // implemention of the _nv versions call the virtual version.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  // Note that the _nv suffix is not really semantically necessary,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  // but it avoids some not-so-useful warnings on Solaris.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
#define Generation_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix)             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  virtual void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) {    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    oop_since_save_marks_iterate_v((OopsInGenClosure*)cl);                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(Generation_SINCE_SAVE_MARKS_DECL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
#undef Generation_SINCE_SAVE_MARKS_DECL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  // The "requestor" generation is performing some garbage collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  // action for which it would be useful to have scratch space.  If
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  // the target is not the requestor, no gc actions will be required
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  // of the target.  The requestor promises to allocate no more than
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  // "max_alloc_words" in the target generation (via promotion say,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  // if the requestor is a young generation and the target is older).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  // If the target generation can provide any scratch space, it adds
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  // it to "list", leaving "list" pointing to the head of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  // augmented list.  The default is to offer no space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  virtual void contribute_scratch(ScratchBlock*& list, Generation* requestor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
                                  size_t max_alloc_words) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   488
  // 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
   489
  // contributed scratch.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   490
  virtual void reset_scratch() {};
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   491
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  // When an older generation has been collected, and perhaps resized,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  // this method will be invoked on all younger generations (from older to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  // younger), allowing them to resize themselves as appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  virtual void compute_new_size() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  // Printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  virtual const char* name() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  virtual const char* short_name() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  int level() const { return _level; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  // Attributes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // True iff the given generation may only be the youngest generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  virtual bool must_be_youngest() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  // True iff the given generation may only be the oldest generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  virtual bool must_be_oldest() const = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  // Reference Processing accessor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  ReferenceProcessor* const ref_processor() { return _ref_processor; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  // Iteration.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  // Iterate over all the ref-containing fields of all objects in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  // generation, calling "cl.do_oop" on each.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  virtual void oop_iterate(OopClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // Same as above, restricted to the intersection of a memory region and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // the generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  virtual void oop_iterate(MemRegion mr, OopClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  // Iterate over all objects in the generation, calling "cl.do_object" on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  // each.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  virtual void object_iterate(ObjectClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   527
  // 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
   528
  // 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
   529
  // the heap.  This defaults to object_iterate() unless overridden.
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   530
  virtual void safe_object_iterate(ObjectClosure* cl);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 979
diff changeset
   531
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  // Iterate over all objects allocated in the generation since the last
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  // collection, calling "cl.do_object" on each.  The generation must have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  // been initialized properly to support this function, or else this call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // will fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  virtual void object_iterate_since_last_GC(ObjectClosure* cl) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // Apply "cl->do_oop" to (the address of) all and only all the ref fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  // in the current generation that contain pointers to objects in younger
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  // generations. Objects allocated since the last "save_marks" call are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  // excluded.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  virtual void younger_refs_iterate(OopsInGenClosure* cl) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // Inform a generation that it longer contains references to objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  // in any younger generation.    [e.g. Because younger gens are empty,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  // clear the card table.]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  virtual void clear_remembered_set() { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  // Inform a generation that some of its objects have moved.  [e.g. The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  // generation's spaces were compacted, invalidating the card table.]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  virtual void invalidate_remembered_set() { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  // Block abstraction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  // Returns the address of the start of the "block" that contains the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  // address "addr".  We say "blocks" instead of "object" since some heaps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  // may not pack objects densely; a chunk may either be an object or a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  // non-object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  virtual HeapWord* block_start(const void* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  // Requires "addr" to be the start of a chunk, and returns its size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  // "addr + size" is required to be the start of a new chunk, or the end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  // of the active area of the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  virtual size_t block_size(const HeapWord* addr) const ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  // Requires "addr" to be the start of a block, and returns "TRUE" iff
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // the block is an object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  virtual bool block_is_obj(const HeapWord* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  // PrintGC, PrintGCDetails support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  void print_heap_change(size_t prev_used) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  // PrintHeapAtGC support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  virtual void print() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  virtual void print_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  virtual void verify(bool allow_dirty) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  struct StatRecord {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    int invocations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    elapsedTimer accumulated_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
    StatRecord() :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
      invocations(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
      accumulated_time(elapsedTimer()) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  StatRecord _stat_record;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  StatRecord* stat_record() { return &_stat_record; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  virtual void print_summary_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  virtual void print_summary_info_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  // Performance Counter support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  virtual void update_counters() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  virtual CollectorCounters* counters() { return _gc_counters; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
// Class CardGeneration is a generation that is covered by a card table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
// and uses a card-size block-offset array to implement block_start.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
// class BlockOffsetArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
// class BlockOffsetArrayContigSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
class BlockOffsetSharedArray;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
class CardGeneration: public Generation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  // This is shared with other generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  GenRemSet* _rs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  // This is local to this generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  BlockOffsetSharedArray* _bts;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  CardGeneration(ReservedSpace rs, size_t initial_byte_size, int level,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
                 GenRemSet* remset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
979
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   620
  // Attempt to expand the generation by "bytes".  Expand by at a
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   621
  // minimum "expand_bytes".  Return true if some amount (not
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   622
  // necessarily the full "bytes") was done.
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   623
  virtual bool expand(size_t bytes, size_t expand_bytes);
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   624
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  virtual void clear_remembered_set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  virtual void invalidate_remembered_set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  virtual void prepare_for_verify();
979
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   630
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   631
  // Grow generation with specified size (returns false if unable to grow)
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   632
  virtual bool grow_by(size_t bytes) = 0;
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   633
  // Grow generation to reserved size.
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   634
  virtual bool grow_to_reserved() = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
// OneContigSpaceCardGeneration models a heap of old objects contained in a single
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
// contiguous space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
// Garbage collection is performed using mark-compact.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
class OneContigSpaceCardGeneration: public CardGeneration {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  // Abstractly, this is a subtype that gets access to protected fields.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  friend class CompactingPermGen;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  friend class VM_PopulateDumpSharedSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  size_t     _min_heap_delta_bytes;   // Minimum amount to expand.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  ContiguousSpace*  _the_space;       // actual space holding objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  WaterMark  _last_gc;                // watermark between objects allocated before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
                                      // and after last GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  // Grow generation with specified size (returns false if unable to grow)
979
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   655
  virtual bool grow_by(size_t bytes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  // Grow generation to reserved size.
979
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   657
  virtual bool grow_to_reserved();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  // Shrink generation with specified size (returns false if unable to shrink)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  void shrink_by(size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  // Allocation failure
979
c9479f1e0a94 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 977
diff changeset
   662
  virtual bool expand(size_t bytes, size_t expand_bytes);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  void shrink(size_t bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  // Accessing spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  ContiguousSpace* the_space() const { return _the_space; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  OneContigSpaceCardGeneration(ReservedSpace rs, size_t initial_byte_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
                               size_t min_heap_delta_bytes,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
                               int level, GenRemSet* remset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
                               ContiguousSpace* space) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
    CardGeneration(rs, initial_byte_size, level, remset),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    _the_space(space), _min_heap_delta_bytes(min_heap_delta_bytes)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  inline bool is_in(const void* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  // Space enquiries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  size_t capacity() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  size_t used() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  size_t free() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  MemRegion used_region() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  size_t unsafe_max_alloc_nogc() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  size_t contiguous_available() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  // Iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  void object_iterate(ObjectClosure* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  void space_iterate(SpaceClosure* blk, bool usedOnly = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  void object_iterate_since_last_GC(ObjectClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  void younger_refs_iterate(OopsInGenClosure* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  inline CompactibleSpace* first_compaction_space() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  virtual inline HeapWord* allocate(size_t word_size, bool is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  virtual inline HeapWord* par_allocate(size_t word_size, bool is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  // Accessing marks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  inline WaterMark top_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  inline WaterMark bottom_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
#define OneContig_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix)      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  OneContig_SINCE_SAVE_MARKS_DECL(OopsInGenClosure,_v)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(OneContig_SINCE_SAVE_MARKS_DECL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  void save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  void reset_saved_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  bool no_allocs_since_save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  inline size_t block_size(const HeapWord* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  inline bool block_is_obj(const HeapWord* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  virtual void collect(bool full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
                       bool clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
                       size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
                       bool is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  HeapWord* expand_and_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
                                bool is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
                                bool parallel = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  virtual void prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  virtual void gc_epilogue(bool full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   730
  virtual void record_spaces_top();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   731
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  virtual void verify(bool allow_dirty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  virtual void print_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
};