hotspot/src/share/vm/gc/parallel/psParallelCompact.hpp
author tschatzl
Thu, 28 Jan 2016 13:30:12 +0100
changeset 35877 a2a62511d0f8
parent 35862 411842d0c882
child 36581 8d65a7db1582
permissions -rw-r--r--
8146987: Improve Parallel GC Full GC by caching results of live_words_in_range() Summary: A large part of time in the parallel scavenge collector is spent finding out the amount of live words within memory ranges to find out where to move an object to. Try to incrementally calculate this value. Reviewed-by: tschatzl, mgerdin, jmasa Contributed-by: ray alex <sky1young@gmail.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
     2
 * Copyright (c) 2005, 2016, 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.
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   520
  DEBUG_ONLY(Atomic::inc_ptr(&_blocks_filled_count));
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");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  Atomic::add((int)dc_mask, (volatile int*)&_dc_and_los);
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");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  Atomic::add((int) words, (volatile int*) &_dc_and_los);
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) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    tmp = (HeapWord*)Atomic::cmpxchg_ptr(addr, &_highest_ref, tmp);
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
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  const int los = (int) live_obj_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  const int old = Atomic::cmpxchg(dc_claimed | los,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
                                  (volatile int*) &_dc_and_los, los);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  return old == los;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   602
inline ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   603
ParallelCompactData::region(size_t region_idx) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   605
  assert(region_idx <= region_count(), "bad arg");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   606
  return _region_data + region_idx;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
