hotspot/src/share/vm/gc/parallel/psYoungGen.cpp
author tschatzl
Thu, 28 Jan 2016 13:30:12 +0100
changeset 35877 a2a62511d0f8
parent 35061 be6025ebffea
child 46565 8dcbf532ea00
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
/*
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
     2
 * Copyright (c) 2001, 2015, 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: 5402
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5402
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: 5402
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
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    26
#include "gc/parallel/mutableNUMASpace.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    27
#include "gc/parallel/parallelScavengeHeap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    28
#include "gc/parallel/psMarkSweepDecorator.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    29
#include "gc/parallel/psScavenge.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    30
#include "gc/parallel/psYoungGen.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    31
#include "gc/shared/gcUtil.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    32
#include "gc/shared/spaceDecorator.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
    33
#include "logging/log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "runtime/java.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
PSYoungGen::PSYoungGen(size_t        initial_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
                       size_t        min_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
                       size_t        max_size) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  _init_gen_size(initial_size),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  _min_gen_size(min_size),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  _max_gen_size(max_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
void PSYoungGen::initialize_virtual_space(ReservedSpace rs, size_t alignment) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  assert(_init_gen_size != 0, "Should have a finite size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  _virtual_space = new PSVirtualSpace(rs, alignment);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    48
  if (!virtual_space()->expand_by(_init_gen_size)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
    vm_exit_during_initialization("Could not reserve enough space for "
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
                                  "object heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
void PSYoungGen::initialize(ReservedSpace rs, size_t alignment) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  initialize_virtual_space(rs, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  initialize_work();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
void PSYoungGen::initialize_work() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    61
  _reserved = MemRegion((HeapWord*)virtual_space()->low_boundary(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    62
                        (HeapWord*)virtual_space()->high_boundary());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    63
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    64
  MemRegion cmr((HeapWord*)virtual_space()->low(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    65
                (HeapWord*)virtual_space()->high());
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
    66
  ParallelScavengeHeap::heap()->barrier_set()->resize_covered_region(cmr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    68
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    69
    // Mangle newly committed space immediately because it
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    70
    // can be done here more simply that after the new
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    71
    // spaces have been computed.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    72
    SpaceMangler::mangle_region(cmr);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
    73
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  if (UseNUMA) {
1911
b7cfe7eb809c 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 977
diff changeset
    76
    _eden_space = new MutableNUMASpace(virtual_space()->alignment());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  } else {
1911
b7cfe7eb809c 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 977
diff changeset
    78
    _eden_space = new MutableSpace(virtual_space()->alignment());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  }
1911
b7cfe7eb809c 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 977
diff changeset
    80
  _from_space = new MutableSpace(virtual_space()->alignment());
b7cfe7eb809c 6783381: NUMA allocator: don't pretouch eden space with UseNUMA
iveresov
parents: 977
diff changeset
    81
  _to_space   = new MutableSpace(virtual_space()->alignment());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  if (_eden_space == NULL || _from_space == NULL || _to_space == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    vm_exit_during_initialization("Could not allocate a young gen space");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // Allocate the mark sweep views of spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  _eden_mark_sweep =
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
      new PSMarkSweepDecorator(_eden_space, NULL, MarkSweepDeadRatio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  _from_mark_sweep =
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
      new PSMarkSweepDecorator(_from_space, NULL, MarkSweepDeadRatio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  _to_mark_sweep =
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
      new PSMarkSweepDecorator(_to_space, NULL, MarkSweepDeadRatio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  if (_eden_mark_sweep == NULL ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
      _from_mark_sweep == NULL ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
      _to_mark_sweep == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    vm_exit_during_initialization("Could not complete allocation"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
                                  " of the young generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // Generation Counters - generation 0, 3 subspaces
26324
6b9c12e15535 8028787: tmtools/jstat/gcoldcapacity/jstat_gcoldcapacity02 fails nsk.share.Failure: OGC < OGCMN in RT_Baseline
sjohanss
parents: 24424
diff changeset
   103
  _gen_counters = new PSGenerationCounters("new", 0, 3, _min_gen_size,
6b9c12e15535 8028787: tmtools/jstat/gcoldcapacity/jstat_gcoldcapacity02 fails nsk.share.Failure: OGC < OGCMN in RT_Baseline
sjohanss
parents: 24424
diff changeset
   104
                                           _max_gen_size, _virtual_space);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // Compute maximum space sizes for performance counters
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
   107
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 15095
diff changeset
   108
  size_t alignment = heap->space_alignment();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   109
  size_t size = virtual_space()->reserved_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  size_t max_survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  size_t max_eden_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  if (UseAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    max_survivor_size = size / MinSurvivorRatio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    // round the survivor space size down to the nearest alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    // and make sure its size is greater than 0.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    max_survivor_size = align_size_down(max_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    max_survivor_size = MAX2(max_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    // set the maximum size of eden to be the size of the young gen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    // less two times the minimum survivor size. The minimum survivor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    // size for UseAdaptiveSizePolicy is one alignment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    max_eden_size = size - 2 * alignment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    max_survivor_size = size / InitialSurvivorRatio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    // round the survivor space size down to the nearest alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    // and make sure its size is greater than 0.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    max_survivor_size = align_size_down(max_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    max_survivor_size = MAX2(max_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    // set the maximum size of eden to be the size of the young gen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    // less two times the survivor size when the generation is 100%
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    // committed. The minimum survivor size for -UseAdaptiveSizePolicy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    // is dependent on the committed portion (current capacity) of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    // generation - the less space committed, the smaller the survivor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    // space, possibly as small as an alignment. However, we are interested
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    // in the case where the young generation is 100% committed, as this
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   141
    // is the point where eden reaches its maximum size. At this point,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    // the size of a survivor space is max_survivor_size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    max_eden_size = size - 2 * max_survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  _eden_counters = new SpaceCounters("eden", 0, max_eden_size, _eden_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
                                     _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  _from_counters = new SpaceCounters("s0", 1, max_survivor_size, _from_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
                                     _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  _to_counters = new SpaceCounters("s1", 2, max_survivor_size, _to_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
                                   _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  compute_initial_space_boundaries();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
void PSYoungGen::compute_initial_space_boundaries() {
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
   157
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // Compute sizes
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 15095
diff changeset
   160
  size_t alignment = heap->space_alignment();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   161
  size_t size = virtual_space()->committed_size();
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 15095
diff changeset
   162
  assert(size >= 3 * alignment, "Young space is not large enough for eden + 2 survivors");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  size_t survivor_size = size / InitialSurvivorRatio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  survivor_size = align_size_down(survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // ... but never less than an alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  survivor_size = MAX2(survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // Young generation is eden + 2 survivor spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  size_t eden_size = size - (2 * survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  // Now go ahead and set 'em.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  set_space_boundaries(eden_size, survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  space_invariants();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    _eden_counters->update_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    _from_counters->update_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    _to_counters->update_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
void PSYoungGen::set_space_boundaries(size_t eden_size, size_t survivor_size) {
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   184
  assert(eden_size < virtual_space()->committed_size(), "just checking");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  assert(eden_size > 0  && survivor_size > 0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // Initial layout is Eden, to, from. After swapping survivor spaces,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // that leaves us with Eden, from, to, which is step one in our two
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // step resize-with-live-data procedure.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   190
  char *eden_start = virtual_space()->low();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  char *to_start   = eden_start + eden_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  char *from_start = to_start   + survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  char *from_end   = from_start + survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   195
  assert(from_end == virtual_space()->high(), "just checking");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  assert(is_object_aligned((intptr_t)eden_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  assert(is_object_aligned((intptr_t)to_start),   "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  assert(is_object_aligned((intptr_t)from_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  MemRegion eden_mr((HeapWord*)eden_start, (HeapWord*)to_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  MemRegion to_mr  ((HeapWord*)to_start, (HeapWord*)from_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  MemRegion from_mr((HeapWord*)from_start, (HeapWord*)from_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   204
  eden_space()->initialize(eden_mr, true, ZapUnusedHeapArea);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   205
    to_space()->initialize(to_mr  , true, ZapUnusedHeapArea);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   206
  from_space()->initialize(from_mr, true, ZapUnusedHeapArea);
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
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
void PSYoungGen::space_invariants() {
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
   211
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 15095
diff changeset
   212
  const size_t alignment = heap->space_alignment();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // Currently, our eden size cannot shrink to zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  guarantee(eden_space()->capacity_in_bytes() >= alignment, "eden too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  guarantee(from_space()->capacity_in_bytes() >= alignment, "from too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  guarantee(to_space()->capacity_in_bytes() >= alignment, "to too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  // Relationship of spaces to each other
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  char* eden_start = (char*)eden_space()->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  char* eden_end   = (char*)eden_space()->end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  char* from_start = (char*)from_space()->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  char* from_end   = (char*)from_space()->end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  char* to_start   = (char*)to_space()->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  char* to_end     = (char*)to_space()->end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   227
  guarantee(eden_start >= virtual_space()->low(), "eden bottom");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  guarantee(eden_start < eden_end, "eden space consistency");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  guarantee(from_start < from_end, "from space consistency");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  guarantee(to_start < to_end, "to space consistency");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // Check whether from space is below to space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  if (from_start < to_start) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    // Eden, from, to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    guarantee(eden_end <= from_start, "eden/from boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    guarantee(from_end <= to_start,   "from/to boundary");
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   237
    guarantee(to_end <= virtual_space()->high(), "to end");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    // Eden, to, from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    guarantee(eden_end <= to_start, "eden/to boundary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    guarantee(to_end <= from_start, "to/from boundary");
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   242
    guarantee(from_end <= virtual_space()->high(), "from end");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // More checks that the virtual space is consistent with the spaces
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   246
  assert(virtual_space()->committed_size() >=
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    (eden_space()->capacity_in_bytes() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
     to_space()->capacity_in_bytes() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
     from_space()->capacity_in_bytes()), "Committed size is inconsistent");
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   250
  assert(virtual_space()->committed_size() <= virtual_space()->reserved_size(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    "Space invariant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  char* eden_top = (char*)eden_space()->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  char* from_top = (char*)from_space()->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  char* to_top = (char*)to_space()->top();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   255
  assert(eden_top <= virtual_space()->high(), "eden top");
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   256
  assert(from_top <= virtual_space()->high(), "from top");
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   257
  assert(to_top <= virtual_space()->high(), "to top");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   259
  virtual_space()->verify();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
void PSYoungGen::resize(size_t eden_size, size_t survivor_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  // Resize the generation if needed. If the generation resize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  // reports false, do not attempt to resize the spaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  if (resize_generation(eden_size, survivor_size)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    // Then we lay out the spaces inside the generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    resize_spaces(eden_size, survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    space_invariants();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   272
    log_trace(gc, ergo)("Young generation size: "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   273
                        "desired eden: " SIZE_FORMAT " survivor: " SIZE_FORMAT
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   274
                        " used: " SIZE_FORMAT " capacity: " SIZE_FORMAT
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   275
                        " gen limits: " SIZE_FORMAT " / " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   276
                        eden_size, survivor_size, used_in_bytes(), capacity_in_bytes(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   277
                        _max_gen_size, min_gen_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
bool PSYoungGen::resize_generation(size_t eden_size, size_t survivor_size) {
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   283
  const size_t alignment = virtual_space()->alignment();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   284
  size_t orig_size = virtual_space()->committed_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  bool size_changed = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // There used to be this guarantee there.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  // guarantee ((eden_size + 2*survivor_size)  <= _max_gen_size, "incorrect input arguments");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  // Code below forces this requirement.  In addition the desired eden
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   290
  // size and desired survivor sizes are desired goals and may
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // exceed the total generation size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  assert(min_gen_size() <= orig_size && orig_size <= max_size(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // Adjust new generation size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  const size_t eden_plus_survivors =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
          align_size_up(eden_size + 2 * survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  size_t desired_size = MAX2(MIN2(eden_plus_survivors, max_size()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
                             min_gen_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  assert(desired_size <= max_size(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  if (desired_size > orig_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    // Grow the generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    size_t change = desired_size - orig_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    assert(change % alignment == 0, "just checking");
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   306
    HeapWord* prev_high = (HeapWord*) virtual_space()->high();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   307
    if (!virtual_space()->expand_by(change)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
      return false; // Error if we fail to resize!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    }
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   310
    if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   311
      // Mangle newly committed space immediately because it
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   312
      // can be done here more simply that after the new
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   313
      // spaces have been computed.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   314
      HeapWord* new_high = (HeapWord*) virtual_space()->high();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   315
      MemRegion mangle_region(prev_high, new_high);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   316
      SpaceMangler::mangle_region(mangle_region);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   317
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
    size_changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  } else if (desired_size < orig_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
    size_t desired_change = orig_size - desired_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    assert(desired_change % alignment == 0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    desired_change = limit_gen_shrink(desired_change);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    if (desired_change > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
      virtual_space()->shrink_by(desired_change);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
      reset_survivors_after_shrink();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
      size_changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  } else {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   332
    if (orig_size == gen_size_limit()) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   333
      log_trace(gc)("PSYoung generation size at maximum: " SIZE_FORMAT "K", orig_size/K);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   334
    } else if (orig_size == min_gen_size()) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   335
      log_trace(gc)("PSYoung generation size at minium: " SIZE_FORMAT "K", orig_size/K);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  if (size_changed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    post_resize();
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   341
    log_trace(gc)("PSYoung generation size changed: " SIZE_FORMAT "K->" SIZE_FORMAT "K",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   342
                  orig_size/K, virtual_space()->committed_size()/K);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   345
  guarantee(eden_plus_survivors <= virtual_space()->committed_size() ||
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   346
            virtual_space()->committed_size() == max_size(), "Sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   351
#ifndef PRODUCT
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   352
// In the numa case eden is not mangled so a survivor space
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   353
// moving into a region previously occupied by a survivor
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   354
// may find an unmangled region.  Also in the PS case eden
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   355
// to-space and from-space may not touch (i.e., there may be
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   356
// gaps between them due to movement while resizing the
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   357
// spaces).  Those gaps must be mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   358
void PSYoungGen::mangle_survivors(MutableSpace* s1,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   359
                                  MemRegion s1MR,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   360
                                  MutableSpace* s2,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   361
                                  MemRegion s2MR) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   362
  // Check eden and gap between eden and from-space, in deciding
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   363
  // what to mangle in from-space.  Check the gap between from-space
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   364
  // and to-space when deciding what to mangle.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   365
  //
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   366
  //      +--------+   +----+    +---+
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   367
  //      | eden   |   |s1  |    |s2 |
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   368
  //      +--------+   +----+    +---+
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   369
  //                 +-------+ +-----+
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   370
  //                 |s1MR   | |s2MR |
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   371
  //                 +-------+ +-----+
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   372
  // All of survivor-space is properly mangled so find the
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   373
  // upper bound on the mangling for any portion above current s1.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   374
  HeapWord* delta_end = MIN2(s1->bottom(), s1MR.end());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   375
  MemRegion delta1_left;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   376
  if (s1MR.start() < delta_end) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   377
    delta1_left = MemRegion(s1MR.start(), delta_end);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   378
    s1->mangle_region(delta1_left);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   379
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   380
  // Find any portion to the right of the current s1.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   381
  HeapWord* delta_start = MAX2(s1->end(), s1MR.start());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   382
  MemRegion delta1_right;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   383
  if (delta_start < s1MR.end()) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   384
    delta1_right = MemRegion(delta_start, s1MR.end());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   385
    s1->mangle_region(delta1_right);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   386
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   387
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   388
  // Similarly for the second survivor space except that
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   389
  // any of the new region that overlaps with the current
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   390
  // region of the first survivor space has already been
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   391
  // mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   392
  delta_end = MIN2(s2->bottom(), s2MR.end());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   393
  delta_start = MAX2(s2MR.start(), s1->end());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   394
  MemRegion delta2_left;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   395
  if (s2MR.start() < delta_end) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   396
    delta2_left = MemRegion(s2MR.start(), delta_end);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   397
    s2->mangle_region(delta2_left);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   398
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   399
  delta_start = MAX2(s2->end(), s2MR.start());
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   400
  MemRegion delta2_right;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   401
  if (delta_start < s2MR.end()) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   402
    s2->mangle_region(delta2_right);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   403
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   404
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   405
  // s1
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   406
  log_develop_trace(gc)("Current region: [" PTR_FORMAT ", " PTR_FORMAT ") "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   407
    "New region: [" PTR_FORMAT ", " PTR_FORMAT ")",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   408
    p2i(s1->bottom()), p2i(s1->end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   409
    p2i(s1MR.start()), p2i(s1MR.end()));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   410
  log_develop_trace(gc)("    Mangle before: [" PTR_FORMAT ", "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   411
    PTR_FORMAT ")  Mangle after: [" PTR_FORMAT ", " PTR_FORMAT ")",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   412
    p2i(delta1_left.start()), p2i(delta1_left.end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   413
    p2i(delta1_right.start()), p2i(delta1_right.end()));
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   414
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   415
  // s2
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   416
  log_develop_trace(gc)("Current region: [" PTR_FORMAT ", " PTR_FORMAT ") "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   417
    "New region: [" PTR_FORMAT ", " PTR_FORMAT ")",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   418
    p2i(s2->bottom()), p2i(s2->end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   419
    p2i(s2MR.start()), p2i(s2MR.end()));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   420
  log_develop_trace(gc)("    Mangle before: [" PTR_FORMAT ", "
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   421
    PTR_FORMAT ")  Mangle after: [" PTR_FORMAT ", " PTR_FORMAT ")",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   422
    p2i(delta2_left.start()), p2i(delta2_left.end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   423
    p2i(delta2_right.start()), p2i(delta2_right.end()));
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   424
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   425
#endif // NOT PRODUCT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
void PSYoungGen::resize_spaces(size_t requested_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
                               size_t requested_survivor_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  assert(UseAdaptiveSizePolicy, "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  assert(requested_eden_size > 0  && requested_survivor_size > 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
         "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // We require eden and to space to be empty
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  if ((!eden_space()->is_empty()) || (!to_space()->is_empty())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   438
  log_trace(gc, ergo)("PSYoungGen::resize_spaces(requested_eden_size: " SIZE_FORMAT ", requested_survivor_size: " SIZE_FORMAT ")",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   439
                      requested_eden_size, requested_survivor_size);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   440
  log_trace(gc, ergo)("    eden: [" PTR_FORMAT ".." PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   441
                      p2i(eden_space()->bottom()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   442
                      p2i(eden_space()->end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   443
                      pointer_delta(eden_space()->end(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   444
                                    eden_space()->bottom(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   445
                                    sizeof(char)));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   446
  log_trace(gc, ergo)("    from: [" PTR_FORMAT ".." PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   447
                      p2i(from_space()->bottom()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   448
                      p2i(from_space()->end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   449
                      pointer_delta(from_space()->end(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   450
                                    from_space()->bottom(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   451
                                    sizeof(char)));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   452
  log_trace(gc, ergo)("      to: [" PTR_FORMAT ".." PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   453
                      p2i(to_space()->bottom()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   454
                      p2i(to_space()->end()),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   455
                      pointer_delta(  to_space()->end(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   456
                                      to_space()->bottom(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   457
                                      sizeof(char)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  // There's nothing to do if the new sizes are the same as the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  if (requested_survivor_size == to_space()->capacity_in_bytes() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
      requested_survivor_size == from_space()->capacity_in_bytes() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
      requested_eden_size == eden_space()->capacity_in_bytes()) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   463
    log_trace(gc, ergo)("    capacities are the right sizes, returning");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  char* eden_start = (char*)eden_space()->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  char* eden_end   = (char*)eden_space()->end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  char* from_start = (char*)from_space()->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  char* from_end   = (char*)from_space()->end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  char* to_start   = (char*)to_space()->bottom();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  char* to_end     = (char*)to_space()->end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
   474
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 15095
diff changeset
   475
  const size_t alignment = heap->space_alignment();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  const bool maintain_minimum =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
    (requested_eden_size + 2 * requested_survivor_size) <= min_gen_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   479
  bool eden_from_to_order = from_start < to_start;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  // Check whether from space is below to space
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   481
  if (eden_from_to_order) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    // Eden, from, to
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   483
    eden_from_to_order = true;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   484
    log_trace(gc, ergo)("  Eden, from, to:");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
    // Set eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
    // "requested_eden_size" is a goal for the size of eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
    // and may not be attainable.  "eden_size" below is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
    // calculated based on the location of from-space and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    // the goal for the size of eden.  from-space is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
    // fixed in place because it contains live data.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    // The calculation is done this way to avoid 32bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    // overflow (i.e., eden_start + requested_eden_size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
    // may too large for representation in 32bits).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
    size_t eden_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    if (maintain_minimum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
      // Only make eden larger than the requested size if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
      // the minimum size of the generation has to be maintained.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
      // This could be done in general but policy at a higher
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
      // level is determining a requested size for eden and that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
      // should be honored unless there is a fundamental reason.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
      eden_size = pointer_delta(from_start,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
                                eden_start,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
                                sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
      eden_size = MIN2(requested_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
                       pointer_delta(from_start, eden_start, sizeof(char)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
    eden_end = eden_start + eden_size;
5402
c51fd0c1d005 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 2105
diff changeset
   511
    assert(eden_end >= eden_start, "addition overflowed");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
    // To may resize into from space as long as it is clear of live data.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    // From space must remain page aligned, though, so we need to do some
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    // extra calculations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
    // First calculate an optimal to-space
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   518
    to_end   = (char*)virtual_space()->high();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
    to_start = (char*)pointer_delta(to_end, (char*)requested_survivor_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
                                    sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
    // Does the optimal to-space overlap from-space?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    if (to_start < (char*)from_space()->end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
      // Calculate the minimum offset possible for from_end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
      size_t from_size = pointer_delta(from_space()->top(), from_start, sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
      // Should we be in this method if from_space is empty? Why not the set_space method? FIX ME!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      if (from_size == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
        from_size = alignment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
        from_size = align_size_up(from_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
      from_end = from_start + from_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
      assert(from_end > from_start, "addition overflow or from_size problem");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
      guarantee(from_end <= (char*)from_space()->end(), "from_end moved to the right");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
      // Now update to_start with the new from_end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
      to_start = MAX2(from_end, to_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
    guarantee(to_start != to_end, "to space is zero sized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   545
    log_trace(gc, ergo)("    [eden_start .. eden_end): [" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   546
                        p2i(eden_start),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   547
                        p2i(eden_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   548
                        pointer_delta(eden_end, eden_start, sizeof(char)));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   549
    log_trace(gc, ergo)("    [from_start .. from_end): [" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   550
                        p2i(from_start),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   551
                        p2i(from_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   552
                        pointer_delta(from_end, from_start, sizeof(char)));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   553
    log_trace(gc, ergo)("    [  to_start ..   to_end): [" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   554
                        p2i(to_start),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   555
                        p2i(to_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   556
                        pointer_delta(  to_end,   to_start, sizeof(char)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    // Eden, to, from
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   559
    log_trace(gc, ergo)("  Eden, to, from:");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    // To space gets priority over eden resizing. Note that we position
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    // to space as if we were able to resize from space, even though from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    // space is not modified.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    // Giving eden priority was tried and gave poorer performance.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   565
    to_end   = (char*)pointer_delta(virtual_space()->high(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
                                    (char*)requested_survivor_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
                                    sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    to_end   = MIN2(to_end, from_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    to_start = (char*)pointer_delta(to_end, (char*)requested_survivor_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
                                    sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
    // if the space sizes are to be increased by several times then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
    // 'to_start' will point beyond the young generation. In this case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
    // 'to_start' should be adjusted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
    to_start = MAX2(to_start, eden_start + alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    // Compute how big eden can be, then adjust end.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
    // See  comments above on calculating eden_end.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    size_t eden_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    if (maintain_minimum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
      eden_size = pointer_delta(to_start, eden_start, sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
      eden_size = MIN2(requested_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
                       pointer_delta(to_start, eden_start, sizeof(char)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    eden_end = eden_start + eden_size;
5402
c51fd0c1d005 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 2105
diff changeset
   586
    assert(eden_end >= eden_start, "addition overflowed");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    // Could choose to not let eden shrink
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    // to_start = MAX2(to_start, eden_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
    // Don't let eden shrink down to 0 or less.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    eden_end = MAX2(eden_end, eden_start + alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
    to_start = MAX2(to_start, eden_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   595
    log_trace(gc, ergo)("    [eden_start .. eden_end): [" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   596
                        p2i(eden_start),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   597
                        p2i(eden_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   598
                        pointer_delta(eden_end, eden_start, sizeof(char)));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   599
    log_trace(gc, ergo)("    [  to_start ..   to_end): [" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   600
                        p2i(to_start),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   601
                        p2i(to_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   602
                        pointer_delta(  to_end,   to_start, sizeof(char)));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   603
    log_trace(gc, ergo)("    [from_start .. from_end): [" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   604
                        p2i(from_start),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   605
                        p2i(from_end),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   606
                        pointer_delta(from_end, from_start, sizeof(char)));
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  guarantee((HeapWord*)from_start <= from_space()->bottom(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
            "from start moved to the right");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  guarantee((HeapWord*)from_end >= from_space()->top(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
            "from end moved into live data");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  assert(is_object_aligned((intptr_t)eden_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  assert(is_object_aligned((intptr_t)from_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  assert(is_object_aligned((intptr_t)to_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)eden_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  MemRegion toMR  ((HeapWord*)to_start,   (HeapWord*)to_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  MemRegion fromMR((HeapWord*)from_start, (HeapWord*)from_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  // Let's make sure the call to initialize doesn't reset "top"!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  HeapWord* old_from_top = from_space()->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   625
  // For logging block  below
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  size_t old_from = from_space()->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  size_t old_to   = to_space()->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   629
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   630
    // NUMA is a special case because a numa space is not mangled
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   631
    // in order to not prematurely bind its address to memory to
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   632
    // the wrong memory (i.e., don't want the GC thread to first
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   633
    // touch the memory).  The survivor spaces are not numa
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   634
    // spaces and are mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   635
    if (UseNUMA) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   636
      if (eden_from_to_order) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   637
        mangle_survivors(from_space(), fromMR, to_space(), toMR);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   638
      } else {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   639
        mangle_survivors(to_space(), toMR, from_space(), fromMR);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   640
      }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   641
    }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   642
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   643
    // If not mangling the spaces, do some checking to verify that
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   644
    // the spaces are already mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   645
    // The spaces should be correctly mangled at this point so
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   646
    // do some checking here. Note that they are not being mangled
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   647
    // in the calls to initialize().
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   648
    // Must check mangling before the spaces are reshaped.  Otherwise,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   649
    // the bottom or end of one space may have moved into an area
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   650
    // covered by another space and a failure of the check may
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   651
    // not correctly indicate which space is not properly mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   652
    HeapWord* limit = (HeapWord*) virtual_space()->high();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   653
    eden_space()->check_mangled_unused_area(limit);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   654
    from_space()->check_mangled_unused_area(limit);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   655
      to_space()->check_mangled_unused_area(limit);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   656
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   657
  // When an existing space is being initialized, it is not
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   658
  // mangled because the space has been previously mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   659
  eden_space()->initialize(edenMR,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   660
                           SpaceDecorator::Clear,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   661
                           SpaceDecorator::DontMangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   662
    to_space()->initialize(toMR,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   663
                           SpaceDecorator::Clear,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   664
                           SpaceDecorator::DontMangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   665
  from_space()->initialize(fromMR,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   666
                           SpaceDecorator::DontClear,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   667
                           SpaceDecorator::DontMangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  assert(from_space()->top() == old_from_top, "from top changed!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   671
  log_trace(gc, ergo)("AdaptiveSizePolicy::survivor space sizes: collection: %d (" SIZE_FORMAT ", " SIZE_FORMAT ") -> (" SIZE_FORMAT ", " SIZE_FORMAT ") ",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   672
                      ParallelScavengeHeap::heap()->total_collections(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   673
                      old_from, old_to,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   674
                      from_space()->capacity_in_bytes(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   675
                      to_space()->capacity_in_bytes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
void PSYoungGen::swap_spaces() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  MutableSpace* s    = from_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  _from_space        = to_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  _to_space          = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  // Now update the decorators.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  PSMarkSweepDecorator* md = from_mark_sweep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  _from_mark_sweep           = to_mark_sweep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  _to_mark_sweep             = md;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  assert(from_mark_sweep()->space() == from_space(), "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
  assert(to_mark_sweep()->space() == to_space(), "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
size_t PSYoungGen::capacity_in_bytes() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  return eden_space()->capacity_in_bytes()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
       + from_space()->capacity_in_bytes();  // to_space() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
size_t PSYoungGen::used_in_bytes() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  return eden_space()->used_in_bytes()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
       + from_space()->used_in_bytes();      // to_space() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
size_t PSYoungGen::free_in_bytes() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
  return eden_space()->free_in_bytes()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
       + from_space()->free_in_bytes();      // to_space() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
size_t PSYoungGen::capacity_in_words() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  return eden_space()->capacity_in_words()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
       + from_space()->capacity_in_words();  // to_space() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
size_t PSYoungGen::used_in_words() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  return eden_space()->used_in_words()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
       + from_space()->used_in_words();      // to_space() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
size_t PSYoungGen::free_in_words() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  return eden_space()->free_in_words()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
       + from_space()->free_in_words();      // to_space() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
void PSYoungGen::object_iterate(ObjectClosure* blk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  eden_space()->object_iterate(blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  from_space()->object_iterate(blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  to_space()->object_iterate(blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
void PSYoungGen::precompact() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  eden_mark_sweep()->precompact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  from_mark_sweep()->precompact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  to_mark_sweep()->precompact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
void PSYoungGen::adjust_pointers() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  eden_mark_sweep()->adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  from_mark_sweep()->adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  to_mark_sweep()->adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
void PSYoungGen::compact() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  eden_mark_sweep()->compact(ZapUnusedHeapArea);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  from_mark_sweep()->compact(ZapUnusedHeapArea);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  // Mark sweep stores preserved markOops in to space, don't disturb!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  to_mark_sweep()->compact(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
void PSYoungGen::print() const { print_on(tty); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
void PSYoungGen::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  st->print(" %-15s", "PSYoungGen");
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   754
  st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   755
             capacity_in_bytes()/K, used_in_bytes()/K);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   756
  virtual_space()->print_space_boundaries_on(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  st->print("  eden"); eden_space()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  st->print("  from"); from_space()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  st->print("  to  "); to_space()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
15095
8ce5dcdbeb26 8005672: Clean up some changes to GC logging with GCCause's
jmasa
parents: 12379
diff changeset
   762
// Note that a space is not printed before the [NAME:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
void PSYoungGen::print_used_change(size_t prev_used) const {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   764
  log_info(gc, heap)("%s: "  SIZE_FORMAT "K->" SIZE_FORMAT "K("  SIZE_FORMAT "K)",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   765
      name(), prev_used / K, used_in_bytes() / K, capacity_in_bytes() / K);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
size_t PSYoungGen::available_for_expansion() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
size_t PSYoungGen::available_for_contraction() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
size_t PSYoungGen::available_to_min_gen() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  assert(virtual_space()->committed_size() >= min_gen_size(), "Invariant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  return virtual_space()->committed_size() - min_gen_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
// This method assumes that from-space has live data and that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
// any shrinkage of the young gen is limited by location of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
// from-space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
size_t PSYoungGen::available_to_live() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  size_t delta_in_survivor = 0;
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
   788
  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 15095
diff changeset
   789
  const size_t space_alignment = heap->space_alignment();
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 15095
diff changeset
   790
  const size_t gen_alignment = heap->generation_alignment();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  MutableSpace* space_shrinking = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  if (from_space()->end() > to_space()->end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    space_shrinking = from_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
    space_shrinking = to_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  // Include any space that is committed but not included in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  // the survivor spaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  assert(((HeapWord*)virtual_space()->high()) >= space_shrinking->end(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
    "Survivor space beyond high end");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  size_t unused_committed = pointer_delta(virtual_space()->high(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
    space_shrinking->end(), sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  if (space_shrinking->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    // Don't let the space shrink to 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
    assert(space_shrinking->capacity_in_bytes() >= space_alignment,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
      "Space is too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
    delta_in_survivor = space_shrinking->capacity_in_bytes() - space_alignment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
    delta_in_survivor = pointer_delta(space_shrinking->end(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
                                      space_shrinking->top(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
                                      sizeof(char));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  size_t delta_in_bytes = unused_committed + delta_in_survivor;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  delta_in_bytes = align_size_down(delta_in_bytes, gen_alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  return delta_in_bytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
// Return the number of bytes available for resizing down the young
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
// generation.  This is the minimum of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
//      input "bytes"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
//      bytes to the minimum young gen size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
//      bytes to the size currently being used + some small extra
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
size_t PSYoungGen::limit_gen_shrink(size_t bytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  // Allow shrinkage into the current eden but keep eden large enough
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  // to maintain the minimum young gen size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  bytes = MIN3(bytes, available_to_min_gen(), available_to_live());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  return align_size_down(bytes, virtual_space()->alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
void PSYoungGen::reset_after_change() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
void PSYoungGen::reset_survivors_after_shrink() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  _reserved = MemRegion((HeapWord*)virtual_space()->low_boundary(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
                        (HeapWord*)virtual_space()->high_boundary());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  PSScavenge::reference_processor()->set_span(_reserved);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  MutableSpace* space_shrinking = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  if (from_space()->end() > to_space()->end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
    space_shrinking = from_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
    space_shrinking = to_space();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  HeapWord* new_end = (HeapWord*)virtual_space()->high();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  assert(new_end >= space_shrinking->bottom(), "Shrink was too large");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  // Was there a shrink of the survivor space?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  if (new_end < space_shrinking->end()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
    MemRegion mr(space_shrinking->bottom(), new_end);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   855
    space_shrinking->initialize(mr,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   856
                                SpaceDecorator::DontClear,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   857
                                SpaceDecorator::Mangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
// This method currently does not expect to expand into eden (i.e.,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
// the virtual space boundaries is expected to be consistent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
// with the eden boundaries..
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
void PSYoungGen::post_resize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  assert_locked_or_safepoint(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
  assert((eden_space()->bottom() < to_space()->bottom()) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
         (eden_space()->bottom() < from_space()->bottom()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
         "Eden is assumed to be below the survivor spaces");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  MemRegion cmr((HeapWord*)virtual_space()->low(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
                (HeapWord*)virtual_space()->high());
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 29798
diff changeset
   872
  ParallelScavengeHeap::heap()->barrier_set()->resize_covered_region(cmr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  space_invariants();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
void PSYoungGen::update_counters() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
    _eden_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
    _from_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    _to_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
    _gen_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 9178
diff changeset
   887
void PSYoungGen::verify() {
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 9178
diff changeset
   888
  eden_space()->verify();
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 9178
diff changeset
   889
  from_space()->verify();
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 9178
diff changeset
   890
  to_space()->verify();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
}
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   892
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   893
#ifndef PRODUCT
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   894
void PSYoungGen::record_spaces_top() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   895
  assert(ZapUnusedHeapArea, "Not mangling unused space");
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   896
  eden_space()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   897
  from_space()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   898
  to_space()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   899
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 186
diff changeset
   900
#endif