hotspot/src/share/vm/memory/genRemSet.hpp
author ysr
Thu, 05 Jun 2008 15:57:56 -0700
changeset 1374 4c24294029a9
parent 360 21d113ecbf6a
child 1388 3677f5f3d66b
permissions -rw-r--r--
6711316: Open source the Garbage-First garbage collector Summary: First mercurial integration of the code for the Garbage-First garbage collector. Reviewed-by: apetrusenko, iveresov, jmasa, sgoldman, tonyp, ysr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
     2
 * Copyright 2001-2006 Sun Microsystems, Inc.  All Rights Reserved.
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 GenRemSet provides ways of iterating over pointers accross generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
// (This is especially useful for older-to-younger.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
class Generation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
class BarrierSet;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
class OopsInGenClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
class CardTableRS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class GenRemSet: public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
  friend class Generation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
  BarrierSet* _bs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  enum Name {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
    CardTable,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
    Other
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  GenRemSet(BarrierSet * bs) : _bs(bs) {}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    45
  GenRemSet() : _bs(NULL) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  virtual Name rs_kind() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  // These are for dynamic downcasts.  Unfortunately that it names the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  // possible subtypes (but not that they are subtypes!)  Return NULL if
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  // the cast is invalide.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  virtual CardTableRS* as_CardTableRS() { return NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  // Return the barrier set associated with "this."
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  BarrierSet* bs() { return _bs; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    57
  // Set the barrier set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    58
  void set_bs(BarrierSet* bs) { _bs = bs; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    59
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  // Do any (sequential) processing necessary to prepare for (possibly
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  // "parallel", if that arg is true) calls to younger_refs_iterate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  virtual void prepare_for_younger_refs_iterate(bool parallel) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  // Apply the "do_oop" method of "blk" to (exactly) all oop locations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  //  1) that are in objects allocated in "g" at the time of the last call
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  //     to "save_Marks", and
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  //  2) that point to objects in younger generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  virtual void younger_refs_iterate(Generation* g, OopsInGenClosure* blk) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  virtual void younger_refs_in_space_iterate(Space* sp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
                                             OopsInGenClosure* cl) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  // This method is used to notify the remembered set that "new_val" has
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // been written into "field" by the garbage collector.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 179
diff changeset
    75
  void write_ref_field_gc(void* field, oop new_val);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
protected:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 179
diff changeset
    77
  virtual void write_ref_field_gc_work(void* field, oop new_val) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // A version of the above suitable for use by parallel collectors.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 179
diff changeset
    81
  virtual void write_ref_field_gc_par(void* field, oop new_val) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // Resize one of the regions covered by the remembered set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  virtual void resize_covered_region(MemRegion new_region) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // If the rem set imposes any alignment restrictions on boundaries
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // within the heap, this function tells whether they are met.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  virtual bool is_aligned(HeapWord* addr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // If the RS (or BS) imposes an aligment constraint on maximum heap size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // (This must be static, and dispatch on "nm", because it is called
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  // before an RS is created.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  static uintx max_alignment_constraint(Name nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  virtual void verify() = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // Verify that the remembered set has no entries for
179
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
    98
  // the heap interval denoted by mr.  If there are any
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
    99
  // alignment constraints on the remembered set, only the
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
   100
  // part of the region that is aligned is checked.
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
   101
  //
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
   102
  //   alignment boundaries
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
   103
  //   +--------+-------+--------+-------+
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
   104
  //         [ region mr              )
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
   105
  //            [ part checked   )
59e3abf83f72 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 1
diff changeset
   106
  virtual void verify_aligned_region_empty(MemRegion mr) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // If appropriate, print some information about the remset on "tty".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  virtual void print() {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  // Informs the RS that the given memregion contains no references to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // younger generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  virtual void clear(MemRegion mr) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // Informs the RS that there are no references to generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // younger than gen from generations gen and older.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // The parameter clear_perm indicates if the perm_gen's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // remembered set should also be processed/cleared.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  virtual void clear_into_younger(Generation* gen, bool clear_perm) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // Informs the RS that refs in the given "mr" may have changed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  // arbitrarily, and therefore may contain old-to-young pointers.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   123
  // If "whole heap" is true, then this invalidation is part of an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   124
  // invalidation of the whole heap, which an implementation might
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   125
  // handle differently than that of a sub-part of the heap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   126
  virtual void invalidate(MemRegion mr, bool whole_heap = false) = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  // Informs the RS that refs in this generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // may have changed arbitrarily, and therefore may contain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // old-to-young pointers in arbitrary locations. The parameter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  // younger indicates if the same should be done for younger generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // as well. The parameter perm indicates if the same should be done for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  // perm gen as well.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  virtual void invalidate_or_clear(Generation* gen, bool younger, bool perm) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
};