inline size_t
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   610
ParallelCompactData::region(const RegionData* const region_ptr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   612
  assert(region_ptr >= _region_data, "bad arg");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   613
  assert(region_ptr <= _region_data + region_count(), "bad arg");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   614
  return pointer_delta(region_ptr, _region_data, sizeof(RegionData));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   617
inline ParallelCompactData::BlockData*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   618
ParallelCompactData::block(size_t n) const {
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   619
  assert(n < block_count(), "bad arg");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   620
  return _block_data + n;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   621
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   622
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
inline size_t
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   624
ParallelCompactData::region_offset(const HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  assert(addr >= _region_start, "bad addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  assert(addr <= _region_end, "bad addr");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   628
  return (size_t(addr) & RegionAddrOffsetMask) >> LogHeapWordSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
inline size_t
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   632
ParallelCompactData::addr_to_region_idx(const HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  assert(addr >= _region_start, "bad addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  assert(addr <= _region_end, "bad addr");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   636
  return pointer_delta(addr, _region_start) >> Log2RegionSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   639
inline ParallelCompactData::RegionData*
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   640
ParallelCompactData::addr_to_region_ptr(const HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   642
  return region(addr_to_region_idx(addr));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   646
ParallelCompactData::region_to_addr(size_t region) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   648
  assert(region <= _region_count, "region out of range");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   649
  return _region_start + (region << Log2RegionSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   653
ParallelCompactData::region_to_addr(const RegionData* region) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   655
  return region_to_addr(pointer_delta(region, _region_data,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   656
                                      sizeof(RegionData)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   660
ParallelCompactData::region_to_addr(size_t region, size_t offset) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   662
  assert(region <= _region_count, "region out of range");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   663
  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
   664
  return region_to_addr(region) + offset;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   668
ParallelCompactData::region_align_down(HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  assert(addr >= _region_start, "bad addr");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   671
  assert(addr < _region_end + RegionSize, "bad addr");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   672
  return (HeapWord*)(size_t(addr) & RegionAddrMask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
inline HeapWord*
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   676
ParallelCompactData::region_align_up(HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  assert(addr >= _region_start, "bad addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  assert(addr <= _region_end, "bad addr");
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   680
  return region_align_down(addr + RegionSizeOffsetMask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
inline bool
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   684
ParallelCompactData::is_region_aligned(HeapWord* addr) const
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   686
  return region_offset(addr) == 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   689
inline size_t
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   690
ParallelCompactData::block_offset(const HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   691
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   692
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   693
  assert(addr <= _region_end, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   694
  return (size_t(addr) & BlockAddrOffsetMask) >> LogHeapWordSize;
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
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   697
inline size_t
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   698
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
   699
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   700
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   701
  assert(addr <= _region_end, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   702
  return pointer_delta(addr, _region_start) >> Log2BlockSize;
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
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   705
inline ParallelCompactData::BlockData*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   706
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
   707
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   708
  return block(addr_to_block_idx(addr));
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
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   711
inline HeapWord*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   712
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
   713
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   714
  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
   715
  return _region_start + (block << Log2BlockSize);
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
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   718
inline size_t
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   719
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
   720
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   721
  return region << Log2BlocksPerRegion;
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
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   724
inline HeapWord*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   725
ParallelCompactData::block_align_down(HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   726
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   727
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   728
  assert(addr < _region_end + RegionSize, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   729
  return (HeapWord*)(size_t(addr) & BlockAddrMask);
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
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   732
inline HeapWord*
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   733
ParallelCompactData::block_align_up(HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   734
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   735
  assert(addr >= _region_start, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   736
  assert(addr <= _region_end, "bad addr");
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   737
  return block_align_down(addr + BlockSizeOffsetMask);
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
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   740
inline bool
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   741
ParallelCompactData::is_block_aligned(HeapWord* addr) const
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   742
{
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   743
  return block_offset(addr) == 0;
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   744
}
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   745
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
// Abstract closure for use with ParMarkBitMap::iterate(), which will invoke the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
// do_addr() method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
// The closure is initialized with the number of heap words to process
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
// (words_remaining()), and becomes 'full' when it reaches 0.  The do_addr()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
// methods in subclasses should update the total as words are processed.  Since
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
// only one subclass actually uses this mechanism to terminate iteration, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
// default initial value is > 0.  The implementation is here and not in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
// single subclass that uses it to avoid making is_full() virtual, and thus
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
// adding a virtual call per live object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
class ParMarkBitMapClosure: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  typedef ParMarkBitMap::idx_t idx_t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  typedef ParMarkBitMap::IterationStatus IterationStatus;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
  inline ParMarkBitMapClosure(ParMarkBitMap* mbm, ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
                              size_t words = max_uintx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  inline ParCompactionManager* compaction_manager() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  inline ParMarkBitMap*        bitmap() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  inline size_t                words_remaining() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  inline bool                  is_full() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  inline HeapWord*             source() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  inline void                  set_source(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  virtual IterationStatus do_addr(HeapWord* addr, size_t words) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  inline void decrement_words_remaining(size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  ParMarkBitMap* const        _bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  ParCompactionManager* const _compaction_manager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  DEBUG_ONLY(const size_t     _initial_words_remaining;) // Useful in debugger.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  size_t                      _words_remaining; // Words left to copy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  HeapWord*                   _source;          // Next addr that would be read.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
ParMarkBitMapClosure::ParMarkBitMapClosure(ParMarkBitMap* bitmap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
                                           ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
                                           size_t words):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  _bitmap(bitmap), _compaction_manager(cm)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  , _initial_words_remaining(words)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  _words_remaining = words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  _source = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
inline ParCompactionManager* ParMarkBitMapClosure::compaction_manager() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  return _compaction_manager;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
inline ParMarkBitMap* ParMarkBitMapClosure::bitmap() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  return _bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
inline size_t ParMarkBitMapClosure::words_remaining() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  return _words_remaining;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
inline bool ParMarkBitMapClosure::is_full() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  return words_remaining() == 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
inline HeapWord* ParMarkBitMapClosure::source() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  return _source;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
inline void ParMarkBitMapClosure::set_source(HeapWord* addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  _source = addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
inline void ParMarkBitMapClosure::decrement_words_remaining(size_t words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  assert(_words_remaining >= words, "processed too many words");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  _words_remaining -= words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   831
// 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
   832
// 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
   833
// 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
   834
// 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
   835
// 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
   836
// 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
   837
// 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
   838
// 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
   839
// address) sliding compaction.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   840
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   841
// 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
   842
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   843
//      - marking phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   844
//      - summary phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   845
//      - compacting phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   846
//      - clean up phase
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   847
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   848
// 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
   849
//      - mark all the live objects
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   850
//      - 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
   851
//      - 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
   852
//      - 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
   853
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   854
// 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
   855
// 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
   856
// 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
   857
// PSParallelCompact::summary_phase().  The move and update phase is implemented
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   858
// in PSParallelCompact::compact().
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   859
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   860
// 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
   861
// 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
   862
// 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
   863
// 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
   864
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   865
// region            -----+---------------------+----------
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   866
// 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
   867
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   868
// 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
   869
// 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
   870
// 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
   871
// 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
   872
// 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
   873
// 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
   874
// 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
   875
// 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
   876
// 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
   877
// covered by a region.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   878
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   879
// 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
   880
// 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
   881
// 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
   882
// 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
   883
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   884
//      - 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
   885
//        entering the region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   886
//      - the location of the first live data on the region
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   887
//      - 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
   888
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   889
// See ParallelCompactData for precise details.  The summary phase also
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   890
// 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
   891
// 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
   892
// 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
   893
// summarize_dense_prefix().
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   894
//
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   895
// 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
   896
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   897
// 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
   898
// references in the object.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   899
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   900
// 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
   901
// 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
   902
// 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
   903
// 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
   904
// 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
   905
// clean up phase.  See the method PSParallelCompact::update_deferred_objects().
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   906
// 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
   907
//
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   908
// 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
   909
// 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
   910
// 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
   911
// 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
   912
// 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
   913
// 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
   914
// 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
   915
// 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
   916
// and removed from the ready list.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   917
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
class PSParallelCompact : AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  // Convenient access to type names.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  typedef ParMarkBitMap::idx_t idx_t;
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
   922
  typedef ParallelCompactData::RegionData RegionData;
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
   923
  typedef ParallelCompactData::BlockData BlockData;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  typedef enum {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   926
    old_space_id, eden_space_id,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
    from_space_id, to_space_id, last_space_id
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  } SpaceId;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
 public:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   931
  // Inline closure decls
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  class IsAliveClosure: public BoolObjectClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
   public:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   935
    virtual bool do_object_b(oop p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   938
  class AdjustPointerClosure: public ExtendedOopClosure {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
   public:
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   940
    AdjustPointerClosure(ParCompactionManager* cm) {
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   941
      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
   942
      _cm = cm;
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   943
    }
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   944
    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
   945
    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
   946
    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
   947
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 29792
diff changeset
   948
    // 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
   949
    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
   950
   private:
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   951
    ParCompactionManager* _cm;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   954
  class AdjustKlassClosure : public KlassClosure {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   955
   public:
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   956
    AdjustKlassClosure(ParCompactionManager* cm) {
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   957
      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
   958
      _cm = cm;
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   959
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   960
    void do_klass(Klass* klass);
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   961
   private:
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
   962
    ParCompactionManager* _cm;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   963
  };
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   964
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  friend class AdjustPointerClosure;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
   966
  friend class AdjustKlassClosure;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  friend class RefProcTaskProxy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
 private:
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   970
  static STWGCTimer           _gc_timer;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
   971
  static ParallelOldTracer    _gc_tracer;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  static elapsedTimer         _accumulated_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  static unsigned int         _total_invocations;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  static unsigned int         _maximum_compaction_gc_num;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  static jlong                _time_of_last_gc;   // ms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  static CollectorCounters*   _counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  static ParMarkBitMap        _mark_bitmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  static ParallelCompactData  _summary_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  static IsAliveClosure       _is_alive_closure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  static SpaceInfo            _space_info[last_space_id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  // Reference processing (used in ...follow_contents)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  static ReferenceProcessor*  _ref_processor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  // Values computed at initialization and used by dead_wood_limiter().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  static double _dwl_mean;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  static double _dwl_std_dev;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  static double _dwl_first_term;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  static double _dwl_adjustment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
#ifdef  ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  static bool   _dwl_initialized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 22551
diff changeset
   994
 public:
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 22551
diff changeset
   995
  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
   996
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  static void initialize_space_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  // Clear the marking bitmap and summary data that cover the specified space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  static void clear_data_covering_space(SpaceId id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33758
diff changeset
  1004
  static void pre_compact();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  static void post_compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  // Mark live objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  static void marking_phase(ParCompactionManager* cm,
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1009
                            bool maximum_heap_compaction,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1010
                            ParallelOldTracer *gc_tracer);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  // Compute the dense prefix for the designated space.  This is an experimental
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  // implementation currently not used in production.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  static HeapWord* compute_dense_prefix_via_density(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
                                                    bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  // Methods used to compute the dense prefix.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  // Compute the value of the normal distribution at x = density.  The mean and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  // standard deviation are values saved by initialize_dead_wood_limiter().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  static inline double normal_distribution(double density);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  // Initialize the static vars used by dead_wood_limiter().
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
  static void initialize_dead_wood_limiter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  // Return the percentage of space that can be treated as "dead wood" (i.e.,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  // not reclaimed).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  static double dead_wood_limiter(double density, size_t min_percent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1030
  // Find the first (left-most) region in the range [beg, end) that has at least
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  // 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
  1032
  // region in the space that is not completely live.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1033
  static RegionData* dead_wood_limit_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1034
                                            const RegionData* end,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1035
                                            size_t dead_words);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1037
  // Return a pointer to the first region in the range [beg, end) that is not
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  // completely full.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1039
  static RegionData* first_dead_space_region(const RegionData* beg,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1040
                                             const RegionData* end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  // Return a value indicating the benefit or 'yield' if the compacted region
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  // 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
  1044
  // candidate region.  Higher values are better.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  // The value is based on the amount of space reclaimed vs. the costs of (a)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  // updating references in the dense prefix plus (b) copying objects and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  // updating references in the compacted region.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1049
  static inline double reclaimed_ratio(const RegionData* const candidate,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
                                       HeapWord* const bottom,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
                                       HeapWord* const top,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
                                       HeapWord* const new_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
  // Compute the dense prefix for the designated space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  static HeapWord* compute_dense_prefix(const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
                                        bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1058
  // 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
  1059
  // 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
  1060
  static inline bool dead_space_crosses_boundary(const RegionData* region,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
                                                 idx_t bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  // Summary phase utility routine to fill dead space (if any) at the dense
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  // prefix boundary.  Should only be called if the the dense prefix is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  // non-empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  static void fill_dense_prefix_end(SpaceId id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1068
  // Clear the summary data source_region field for the specified addresses.
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1069
  static void clear_source_region(HeapWord* beg_addr, HeapWord* end_addr);
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1070
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  static void summarize_spaces_quick();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  static void summarize_space(SpaceId id, bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  static void summary_phase(ParCompactionManager* cm, bool maximum_compaction);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  // 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
  1076
  static void adjust_roots(ParCompactionManager* cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33758
diff changeset
  1078
  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
  1079
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  // Move objects to new locations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  static void compact_perm(ParCompactionManager* cm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  static void compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1084
  // Add available regions to the stack and draining tasks to the task queue.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1085
  static void enqueue_region_draining_tasks(GCTaskQueue* q,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1086
                                            uint parallel_gc_threads);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  // Add dense prefix update tasks to the task queue.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  static void enqueue_dense_prefix_tasks(GCTaskQueue* q,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
                                         uint parallel_gc_threads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1092
  // Add region stealing tasks to the task queue.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1093
  static void enqueue_region_stealing_tasks(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
                                       GCTaskQueue* q,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
                                       ParallelTaskTerminator* terminator_ptr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
                                       uint parallel_gc_threads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  // If objects are left in eden after a collection, try to move the boundary
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  // and absorb them into the old gen.  Returns true if eden was emptied.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
  static bool absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
                                         PSYoungGen* young_gen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
                                         PSOldGen* old_gen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  // Reset time since last full gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
  static void reset_millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
 public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1108
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  PSParallelCompact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  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
  1112
  static bool invoke_no_policy(bool maximum_heap_compaction);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  static void post_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  // Perform initialization for PSParallelCompact that requires
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  // allocations.  This should be called during the VM initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  // at a pointer where it would be appropriate to return a JNI_ENOMEM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  // in the event of a failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  static bool initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1121
  // Closure accessors
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1122
  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
  1123
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  // Public accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  static elapsedTimer* accumulated_time() { return &_accumulated_time; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  static unsigned int total_invocations() { return _total_invocations; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
  static CollectorCounters* counters()    { return _counters; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  // Used to add tasks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  static GCTaskManager* const gc_task_manager();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  // Marking support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  static inline bool mark_obj(oop obj);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1134
  static inline bool is_marked(oop obj);
30556
750fee2bdb45 8078345: Move PSParallelCompact::mark_and_push to ParCompactionManager
stefank
parents: 30555
diff changeset
  1135
35877
a2a62511d0f8 8146987: Improve Parallel GC Full GC by caching results of live_words_in_range()
tschatzl
parents: 35862
diff changeset
  1136
  template <class T> static inline void adjust_pointer(T* p, ParCompactionManager* cm);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  // Compaction support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  // Return true if p is in the range [beg_addr, end_addr).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  // Convenience wrappers for per-space data kept in _space_info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  static inline MutableSpace*     space(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  static inline HeapWord*         new_top(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  static inline HeapWord*         dense_prefix(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  static inline ObjectStartArray* start_array(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  // Move and update the live objects in the specified space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  static void move_and_update(ParCompactionManager* cm, SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1152
  // Process the end of the given region range in the dense prefix.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  // This includes saving any object not updated.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1154
  static void dense_prefix_regions_epilogue(ParCompactionManager* cm,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1155
                                            size_t region_start_index,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1156
                                            size_t region_end_index,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1157
                                            idx_t exiting_object_offset,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1158
                                            idx_t region_offset_start,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1159
                                            idx_t region_offset_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1161
  // 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
  1162
  // in the region, update it's interior references.  For each
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  // 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
  1164
  // 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
  1165
  // live object regardless of the region_index_end.  None of the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  // objects in the dense prefix move and dead space is dead
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
  // (holds only dead objects that don't need any processing), so
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  // dead space can be filled in any order.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  static void update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
                                                  SpaceId space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1171
                                                  size_t region_index_start,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1172
                                                  size_t region_index_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
  // Return the address of the count + 1st live word in the range [beg, end).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  static HeapWord* skip_live_words(HeapWord* beg, HeapWord* end, size_t count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  // 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
  1178
  // aligned to a region boundary.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  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
  1180
                                  SpaceId src_space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1181
                                  size_t src_region_idx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1183
  // 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
  1184
  // new region return the region index.  Parameter end_addr is the address one
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  // beyond the end of source range just processed.  If necessary, switch to a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  // new source space and set src_space_id (in-out parameter) and src_space_top
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  // (out parameter) accordingly.
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1188
  static size_t next_src_region(MoveAndUpdateClosure& closure,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1189
                                SpaceId& src_space_id,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1190
                                HeapWord*& src_space_top,
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1191
                                HeapWord* end_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1193
  // 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
  1194
  // 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
  1195
  // count for a region goes to 0 and it needs to be filled, enqueue it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  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
  1197
                                           SpaceId src_space_id,
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1198
                                           size_t beg_region,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
                                           HeapWord* end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1201
  // 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
  1202
  static void fill_region(ParCompactionManager* cm, size_t region_idx);
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1203
  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
  1204
    fill_region(cm, region);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
17851
04e698940f8a 6725714: par compact - add a table to speed up bitmap searches
jcoomes
parents: 17627
diff changeset
  1207
  // 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
  1208
  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
  1209
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  // Update the deferred objects in the space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
  static void update_deferred_objects(ParCompactionManager* cm, SpaceId id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
  static ParMarkBitMap* mark_bitmap() { return &_mark_bitmap; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  static ParallelCompactData& summary_data() { return _summary_data; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  // Reference Processing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  static ReferenceProcessor* const ref_processor() { return _ref_processor; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1219
  static STWGCTimer* gc_timer() { return &_gc_timer; }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17851
diff changeset
  1220
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  // Return the SpaceId for the given address.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
  static SpaceId space_id(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  // Time since last full gc (in milliseconds).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  static jlong millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
  1227
  static void print_on_error(outputStream* st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15088
diff changeset
  1228
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  // Debugging support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  static const char* space_names[last_space_id];
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1232
  static void print_region_ranges();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
  static void print_dense_prefix_stats(const char* const algorithm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
                                       const SpaceId id,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
                                       const bool maximum_compaction,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
                                       HeapWord* const addr);
1669
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1237
  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
  1238
                                HeapWord* dst_beg, HeapWord* dst_end,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1239
                                SpaceId src_space_id,
c921639400dd 6765745: par compact - allow young gen spaces to be split
jcoomes
parents: 1668
diff changeset
  1240
                                HeapWord* src_beg, HeapWord* src_end);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
#endif  // #ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
#ifdef  ASSERT
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1244
  // 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
  1245
  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
  1246
  // Verify that all the regions have been emptied.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
  static void verify_complete(SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
#endif  // #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1251
inline bool PSParallelCompact::is_marked(oop obj) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1252
  return mark_bitmap()->is_marked(obj);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1253
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1254
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1255
inline double PSParallelCompact::normal_distribution(double density) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  assert(_dwl_initialized, "uninitialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  const double squared_term = (density - _dwl_mean) / _dwl_std_dev;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
  return _dwl_first_term * exp(-0.5 * squared_term * squared_term);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
inline bool
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1262
PSParallelCompact::dead_space_crosses_boundary(const RegionData* region,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
                                               idx_t bit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
{
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1265
  assert(bit > 0, "cannot call this for the first bit/region");
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1266
  assert(_summary_data.region_to_addr(region) == _mark_bitmap.bit_to_addr(bit),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
         "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
  // Dead space crosses the boundary if (1) a partial object does not extend
1407
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1270
  // onto the region, (2) an object does not start at the beginning of the
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1271
  // region, and (3) an object does not end at the end of the prior region.
9006b01ba3fd 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 977
diff changeset
  1272
  return region->partial_obj_size() == 0 &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
    !_mark_bitmap.is_obj_beg(bit) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
    !_mark_bitmap.is_obj_end(bit - 1);
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 bool
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
PSParallelCompact::is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
  return p >= beg_addr && p < end_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
inline bool
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
PSParallelCompact::is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  return is_in((HeapWord*)p, beg_addr, end_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
inline MutableSpace* PSParallelCompact::space(SpaceId id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
  assert(id < last_space_id, "id out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
  return _space_info[id].space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
inline HeapWord* PSParallelCompact::new_top(SpaceId id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
  assert(id < last_space_id, "id out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  return _space_info[id].new_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
inline HeapWord* PSParallelCompact::dense_prefix(SpaceId id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  assert(id < last_space_id, "id out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  return _space_info[id].dense_prefix();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
inline ObjectStartArray* PSParallelCompact::start_array(SpaceId id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
  assert(id < last_space_id, "id out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
  return _space_info[id].start_array();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1307
#ifdef ASSERT
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1308
inline void
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1309
PSParallelCompact::check_new_location(HeapWord* old_addr, HeapWord* new_addr)
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1310
{
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1311
  assert(old_addr >= new_addr || space_id(old_addr) != space_id(new_addr),
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1312
         "must move left or to a different space");
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5076
diff changeset
  1313
  assert(is_object_aligned((intptr_t)old_addr) && is_object_aligned((intptr_t)new_addr),
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5076
diff changeset
  1314
         "checking alignment");
1682
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1315
}
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1316
#endif // ASSERT
94ad5692b3a7 6784849: par compact - can fail when to_space is non-empty
jcoomes
parents: 1670
diff changeset
  1317
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
class MoveAndUpdateClosure: public ParMarkBitMapClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
  inline MoveAndUpdateClosure(ParMarkBitMap* bitmap, ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
                              ObjectStartArray* start_array,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
                              HeapWord* destination, size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
  // Accessors.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
  HeapWord* destination() const         { return _destination; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
  // If the object will fit (size <= words_remaining()), copy it to the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  // destination, update the interior oops and the start array and return either
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  // full (if the closure is full) or incomplete.  If the object will not fit,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
  // return would_overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  virtual IterationStatus do_addr(HeapWord* addr, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  // Copy enough words to fill this closure, starting at source().  Interior
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
  // oops and the start array are not updated.  Return full.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  IterationStatus copy_until_full();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  // Copy enough words to fill this closure or to the end of an object,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
  // whichever is smaller, starting at source().  Interior oops and the start
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  // array are not updated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  void copy_partial_obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
  // Update variables to indicate that word_count words were processed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
  inline void update_state(size_t word_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  ObjectStartArray* const _start_array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
  HeapWord*               _destination;         // Next addr to be written.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
MoveAndUpdateClosure::MoveAndUpdateClosure(ParMarkBitMap* bitmap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
                                           ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
                                           ObjectStartArray* start_array,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
                                           HeapWord* destination,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
                                           size_t words) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
  ParMarkBitMapClosure(bitmap, cm, words), _start_array(start_array)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
  _destination = destination;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
inline void MoveAndUpdateClosure::update_state(size_t words)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  decrement_words_remaining(words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  _source += words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  _destination += words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
class UpdateOnlyClosure: public ParMarkBitMapClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
  const PSParallelCompact::SpaceId _space_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  ObjectStartArray* const          _start_array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
  UpdateOnlyClosure(ParMarkBitMap* mbm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
                    ParCompactionManager* cm,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
                    PSParallelCompact::SpaceId space_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  // Update the object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
  virtual IterationStatus do_addr(HeapWord* addr, size_t words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
  inline void do_addr(HeapWord* addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1385
class FillClosure: public ParMarkBitMapClosure {
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1386
 public:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1387
  FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id) :
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
    ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm),
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1408
diff changeset
  1389
    _start_array(PSParallelCompact::start_array(space_id))
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1408
diff changeset
  1390
  {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11757
diff changeset
  1391
    assert(space_id == PSParallelCompact::old_space_id,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
           "cannot use FillClosure in the young gen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1395
  virtual IterationStatus do_addr(HeapWord* addr, size_t size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35061
diff changeset
  1397
 private:
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1408
diff changeset
  1398
  ObjectStartArray* const _start_array;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5918
diff changeset
  1400
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30556
diff changeset
  1401
#endif // SHARE_VM_GC_PARALLEL_PSPARALLELCOMPACT_HPP