src/hotspot/share/gc/parallel/psParallelCompact.hpp
author tschatzl
Thu, 03 May 2018 14:09:00 +0200
changeset 49964 99e698e94cc7
parent 49448 b91b558a9076
child 50752 9d62da00bf15
permissions -rw-r--r--
8201492: Properly implement non-contiguous generations for Reference discovery Summary: Collectors like G1 implementing non-contiguous generations previously used an inexact but conservative area for discovery. Concurrent and STW reference processing could discover the same reference multiple times, potentially missing referents during evacuation. So these collectors had to take extra measures while concurrent marking/reference discovery has been running. This change makes discovery exact for G1 (and any collector using non-contiguous generations) so that concurrent discovery and STW discovery discover on strictly disjoint memory areas. This means that the mentioned situation can not occur any more, and extra work is not required any more too. Reviewed-by: kbarrett, sjohanss
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
48955
e22914003cf0 8194691: Cleanup unnecessary casts in Atomic/OrderAccess uses
kbarrett
parents: 47634
diff changeset
     2
 * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5076
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5076
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5076
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    25
#ifndef SHARE_VM_GC_PARALLEL_PSPARALLELCOMPACT_HPP
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    26
#define SHARE_VM_GC_PARALLEL_PSPARALLELCOMPACT_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5918
diff changeset
    27
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    28
#include "gc/parallel/mutableSpace.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    29
#include "gc/parallel/objectStartArray.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    30
#include "gc/parallel/parMarkBitMap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    31
#include "gc/parallel/parallelScavengeHeap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    32
#include "gc/shared/collectedHeap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
    33
#include "gc/shared/collectorCounters.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5918
diff changeset
    34
#include "oops/oop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5918
diff changeset
    35
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class ParallelScavengeHeap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class PSAdaptiveSizePolicy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class PSYoungGen;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class PSOldGen;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
class ParCompactionManager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class ParallelTaskTerminator;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
class PSParallelCompact;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
class GCTaskManager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
class GCTaskQueue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
class PreGCValues;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
class MoveAndUpdateClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class RefProcTaskExecutor;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
    48
class ParallelOldTracer;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
    49
class STWGCTimer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    51
// The SplitInfo class holds the information needed to 'split' a source region
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    52
// so that the live data can be copied to two destination *spaces*.  Normally,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    53
// all the live data in a region is copied to a single destination space (e.g.,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    54
// everything live in a region in eden is copied entirely into the old gen).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    55
// However, when the heap is nearly full, all the live data in eden may not fit
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    56
// into the old gen.  Copying only some of the regions from eden to old gen
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    57
// requires finding a region that does not contain a partial object (i.e., no
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    58
// live object crosses the region boundary) somewhere near the last object that
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    59
// does fit into the old gen.  Since it's not always possible to find such a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    60
// region, splitting is necessary for predictable behavior.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    61
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    62
// A region is always split at the end of the partial object.  This avoids
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    63
// additional tests when calculating the new location of a pointer, which is a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    64
// very hot code path.  The partial object and everything to its left will be
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    65
// copied to another space (call it dest_space_1).  The live data to the right
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    66
// of the partial object will be copied either within the space itself, or to a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    67
// different destination space (distinct from dest_space_1).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    68
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    69
// Split points are identified during the summary phase, when region
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    70
// destinations are computed:  data about the split, including the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    71
// partial_object_size, is recorded in a SplitInfo record and the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    72
// partial_object_size field in the summary data is set to zero.  The zeroing is
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    73
// possible (and necessary) since the partial object will move to a different
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    74
// destination space than anything to its right, thus the partial object should
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    75
// not affect the locations of any objects to its right.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    76
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    77
// The recorded data is used during the compaction phase, but only rarely:  when
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    78
// the partial object on the split region will be copied across a destination
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    79
// region boundary.  This test is made once each time a region is filled, and is
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    80
// a simple address comparison, so the overhead is negligible (see
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    81
// PSParallelCompact::first_src_addr()).
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    82
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    83
// Notes:
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    84
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    85
// Only regions with partial objects are split; a region without a partial
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    86
// object does not need any extra bookkeeping.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    87
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    88
// At most one region is split per space, so the amount of data required is
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    89
// constant.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    90
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    91
// A region is split only when the destination space would overflow.  Once that
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    92
// happens, the destination space is abandoned and no other data (even from
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    93
// other source spaces) is targeted to that destination space.  Abandoning the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    94
// destination space may leave a somewhat large unused area at the end, if a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    95
// large object caused the overflow.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    96
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    97
// Future work:
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    98
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
    99
// More bookkeeping would be required to continue to use the destination space.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   100
// The most general solution would allow data from regions in two different
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   101
// source spaces to be "joined" in a single destination region.  At the very
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   102
// least, additional code would be required in next_src_region() to detect the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   103
// join and skip to an out-of-order source region.  If the join region was also
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   104
// the last destination region to which a split region was copied (the most
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   105
// likely case), then additional work would be needed to get fill_region() to
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   106
// stop iteration and switch to a new source region at the right point.  Basic
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   107
// idea would be to use a fake value for the top of the source space.  It is
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   108
// doable, if a bit tricky.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   109
//
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   110
// A simpler (but less general) solution would fill the remainder of the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   111
// destination region with a dummy object and continue filling the next
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   112
// destination region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   113
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   114
class SplitInfo
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   115
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   116
public:
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   117
  // Return true if this split info is valid (i.e., if a split has been
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   118
  // recorded).  The very first region cannot have a partial object and thus is
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   119
  // never split, so 0 is the 'invalid' value.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   120
  bool is_valid() const { return _src_region_idx > 0; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   121
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   122
  // Return true if this split holds data for the specified source region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   123
  inline bool is_split(size_t source_region) const;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   124
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   125
  // The index of the split region, the size of the partial object on that
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   126
  // region and the destination of the partial object.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   127
  size_t    src_region_idx() const   { return _src_region_idx; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   128
  size_t    partial_obj_size() const { return _partial_obj_size; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   129
  HeapWord* destination() const      { return _destination; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   130
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   131
  // The destination count of the partial object referenced by this split
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   132
  // (either 1 or 2).  This must be added to the destination count of the
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   133
  // remainder of the source region.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   134
  unsigned int destination_count() const { return _destination_count; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   135
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   136
  // If a word within the partial object will be written to the first word of a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   137
  // destination region, this is the address of the destination region;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   138
  // otherwise this is NULL.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   139
  HeapWord* dest_region_addr() const     { return _dest_region_addr; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   140
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   141
  // If a word within the partial object will be written to the first word of a
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   142
  // destination region, this is the address of that word within the partial
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   143
  // object; otherwise this is NULL.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   144
  HeapWord* first_src_addr() const       { return _first_src_addr; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   145
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   146
  // Record the data necessary to split the region src_region_idx.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   147
  void record(size_t src_region_idx, size_t partial_obj_size,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   148
              HeapWord* destination);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   149
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   150
  void clear();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   151
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   152
  DEBUG_ONLY(void verify_clear();)
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   153
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   154
private:
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   155
  size_t       _src_region_idx;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   156
  size_t       _partial_obj_size;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   157
  HeapWord*    _destination;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   158
  unsigned int _destination_count;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   159
  HeapWord*    _dest_region_addr;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   160
  HeapWord*    _first_src_addr;
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   161
};
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   162
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   163
inline bool SplitInfo::is_split(size_t region_idx) const
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   164
{
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   165
  return _src_region_idx == region_idx && is_valid();
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   166
}
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   167
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
class SpaceInfo
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  MutableSpace* space() const { return _space; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Where the free space will start after the collection.  Valid only after the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // summary phase completes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  HeapWord* new_top() const { return _new_top; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // Allows new_top to be set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  HeapWord** new_top_addr() { return &_new_top; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Where the smallest allowable dense prefix ends (used only for perm gen).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  HeapWord* min_dense_prefix() const { return _min_dense_prefix; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // Where the dense prefix ends, or the compacted region begins.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  HeapWord* dense_prefix() const { return _dense_prefix; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // The start array for the (generation containing the) space, or NULL if there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // is no start array.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  ObjectStartArray* start_array() const { return _start_array; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   190
  SplitInfo& split_info() { return _split_info; }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   191
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  void set_space(MutableSpace* s)           { _space = s; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  void set_new_top(HeapWord* addr)          { _new_top = addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  void set_min_dense_prefix(HeapWord* addr) { _min_dense_prefix = addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  void set_dense_prefix(HeapWord* addr)     { _dense_prefix = addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  void set_start_array(ObjectStartArray* s) { _start_array = s; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   198
  void publish_new_top() const              { _space->set_top(_new_top); }
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   199
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  MutableSpace*     _space;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  HeapWord*         _new_top;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  HeapWord*         _min_dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  HeapWord*         _dense_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  ObjectStartArray* _start_array;
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   206
  SplitInfo         _split_info;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
class ParallelCompactData
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // Sizes are in HeapWords, unless indicated otherwise.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   213
  static const size_t Log2RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   214
  static const size_t RegionSize;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   215
  static const size_t RegionSizeBytes;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   217
  // Mask for the bits in a size_t to get an offset within a region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   218
  static const size_t RegionSizeOffsetMask;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   219
  // Mask for the bits in a pointer to get an offset within a region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   220
  static const size_t RegionAddrOffsetMask;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   221
  // Mask for the bits in a pointer to get the address of the start of a region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   222
  static const size_t RegionAddrMask;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   224
  static const size_t Log2BlockSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   225
  static const size_t BlockSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   226
  static const size_t BlockSizeBytes;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   227
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   228
  static const size_t BlockSizeOffsetMask;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   229
  static const size_t BlockAddrOffsetMask;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   230
  static const size_t BlockAddrMask;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   231
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   232
  static const size_t BlocksPerRegion;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   233
  static const size_t Log2BlocksPerRegion;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   234
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   235
  class RegionData
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  public:
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   238
    // Destination address of the region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    HeapWord* destination() const { return _destination; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   241
    // The first region containing data destined for this region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   242
    size_t source_region() const { return _source_region; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   244
    // The object (if any) starting in this region and ending in a different
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   245
    // region that could not be updated during the main (parallel) compaction
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    // phase.  This is different from _partial_obj_addr, which is an object that
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   247
    // extends onto a source region.  However, the two uses do not overlap in
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    // time, so the same field is used to save space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    HeapWord* deferred_obj_addr() const { return _partial_obj_addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   251
    // The starting address of the partial object extending onto the region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    HeapWord* partial_obj_addr() const { return _partial_obj_addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   254
    // Size of the partial object extending onto the region (words).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    size_t partial_obj_size() const { return _partial_obj_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   257
    // Size of live data that lies within this region due to objects that start
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   258
    // in this region (words).  This does not include the partial object
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   259
    // extending onto the region (if any), or the part of an object that extends
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   260
    // onto the next region (if any).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    size_t live_obj_size() const { return _dc_and_los & los_mask; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   263
    // Total live data that lies within the region (words).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    size_t data_size() const { return partial_obj_size() + live_obj_size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   266
    // The destination_count is the number of other regions to which data from
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   267
    // this region will be copied.  At the end of the summary phase, the valid
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    // values of destination_count are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    //
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   270
    // 0 - data from the region will be compacted completely into itself, or the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   271
    //     region is empty.  The region can be claimed and then filled.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   272
    // 1 - data from the region will be compacted into 1 other region; some
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   273
    //     data from the region may also be compacted into the region itself.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   274
    // 2 - data from the region will be copied to 2 other regions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    //
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   276
    // During compaction as regions are emptied, the destination_count is
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    // decremented (atomically) and when it reaches 0, it can be claimed and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    // then filled.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    //
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   280
    // A region is claimed for processing by atomically changing the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   281
    // destination_count to the claimed value (dc_claimed).  After a region has
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    // been filled, the destination_count should be set to the completed value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    // (dc_completed).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    inline uint destination_count() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    inline uint destination_count_raw() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   287
    // Whether the block table for this region has been filled.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   288
    inline bool blocks_filled() const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   289
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   290
    // Number of times the block table was filled.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   291
    DEBUG_ONLY(inline size_t blocks_filled_count() const;)
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   292
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   293
    // The location of the java heap data that corresponds to this region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    inline HeapWord* data_location() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   296
    // The highest address referenced by objects in this region.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    inline HeapWord* highest_ref() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   299
    // Whether this region is available to be claimed, has been claimed, or has
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    // been completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    //
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   302
    // Minor subtlety:  claimed() returns true if the region is marked
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   303
    // completed(), which is desirable since a region must be claimed before it
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    // can be completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    bool available() const { return _dc_and_los < dc_one; }
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 30764
diff changeset
   306
    bool claimed()   const { return _dc_and_los >= dc_claimed; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
    bool completed() const { return _dc_and_los >= dc_completed; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    // These are not atomic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    void set_destination(HeapWord* addr)       { _destination = addr; }
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   311
    void set_source_region(size_t region)      { _source_region = region; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    void set_deferred_obj_addr(HeapWord* addr) { _partial_obj_addr = addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    void set_partial_obj_addr(HeapWord* addr)  { _partial_obj_addr = addr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    void set_partial_obj_size(size_t words)    {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   315
      _partial_obj_size = (region_sz_t) words;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    }
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   317
    inline void set_blocks_filled();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
    inline void set_destination_count(uint count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
    inline void set_live_obj_size(size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    inline void set_data_location(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    inline void set_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    inline bool claim_unsafe();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    // These are atomic.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    inline void add_live_obj(size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    inline void set_highest_ref(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    inline void decrement_destination_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    inline bool claim();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  private:
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   332
    // The type used to represent object sizes within a region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   333
    typedef uint region_sz_t;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    // Constants for manipulating the _dc_and_los field, which holds both the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    // destination count and live obj size.  The live obj size lives at the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    // least significant end so no masking is necessary when adding.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   338
    static const region_sz_t dc_shift;           // Shift amount.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   339
    static const region_sz_t dc_mask;            // Mask for destination count.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   340
    static const region_sz_t dc_one;             // 1, shifted appropriately.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   341
    static const region_sz_t dc_claimed;         // Region has been claimed.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   342
    static const region_sz_t dc_completed;       // Region has been completed.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   343
    static const region_sz_t los_mask;           // Mask for live obj size.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   345
    HeapWord*            _destination;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   346
    size_t               _source_region;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   347
    HeapWord*            _partial_obj_addr;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   348
    region_sz_t          _partial_obj_size;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   349
    region_sz_t volatile _dc_and_los;
33758
aa54610a0b93 8138966: Intermittent SEGV running ParallelGC
aph
parents: 33227
diff changeset
   350
    bool        volatile _blocks_filled;
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   351
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
#ifdef ASSERT
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   353
    size_t               _blocks_filled_count;   // Number of block table fills.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   354
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
    // These enable optimizations that are only partially implemented.  Use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
    // debug builds to prevent the code fragments from breaking.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   357
    HeapWord*            _data_location;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   358
    HeapWord*            _highest_ref;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
   public:
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   363
    uint                 _pushed;   // 0 until region is pushed onto a stack
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
   private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   368
  // "Blocks" allow shorter sections of the bitmap to be searched.  Each Block
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   369
  // holds an offset, which is the amount of live data in the Region to the left
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   370
  // of the first live object that starts in the Block.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   371
  class BlockData
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   372
  {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   373
  public:
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   374
    typedef unsigned short int blk_ofs_t;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   375
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   376
    blk_ofs_t offset() const    { return _offset; }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   377
    void set_offset(size_t val) { _offset = (blk_ofs_t)val; }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   378
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   379
  private:
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   380
    blk_ofs_t _offset;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   381
  };
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   382
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  ParallelCompactData();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  bool initialize(MemRegion covered_region);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   387
  size_t region_count() const { return _region_count; }
17627
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   388
  size_t reserved_byte_size() const { return _reserved_byte_size; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   390
  // Convert region indices to/from RegionData pointers.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   391
  inline RegionData* region(size_t region_idx) const;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   392
  inline size_t     region(const RegionData* const region_ptr) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   394
  size_t block_count() const { return _block_count; }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   395
  inline BlockData* block(size_t block_idx) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   396
  inline size_t     block(const BlockData* block_ptr) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  void add_obj(HeapWord* addr, size_t len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  void add_obj(oop p, size_t len) { add_obj((HeapWord*)p, len); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   401
  // Fill in the regions covering [beg, end) so that no data moves; i.e., the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   402
  // destination of region n is simply the start of region n.  The argument beg
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   403
  // must be region-aligned; end need not be.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  void summarize_dense_prefix(HeapWord* beg, HeapWord* end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   406
  HeapWord* summarize_split_space(size_t src_region, SplitInfo& split_info,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   407
                                  HeapWord* destination, HeapWord* target_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   408
                                  HeapWord** target_next);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   409
  bool summarize(SplitInfo& split_info,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
                 HeapWord* source_beg, HeapWord* source_end,
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   411
                 HeapWord** source_next,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   412
                 HeapWord* target_beg, HeapWord* target_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
   413
                 HeapWord** target_next);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  void clear();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   416
  void clear_range(size_t beg_region, size_t end_region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  void clear_range(HeapWord* beg, HeapWord* end) {
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   418
    clear_range(addr_to_region_idx(beg), addr_to_region_idx(end));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   421
  // Return the number of words between addr and the start of the region
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  // containing addr.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   423
  inline size_t     region_offset(const HeapWord* addr) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   425
  // Convert addresses to/from a region index or region pointer.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   426
  inline size_t     addr_to_region_idx(const HeapWord* addr) const;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   427
  inline RegionData* addr_to_region_ptr(const HeapWord* addr) const;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   428
  inline HeapWord*  region_to_addr(size_t region) const;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   429
  inline HeapWord*  region_to_addr(size_t region, size_t offset) const;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   430
  inline HeapWord*  region_to_addr(const RegionData* region) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   432
  inline HeapWord*  region_align_down(HeapWord* addr) const;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   433
  inline HeapWord*  region_align_up(HeapWord* addr) const;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   434
  inline bool       is_region_aligned(HeapWord* addr) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   436
  // Analogous to region_offset() for blocks.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   437
  size_t     block_offset(const HeapWord* addr) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   438
  size_t     addr_to_block_idx(const HeapWord* addr) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   439
  size_t     addr_to_block_idx(const oop obj) const {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   440
    return addr_to_block_idx((HeapWord*) obj);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   441
  }
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   442
  inline BlockData* addr_to_block_ptr(const HeapWord* addr) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   443
  inline HeapWord*  block_to_addr(size_t block) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   444
  inline size_t     region_to_block_idx(size_t region) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   445
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   446
  inline HeapWord*  block_align_down(HeapWord* addr) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   447
  inline HeapWord*  block_align_up(HeapWord* addr) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   448
  inline bool       is_block_aligned(HeapWord* addr) const;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   449
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // Return the address one past the end of the partial object.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   451
  HeapWord* partial_obj_end(size_t region_idx) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   453
  // Return the location of the object after compaction.
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   454
  HeapWord* calc_new_pointer(HeapWord* addr, ParCompactionManager* cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   456
  HeapWord* calc_new_pointer(oop p, ParCompactionManager* cm) {
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   457
    return calc_new_pointer((HeapWord*) p, cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  void verify_clear(const PSVirtualSpace* vspace);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  void verify_clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
private:
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   466
  bool initialize_block_data();
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   467
  bool initialize_region_data(size_t region_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  PSVirtualSpace* create_vspace(size_t count, size_t element_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  HeapWord*       _region_start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  HeapWord*       _region_end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   476
  PSVirtualSpace* _region_vspace;
17627
325871034f2c 7186737: Unable to allocate bit maps or card tables for parallel gc for the requested heap
tamao
parents: 17625
diff changeset
   477
  size_t          _reserved_byte_size;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   478
  RegionData*     _region_data;
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   479
  size_t          _region_count;
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   480
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   481
  PSVirtualSpace* _block_vspace;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   482
  BlockData*      _block_data;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   483
  size_t          _block_count;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
inline uint
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   487
ParallelCompactData::RegionData::destination_count_raw() const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  return _dc_and_los & dc_mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
inline uint
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   493
ParallelCompactData::RegionData::destination_count() const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  return destination_count_raw() >> dc_shift;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   498
inline bool
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   499
ParallelCompactData::RegionData::blocks_filled() const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   500
{
33758
aa54610a0b93 8138966: Intermittent SEGV running ParallelGC
aph
parents: 33227
diff changeset
   501
  bool result = _blocks_filled;
aa54610a0b93 8138966: Intermittent SEGV running ParallelGC
aph
parents: 33227
diff changeset
   502
  OrderAccess::acquire();
aa54610a0b93 8138966: Intermittent SEGV running ParallelGC
aph
parents: 33227
diff changeset
   503
  return result;
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   504
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   505
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   506
#ifdef ASSERT
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   507
inline size_t
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   508
ParallelCompactData::RegionData::blocks_filled_count() const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   509
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   510
  return _blocks_filled_count;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   511
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   512
#endif // #ifdef ASSERT
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   513
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   514
inline void
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   515
ParallelCompactData::RegionData::set_blocks_filled()
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   516
{
33758
aa54610a0b93 8138966: Intermittent SEGV running ParallelGC
aph
parents: 33227
diff changeset
   517
  OrderAccess::release();
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   518
  _blocks_filled = true;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   519
  // Debug builds count the number of times the table was filled.
47552
8a3599d60996 8186838: Generalize Atomic::inc/dec with templates
eosterlund
parents: 47216
diff changeset
   520
  DEBUG_ONLY(Atomic::inc(&_blocks_filled_count));
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   521
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   522
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
inline void
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   524
ParallelCompactData::RegionData::set_destination_count(uint count)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  assert(count <= (dc_completed >> dc_shift), "count too large");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   527
  const region_sz_t live_sz = (region_sz_t) live_obj_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  _dc_and_los = (count << dc_shift) | live_sz;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   531
inline void ParallelCompactData::RegionData::set_live_obj_size(size_t words)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  assert(words <= los_mask, "would overflow");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   534
  _dc_and_los = destination_count_raw() | (region_sz_t)words;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   537
inline void ParallelCompactData::RegionData::decrement_destination_count()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  assert(_dc_and_los < dc_claimed, "already claimed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  assert(_dc_and_los >= dc_one, "count would go negative");
48955
e22914003cf0 8194691: Cleanup unnecessary casts in Atomic/OrderAccess uses
kbarrett
parents: 47634
diff changeset
   541
  Atomic::add(dc_mask, &_dc_and_los);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   544
inline HeapWord* ParallelCompactData::RegionData::data_location() const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  DEBUG_ONLY(return _data_location;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  NOT_DEBUG(return NULL;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   550
inline HeapWord* ParallelCompactData::RegionData::highest_ref() const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  DEBUG_ONLY(return _highest_ref;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  NOT_DEBUG(return NULL;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   556
inline void ParallelCompactData::RegionData::set_data_location(HeapWord* addr)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  DEBUG_ONLY(_data_location = addr;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   561
inline void ParallelCompactData::RegionData::set_completed()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  assert(claimed(), "must be claimed first");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   564
  _dc_and_los = dc_completed | (region_sz_t) live_obj_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   567
// MT-unsafe claiming of a region.  Should only be used during single threaded
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
// execution.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   569
inline bool ParallelCompactData::RegionData::claim_unsafe()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  if (available()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
    _dc_and_los |= dc_claimed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   578
inline void ParallelCompactData::RegionData::add_live_obj(size_t words)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  assert(words <= (size_t)los_mask - live_obj_size(), "overflow");
48955
e22914003cf0 8194691: Cleanup unnecessary casts in Atomic/OrderAccess uses
kbarrett
parents: 47634
diff changeset
   581
  Atomic::add(static_cast<region_sz_t>(words), &_dc_and_los);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   584
inline void ParallelCompactData::RegionData::set_highest_ref(HeapWord* addr)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  HeapWord* tmp = _highest_ref;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  while (addr > tmp) {
47634
6a0c42c40cd1 8188220: Remove Atomic::*_ptr() uses and overloads from hotspot
coleenp
parents: 47552
diff changeset
   589
    tmp = Atomic::cmpxchg(addr, &_highest_ref, tmp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   594
inline bool ParallelCompactData::RegionData::claim()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
{
46958
a13bd8c6b7a2 8186166: Generalize Atomic::cmpxchg with templates
eosterlund
parents: 46502
diff changeset
   596
  const region_sz_t los = static_cast<region_sz_t>(live_obj_size());
a13bd8c6b7a2 8186166: Generalize Atomic::cmpxchg with templates
eosterlund
parents: 46502
diff changeset
   597
  const region_sz_t old = Atomic::cmpxchg(dc_claimed | los, &_dc_and_los, los);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  return old == los;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   601
inline ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   602
ParallelCompactData::region(size_t region_idx) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   604
  assert(region_idx <= region_count(), "bad arg");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   605
  return _region_data + region_idx;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
inline size_t
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   609
ParallelCompactData::region(const RegionData* const region_ptr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   611
  assert(region_ptr >= _region_data, "bad arg");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   612
  assert(region_ptr <= _region_data + region_count(), "bad arg");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   613
  return pointer_delta(region_ptr, _region_data, sizeof(RegionData));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   616
inline ParallelCompactData::BlockData*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   617
ParallelCompactData::block(size_t n) const {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   618
  assert(n < block_count(), "bad arg");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   619
  return _block_data + n;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   620
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   621
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
inline size_t
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   623
ParallelCompactData::region_offset(const HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  assert(addr >= _region_start, "bad addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  assert(addr <= _region_end, "bad addr");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   627
  return (size_t(addr) & RegionAddrOffsetMask) >> LogHeapWordSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
inline size_t
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   631
ParallelCompactData::addr_to_region_idx(const HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
{
38149
f0f1c01a930c 8154743: Internal Error: psParallelCompact.hpp assert(addr >= _region_start) failed: bad addr
jmasa
parents: 36581
diff changeset
   633
  assert(addr >= _region_start, "bad addr " PTR_FORMAT " _region_start " PTR_FORMAT, p2i(addr), p2i(_region_start));
f0f1c01a930c 8154743: Internal Error: psParallelCompact.hpp assert(addr >= _region_start) failed: bad addr
jmasa
parents: 36581
diff changeset
   634
  assert(addr <= _region_end, "bad addr " PTR_FORMAT " _region_end " PTR_FORMAT, p2i(addr), p2i(_region_end));
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   635
  return pointer_delta(addr, _region_start) >> Log2RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   638
inline ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   639
ParallelCompactData::addr_to_region_ptr(const HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   641
  return region(addr_to_region_idx(addr));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   645
ParallelCompactData::region_to_addr(size_t region) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   647
  assert(region <= _region_count, "region out of range");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   648
  return _region_start + (region << Log2RegionSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   652
ParallelCompactData::region_to_addr(const RegionData* region) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   654
  return region_to_addr(pointer_delta(region, _region_data,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   655
                                      sizeof(RegionData)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   659
ParallelCompactData::region_to_addr(size_t region, size_t offset) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   661
  assert(region <= _region_count, "region out of range");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   662
  assert(offset < RegionSize, "offset too big");  // This may be too strict.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   663
  return region_to_addr(region) + offset;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   667
ParallelCompactData::region_align_down(HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  assert(addr >= _region_start, "bad addr");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   670
  assert(addr < _region_end + RegionSize, "bad addr");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   671
  return (HeapWord*)(size_t(addr) & RegionAddrMask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   675
ParallelCompactData::region_align_up(HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  assert(addr >= _region_start, "bad addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  assert(addr <= _region_end, "bad addr");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   679
  return region_align_down(addr + RegionSizeOffsetMask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
inline bool
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   683
ParallelCompactData::is_region_aligned(HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   685
  return region_offset(addr) == 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   688
inline size_t
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   689
ParallelCompactData::block_offset(const HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   690
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   691
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   692
  assert(addr <= _region_end, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   693
  return (size_t(addr) & BlockAddrOffsetMask) >> LogHeapWordSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   694
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   695
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   696
inline size_t
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   697
ParallelCompactData::addr_to_block_idx(const HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   698
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   699
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   700
  assert(addr <= _region_end, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   701
  return pointer_delta(addr, _region_start) >> Log2BlockSize;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   702
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   703
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   704
inline ParallelCompactData::BlockData*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   705
ParallelCompactData::addr_to_block_ptr(const HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   706
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   707
  return block(addr_to_block_idx(addr));
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   708
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   709
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   710
inline HeapWord*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   711
ParallelCompactData::block_to_addr(size_t block) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   712
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   713
  assert(block < _block_count, "block out of range");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   714
  return _region_start + (block << Log2BlockSize);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   715
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   716
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   717
inline size_t
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   718
ParallelCompactData::region_to_block_idx(size_t region) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   719
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   720
  return region << Log2BlocksPerRegion;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   721
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   722
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   723
inline HeapWord*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   724
ParallelCompactData::block_align_down(HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   725
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   726
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   727
  assert(addr < _region_end + RegionSize, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   728
  return (HeapWord*)(size_t(addr) & BlockAddrMask);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   729
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   730
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   731
inline HeapWord*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   732
ParallelCompactData::block_align_up(HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   733
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   734
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   735
  assert(addr <= _region_end, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   736
  return block_align_down(addr + BlockSizeOffsetMask);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   737
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   738
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   739
inline bool
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   740
ParallelCompactData::is_block_aligned(HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   741
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   742
  return block_offset(addr) == 0;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   743
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   744
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
// Abstract closure for use with ParMarkBitMap::iterate(), which will invoke the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
// do_addr() method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
// The closure is initialized with the number of heap words to process
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
// (words_remaining()), and becomes 'full' when it reaches 0.  The do_addr()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
// methods in subclasses should update the total as words are processed.  Since
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
// only one subclass actually uses this mechanism to terminate iteration, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
// default initial value is > 0.  The implementation is here and not in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
// single subclass that uses it to avoid making is_full() virtual, and thus
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
// adding a virtual call per live object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
class ParMarkBitMapClosure: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  typedef ParMarkBitMap::idx_t idx_t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  typedef ParMarkBitMap::IterationStatus IterationStatus;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  inline ParMarkBitMapClosure(ParMarkBitMap* mbm, ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
                              size_t words = max_uintx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  inline ParCompactionManager* compaction_manager() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  inline ParMarkBitMap*        bitmap() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  inline size_t                words_remaining() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  inline bool                  is_full() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  inline HeapWord*             source() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  inline void                  set_source(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  virtual IterationStatus do_addr(HeapWord* addr, size_t words) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  inline void decrement_words_remaining(size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  ParMarkBitMap* const        _bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  ParCompactionManager* const _compaction_manager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  DEBUG_ONLY(const size_t     _initial_words_remaining;) // Useful in debugger.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  size_t                      _words_remaining; // Words left to copy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  HeapWord*                   _source;          // Next addr that would be read.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
ParMarkBitMapClosure::ParMarkBitMapClosure(ParMarkBitMap* bitmap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
                                           ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
                                           size_t words):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  _bitmap(bitmap), _compaction_manager(cm)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  , _initial_words_remaining(words)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  _words_remaining = words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  _source = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
inline ParCompactionManager* ParMarkBitMapClosure::compaction_manager() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  return _compaction_manager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
inline ParMarkBitMap* ParMarkBitMapClosure::bitmap() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  return _bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
inline size_t ParMarkBitMapClosure::words_remaining() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  return _words_remaining;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
inline bool ParMarkBitMapClosure::is_full() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  return words_remaining() == 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
inline HeapWord* ParMarkBitMapClosure::source() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  return _source;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
inline void ParMarkBitMapClosure::set_source(HeapWord* addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  _source = addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
inline void ParMarkBitMapClosure::decrement_words_remaining(size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  assert(_words_remaining >= words, "processed too many words");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  _words_remaining -= words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   830
// The UseParallelOldGC collector is a stop-the-world garbage collector that
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   831
// does parts of the collection using parallel threads.  The collection includes
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   832
// the tenured generation and the young generation.  The permanent generation is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   833
// collected at the same time as the other two generations but the permanent
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   834
// generation is collect by a single GC thread.  The permanent generation is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   835
// collected serially because of the requirement that during the processing of a
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   836
// klass AAA, any objects reference by AAA must already have been processed.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   837
// This requirement is enforced by a left (lower address) to right (higher
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   838
// address) sliding compaction.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   839
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   840
// There are four phases of the collection.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   841
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   842
//      - marking phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   843
//      - summary phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   844
//      - compacting phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   845
//      - clean up phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   846
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   847
// Roughly speaking these phases correspond, respectively, to
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   848
//      - mark all the live objects
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   849
//      - calculate the destination of each object at the end of the collection
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   850
//      - move the objects to their destination
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   851
//      - update some references and reinitialize some variables
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   852
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   853
// These three phases are invoked in PSParallelCompact::invoke_no_policy().  The
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   854
// marking phase is implemented in PSParallelCompact::marking_phase() and does a
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   855
// complete marking of the heap.  The summary phase is implemented in
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   856
// PSParallelCompact::summary_phase().  The move and update phase is implemented
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   857
// in PSParallelCompact::compact().
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   858
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   859
// A space that is being collected is divided into regions and with each region
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   860
// is associated an object of type ParallelCompactData.  Each region is of a
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   861
// fixed size and typically will contain more than 1 object and may have parts
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   862
// of objects at the front and back of the region.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   863
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   864
// region            -----+---------------------+----------
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   865
// objects covered   [ AAA  )[ BBB )[ CCC   )[ DDD     )
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   866
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   867
// The marking phase does a complete marking of all live objects in the heap.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   868
// The marking also compiles the size of the data for all live objects covered
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   869
// by the region.  This size includes the part of any live object spanning onto
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   870
// the region (part of AAA if it is live) from the front, all live objects
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   871
// contained in the region (BBB and/or CCC if they are live), and the part of
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   872
// any live objects covered by the region that extends off the region (part of
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   873
// DDD if it is live).  The marking phase uses multiple GC threads and marking
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   874
// is done in a bit array of type ParMarkBitMap.  The marking of the bit map is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   875
// done atomically as is the accumulation of the size of the live objects
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   876
// covered by a region.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   877
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   878
// The summary phase calculates the total live data to the left of each region
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   879
// XXX.  Based on that total and the bottom of the space, it can calculate the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   880
// starting location of the live data in XXX.  The summary phase calculates for
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22221
diff changeset
   881
// each region XXX quantities such as
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   882
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   883
//      - the amount of live data at the beginning of a region from an object
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   884
//        entering the region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   885
//      - the location of the first live data on the region
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   886
//      - a count of the number of regions receiving live data from XXX.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   887
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   888
// See ParallelCompactData for precise details.  The summary phase also
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   889
// calculates the dense prefix for the compaction.  The dense prefix is a
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   890
// portion at the beginning of the space that is not moved.  The objects in the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   891
// dense prefix do need to have their object references updated.  See method
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   892
// summarize_dense_prefix().
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   893
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   894
// The summary phase is done using 1 GC thread.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   895
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   896
// The compaction phase moves objects to their new location and updates all
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   897
// references in the object.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   898
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   899
// A current exception is that objects that cross a region boundary are moved
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   900
// but do not have their references updated.  References are not updated because
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   901
// it cannot easily be determined if the klass pointer KKK for the object AAA
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   902
// has been updated.  KKK likely resides in a region to the left of the region
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   903
// containing AAA.  These AAA's have there references updated at the end in a
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   904
// clean up phase.  See the method PSParallelCompact::update_deferred_objects().
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   905
// An alternate strategy is being investigated for this deferral of updating.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   906
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   907
// Compaction is done on a region basis.  A region that is ready to be filled is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   908
// put on a ready list and GC threads take region off the list and fill them.  A
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   909
// region is ready to be filled if it empty of live objects.  Such a region may
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   910
// have been initially empty (only contained dead objects) or may have had all
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   911
// its live objects copied out already.  A region that compacts into itself is
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   912
// also ready for filling.  The ready list is initially filled with empty
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   913
// regions and regions compacting into themselves.  There is always at least 1
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   914
// region that can be put on the ready list.  The regions are atomically added
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   915
// and removed from the ready list.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   916
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
class PSParallelCompact : AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  // Convenient access to type names.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  typedef ParMarkBitMap::idx_t idx_t;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   921
  typedef ParallelCompactData::RegionData RegionData;
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   922
  typedef ParallelCompactData::BlockData BlockData;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  typedef enum {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   925
    old_space_id, eden_space_id,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
    from_space_id, to_space_id, last_space_id
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  } SpaceId;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
 public:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   930
  // Inline closure decls
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  class IsAliveClosure: public BoolObjectClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
   public:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   934
    virtual bool do_object_b(oop p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   937
  class AdjustPointerClosure: public ExtendedOopClosure {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
   public:
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   939
    AdjustPointerClosure(ParCompactionManager* cm) {
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   940
      assert(cm != NULL, "associate ParCompactionManage should not be NULL");
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   941
      _cm = cm;
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   942
    }
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   943
    template <typename T> void do_oop_nv(T* p);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   944
    virtual void do_oop(oop* p);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   945
    virtual void do_oop(narrowOop* p);
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   946
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   947
    // This closure provides its own oop verification code.
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   948
    debug_only(virtual bool should_verify_oops() { return false; })
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   949
   private:
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   950
    ParCompactionManager* _cm;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  friend class AdjustPointerClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
  friend class RefProcTaskProxy;
42638
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
   955
  friend class PSParallelCompactTest;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
 private:
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   958
  static STWGCTimer           _gc_timer;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   959
  static ParallelOldTracer    _gc_tracer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
  static elapsedTimer         _accumulated_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  static unsigned int         _total_invocations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
  static unsigned int         _maximum_compaction_gc_num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  static jlong                _time_of_last_gc;   // ms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  static CollectorCounters*   _counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  static ParMarkBitMap        _mark_bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  static ParallelCompactData  _summary_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  static IsAliveClosure       _is_alive_closure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  static SpaceInfo            _space_info[last_space_id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  // Reference processing (used in ...follow_contents)
49964
99e698e94cc7 8201492: Properly implement non-contiguous generations for Reference discovery
tschatzl
parents: 49448
diff changeset
   971
  static SpanSubjectToDiscoveryClosure  _span_based_discoverer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  static ReferenceProcessor*  _ref_processor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  // Values computed at initialization and used by dead_wood_limiter().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  static double _dwl_mean;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  static double _dwl_std_dev;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  static double _dwl_first_term;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  static double _dwl_adjustment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  static bool   _dwl_initialized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 22551
diff changeset
   983
 public:
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 22551
diff changeset
   984
  static ParallelOldTracer* gc_tracer() { return &_gc_tracer; }
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 22551
diff changeset
   985
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  static void initialize_space_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  // Clear the marking bitmap and summary data that cover the specified space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  static void clear_data_covering_space(SpaceId id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33758
diff changeset
   993
  static void pre_compact();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  static void post_compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  // Mark live objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  static void marking_phase(ParCompactionManager* cm,
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   998
                            bool maximum_heap_compaction,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   999
                            ParallelOldTracer *gc_tracer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  // Compute the dense prefix for the designated space.  This is an experimental
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  // implementation currently not used in production.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  static HeapWord* compute_dense_prefix_via_density(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
                                                    bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  // Methods used to compute the dense prefix.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  // Compute the value of the normal distribution at x = density.  The mean and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  // standard deviation are values saved by initialize_dead_wood_limiter().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  static inline double normal_distribution(double density);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  // Initialize the static vars used by dead_wood_limiter().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  static void initialize_dead_wood_limiter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  // Return the percentage of space that can be treated as "dead wood" (i.e.,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
  // not reclaimed).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  static double dead_wood_limiter(double density, size_t min_percent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1019
  // Find the first (left-most) region in the range [beg, end) that has at least
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  // dead_words of dead space to the left.  The argument beg must be the first
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1021
  // region in the space that is not completely live.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1022
  static RegionData* dead_wood_limit_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1023
                                            const RegionData* end,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1024
                                            size_t dead_words);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1026
  // Return a pointer to the first region in the range [beg, end) that is not
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  // completely full.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1028
  static RegionData* first_dead_space_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1029
                                             const RegionData* end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  // Return a value indicating the benefit or 'yield' if the compacted region
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  // were to start (or equivalently if the dense prefix were to end) at the
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1033
  // candidate region.  Higher values are better.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  // The value is based on the amount of space reclaimed vs. the costs of (a)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  // updating references in the dense prefix plus (b) copying objects and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  // updating references in the compacted region.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1038
  static inline double reclaimed_ratio(const RegionData* const candidate,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
                                       HeapWord* const bottom,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
                                       HeapWord* const top,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
                                       HeapWord* const new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  // Compute the dense prefix for the designated space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  static HeapWord* compute_dense_prefix(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
                                        bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1047
  // Return true if dead space crosses onto the specified Region; bit must be
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1048
  // the bit index corresponding to the first word of the Region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1049
  static inline bool dead_space_crosses_boundary(const RegionData* region,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
                                                 idx_t bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  // Summary phase utility routine to fill dead space (if any) at the dense
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  // prefix boundary.  Should only be called if the the dense prefix is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
  // non-empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  static void fill_dense_prefix_end(SpaceId id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
  static void summarize_spaces_quick();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  static void summarize_space(SpaceId id, bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
  static void summary_phase(ParCompactionManager* cm, bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  // Adjust addresses in roots.  Does not adjust addresses in heap.
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  1062
  static void adjust_roots(ParCompactionManager* cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33758
diff changeset
  1064
  DEBUG_ONLY(static void write_block_fill_histogram();)
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
  1065
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  // Move objects to new locations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  static void compact_perm(ParCompactionManager* cm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  static void compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1070
  // Add available regions to the stack and draining tasks to the task queue.
38170
ff88a25a7799 8150994: UseParallelGC fails with UseDynamicNumberOfGCThreads with specjbb2005
jmasa
parents: 38149
diff changeset
  1071
  static void prepare_region_draining_tasks(GCTaskQueue* q,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1072
                                            uint parallel_gc_threads);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
  // Add dense prefix update tasks to the task queue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  static void enqueue_dense_prefix_tasks(GCTaskQueue* q,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
                                         uint parallel_gc_threads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1078
  // Add region stealing tasks to the task queue.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1079
  static void enqueue_region_stealing_tasks(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
                                       GCTaskQueue* q,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
                                       ParallelTaskTerminator* terminator_ptr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
                                       uint parallel_gc_threads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
  // If objects are left in eden after a collection, try to move the boundary
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  // and absorb them into the old gen.  Returns true if eden was emptied.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
  static bool absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
                                         PSYoungGen* young_gen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
                                         PSOldGen* old_gen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  // Reset time since last full gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  static void reset_millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
42638
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
  1093
#ifndef PRODUCT
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
  1094
  // Print generic summary data
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
  1095
  static void print_generic_summary_data(ParallelCompactData& summary_data,
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
  1096
                                         HeapWord* const beg_addr,
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
  1097
                                         HeapWord* const end_addr);
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
  1098
#endif  // #ifndef PRODUCT
793e65ba88aa 8170468: Convert ParallelCompact_test to GTest
kzhaldyb
parents: 38170
diff changeset
  1099
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
 public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1101
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  PSParallelCompact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  static void invoke(bool maximum_heap_compaction);
11757
cdf6204b114a 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 11178
diff changeset
  1105
  static bool invoke_no_policy(bool maximum_heap_compaction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  static void post_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  // Perform initialization for PSParallelCompact that requires
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  // allocations.  This should be called during the VM initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
  // at a pointer where it would be appropriate to return a JNI_ENOMEM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  // in the event of a failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  static bool initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1114
  // Closure accessors
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1115
  static BoolObjectClosure* is_alive_closure()     { return (BoolObjectClosure*)&_is_alive_closure; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1116
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  // Public accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  static elapsedTimer* accumulated_time() { return &_accumulated_time; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  static unsigned int total_invocations() { return _total_invocations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  static CollectorCounters* counters()    { return _counters; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
  // Used to add tasks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
  static GCTaskManager* const gc_task_manager();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  // Marking support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  static inline bool mark_obj(oop obj);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1127
  static inline bool is_marked(oop obj);
30556
750fee2bdb45 8078345: Move PSParallelCompact::mark_and_push to ParCompactionManager
stefank
parents: 30555
diff changeset
  1128
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  1129
  template <class T> static inline void adjust_pointer(T* p, ParCompactionManager* cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  // Compaction support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  // Return true if p is in the range [beg_addr, end_addr).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  // Convenience wrappers for per-space data kept in _space_info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  static inline MutableSpace*     space(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  static inline HeapWord*         new_top(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  static inline HeapWord*         dense_prefix(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  static inline ObjectStartArray* start_array(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  // Move and update the live objects in the specified space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  static void move_and_update(ParCompactionManager* cm, SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1145
  // Process the end of the given region range in the dense prefix.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  // This includes saving any object not updated.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1147
  static void dense_prefix_regions_epilogue(ParCompactionManager* cm,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1148
                                            size_t region_start_index,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1149
                                            size_t region_end_index,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1150
                                            idx_t exiting_object_offset,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1151
                                            idx_t region_offset_start,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1152
                                            idx_t region_offset_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1154
  // Update a region in the dense prefix.  For each live object
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1155
  // in the region, update it's interior references.  For each
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
  // dead object, fill it with deadwood. Dead space at the end
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1157
  // of a region range will be filled to the start of the next
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1158
  // live object regardless of the region_index_end.  None of the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  // objects in the dense prefix move and dead space is dead
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  // (holds only dead objects that don't need any processing), so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  // dead space can be filled in any order.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  static void update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
                                                  SpaceId space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1164
                                                  size_t region_index_start,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1165
                                                  size_t region_index_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
  // Return the address of the count + 1st live word in the range [beg, end).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  static HeapWord* skip_live_words(HeapWord* beg, HeapWord* end, size_t count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  // Return the address of the word to be copied to dest_addr, which must be
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1171
  // aligned to a region boundary.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
  static HeapWord* first_src_addr(HeapWord* const dest_addr,
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1173
                                  SpaceId src_space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1174
                                  size_t src_region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1176
  // Determine the next source region, set closure.source() to the start of the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1177
  // new region return the region index.  Parameter end_addr is the address one
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  // beyond the end of source range just processed.  If necessary, switch to a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  // new source space and set src_space_id (in-out parameter) and src_space_top
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  // (out parameter) accordingly.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1181
  static size_t next_src_region(MoveAndUpdateClosure& closure,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1182
                                SpaceId& src_space_id,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1183
                                HeapWord*& src_space_top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1184
                                HeapWord* end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1186
  // Decrement the destination count for each non-empty source region in the
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1187
  // range [beg_region, region(region_align_up(end_addr))).  If the destination
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1188
  // count for a region goes to 0 and it needs to be filled, enqueue it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  static void decrement_destination_counts(ParCompactionManager* cm,
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1190
                                           SpaceId src_space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1191
                                           size_t beg_region,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
                                           HeapWord* end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1194
  // Fill a region, copying objects from one or more source regions.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1195
  static void fill_region(ParCompactionManager* cm, size_t region_idx);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1196
  static void fill_and_update_region(ParCompactionManager* cm, size_t region) {
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1197
    fill_region(cm, region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
  1200
  // Fill in the block table for the specified region.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
  1201
  static void fill_blocks(size_t region_idx);
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
  1202
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  // Update the deferred objects in the space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  static void update_deferred_objects(ParCompactionManager* cm, SpaceId id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  static ParMarkBitMap* mark_bitmap() { return &_mark_bitmap; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  static ParallelCompactData& summary_data() { return _summary_data; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  // Reference Processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  static ReferenceProcessor* const ref_processor() { return _ref_processor; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1212
  static STWGCTimer* gc_timer() { return &_gc_timer; }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1213
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  // Return the SpaceId for the given address.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  static SpaceId space_id(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  // Time since last full gc (in milliseconds).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
  static jlong millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
  1220
  static void print_on_error(outputStream* st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
  1221
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
  // Debugging support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  static const char* space_names[last_space_id];
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1225
  static void print_region_ranges();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
  static void print_dense_prefix_stats(const char* const algorithm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
                                       const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
                                       const bool maximum_compaction,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
                                       HeapWord* const addr);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1230
  static void summary_phase_msg(SpaceId dst_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1231
                                HeapWord* dst_beg, HeapWord* dst_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1232
                                SpaceId src_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1233
                                HeapWord* src_beg, HeapWord* src_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
#ifdef  ASSERT
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1237
  // Sanity check the new location of a word in the heap.
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1238
  static inline void check_new_location(HeapWord* old_addr, HeapWord* new_addr);
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1239
  // Verify that all the regions have been emptied.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
  static void verify_complete(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
class MoveAndUpdateClosure: public ParMarkBitMapClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
  inline MoveAndUpdateClosure(ParMarkBitMap* bitmap, ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
                              ObjectStartArray* start_array,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
                              HeapWord* destination, size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  // Accessors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
  HeapWord* destination() const         { return _destination; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  // If the object will fit (size <= words_remaining()), copy it to the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
  // destination, update the interior oops and the start array and return either
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  // full (if the closure is full) or incomplete.  If the object will not fit,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  // return would_overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  virtual IterationStatus do_addr(HeapWord* addr, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  // Copy enough words to fill this closure, starting at source().  Interior
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
  // oops and the start array are not updated.  Return full.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
  IterationStatus copy_until_full();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
  // Copy enough words to fill this closure or to the end of an object,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  // whichever is smaller, starting at source().  Interior oops and the start
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
  // array are not updated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
  void copy_partial_obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
  // Update variables to indicate that word_count words were processed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
  inline void update_state(size_t word_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
  ObjectStartArray* const _start_array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
  HeapWord*               _destination;         // Next addr to be written.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
MoveAndUpdateClosure::MoveAndUpdateClosure(ParMarkBitMap* bitmap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
                                           ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
                                           ObjectStartArray* start_array,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
                                           HeapWord* destination,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
                                           size_t words) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
  ParMarkBitMapClosure(bitmap, cm, words), _start_array(start_array)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
  _destination = destination;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
inline void MoveAndUpdateClosure::update_state(size_t words)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
  decrement_words_remaining(words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
  _source += words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
  _destination += words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
class UpdateOnlyClosure: public ParMarkBitMapClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  const PSParallelCompact::SpaceId _space_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  ObjectStartArray* const          _start_array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
  UpdateOnlyClosure(ParMarkBitMap* mbm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
                    ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
                    PSParallelCompact::SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
  // Update the object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
  virtual IterationStatus do_addr(HeapWord* addr, size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
  inline void do_addr(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1311
class FillClosure: public ParMarkBitMapClosure {
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1312
 public:
46502
116a09d8f142 8180755: Remove use of bitMap.inline.hpp include from instanceKlass.hpp and c1_ValueSet.hpp
tschatzl
parents: 42638
diff changeset
  1313
  FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1315
  virtual IterationStatus do_addr(HeapWord* addr, size_t size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1317
 private:
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1408
diff changeset
  1318
  ObjectStartArray* const _start_array;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5918
diff changeset
  1320
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
  1321
#endif // SHARE_VM_GC_PARALLEL_PSPARALLELCOMPACT_HPP