hotspot/src/share/vm/memory/defNewGeneration.cpp
author ysr
Tue, 07 Dec 2010 21:55:53 -0800
changeset 7419 263dd4e89b9d
parent 7397 5b173b4ca846
child 7658 b970e410547a
permissions -rw-r--r--
7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed()) 7002546: regression on SpecJbb2005 on 7b118 comparing to 7b117 on small heaps Summary: Relaxed assertion checking related to incremental_collection_failed flag to allow for ExplicitGCInvokesConcurrent behaviour where we do not want a failing scavenge to bail to a stop-world collection. Parameterized incremental_collection_will_fail() so we can selectively use, or not use, as appropriate, the statistical prediction at specific use sites. This essentially reverts the scavenge bail-out logic to what it was prior to some recent changes that had inadvertently started using the statistical prediction which can be noisy in the presence of bursty loads. Added some associated verbose non-product debugging messages. Reviewed-by: johnc, tonyp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
diff changeset
     2
 * Copyright (c) 2001, 2010, 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: 5343
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
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: 5343
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: 7378
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    26
#include "gc_implementation/shared/collectorCounters.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    27
#include "gc_implementation/shared/gcPolicyCounters.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    28
#include "gc_implementation/shared/spaceDecorator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    29
#include "memory/defNewGeneration.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    30
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    31
#include "memory/genCollectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    32
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    33
#include "memory/generationSpec.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    34
#include "memory/iterator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    35
#include "memory/referencePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    36
#include "memory/space.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    37
#include "oops/instanceRefKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    38
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    39
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    40
#include "utilities/copy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    41
#include "utilities/stack.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    42
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    43
# include "thread_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    44
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    45
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    46
# include "thread_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    47
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    48
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    49
# include "thread_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    50
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// DefNewGeneration functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// Methods of protected closure types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
DefNewGeneration::IsAliveClosure::IsAliveClosure(Generation* g) : _g(g) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  assert(g->level() == 0, "Optimized for youngest gen.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
void DefNewGeneration::IsAliveClosure::do_object(oop p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  assert(false, "Do not call.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
bool DefNewGeneration::IsAliveClosure::do_object_b(oop p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  return (HeapWord*)p >= _g->reserved().end() || p->is_forwarded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
DefNewGeneration::KeepAliveClosure::
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
KeepAliveClosure(ScanWeakRefClosure* cl) : _cl(cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  GenRemSet* rs = GenCollectedHeap::heap()->rem_set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  assert(rs->rs_kind() == GenRemSet::CardTable, "Wrong rem set kind.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  _rs = (CardTableRS*)rs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    74
void DefNewGeneration::KeepAliveClosure::do_oop(oop* p)       { DefNewGeneration::KeepAliveClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    75
void DefNewGeneration::KeepAliveClosure::do_oop(narrowOop* p) { DefNewGeneration::KeepAliveClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
DefNewGeneration::FastKeepAliveClosure::
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
FastKeepAliveClosure(DefNewGeneration* g, ScanWeakRefClosure* cl) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  DefNewGeneration::KeepAliveClosure(cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  _boundary = g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    84
void DefNewGeneration::FastKeepAliveClosure::do_oop(oop* p)       { DefNewGeneration::FastKeepAliveClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    85
void DefNewGeneration::FastKeepAliveClosure::do_oop(narrowOop* p) { DefNewGeneration::FastKeepAliveClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
DefNewGeneration::EvacuateFollowersClosure::
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
EvacuateFollowersClosure(GenCollectedHeap* gch, int level,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
                         ScanClosure* cur, ScanClosure* older) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  _gch(gch), _level(level),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  _scan_cur_or_nonheap(cur), _scan_older(older)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
void DefNewGeneration::EvacuateFollowersClosure::do_void() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    _gch->oop_since_save_marks_iterate(_level, _scan_cur_or_nonheap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
                                       _scan_older);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  } while (!_gch->no_allocs_since_save_marks(_level));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
DefNewGeneration::FastEvacuateFollowersClosure::
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
FastEvacuateFollowersClosure(GenCollectedHeap* gch, int level,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
                             DefNewGeneration* gen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
                             FastScanClosure* cur, FastScanClosure* older) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  _gch(gch), _level(level), _gen(gen),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  _scan_cur_or_nonheap(cur), _scan_older(older)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
void DefNewGeneration::FastEvacuateFollowersClosure::do_void() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    _gch->oop_since_save_marks_iterate(_level, _scan_cur_or_nonheap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
                                       _scan_older);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  } while (!_gch->no_allocs_since_save_marks(_level));
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   114
  guarantee(_gen->promo_failure_scan_is_complete(), "Failed to finish scan");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
ScanClosure::ScanClosure(DefNewGeneration* g, bool gc_barrier) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  OopsInGenClosure(g), _g(g), _gc_barrier(gc_barrier)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  assert(_g->level() == 0, "Optimized for youngest generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  _boundary = _g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   124
void ScanClosure::do_oop(oop* p)       { ScanClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   125
void ScanClosure::do_oop(narrowOop* p) { ScanClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   126
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
FastScanClosure::FastScanClosure(DefNewGeneration* g, bool gc_barrier) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  OopsInGenClosure(g), _g(g), _gc_barrier(gc_barrier)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  assert(_g->level() == 0, "Optimized for youngest generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  _boundary = _g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   134
void FastScanClosure::do_oop(oop* p)       { FastScanClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   135
void FastScanClosure::do_oop(narrowOop* p) { FastScanClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   136
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
ScanWeakRefClosure::ScanWeakRefClosure(DefNewGeneration* g) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  OopClosure(g->ref_processor()), _g(g)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  assert(_g->level() == 0, "Optimized for youngest generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  _boundary = _g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   144
void ScanWeakRefClosure::do_oop(oop* p)       { ScanWeakRefClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   145
void ScanWeakRefClosure::do_oop(narrowOop* p) { ScanWeakRefClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   146
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   147
void FilteringClosure::do_oop(oop* p)       { FilteringClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   148
void FilteringClosure::do_oop(narrowOop* p) { FilteringClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
DefNewGeneration::DefNewGeneration(ReservedSpace rs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
                                   size_t initial_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
                                   int level,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
                                   const char* policy)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  : Generation(rs, initial_size, level),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    _promo_failure_drain_in_progress(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    _should_allocate_from_space(false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  MemRegion cmr((HeapWord*)_virtual_space.low(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
                (HeapWord*)_virtual_space.high());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  Universe::heap()->barrier_set()->resize_covered_region(cmr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  if (GenCollectedHeap::heap()->collector_policy()->has_soft_ended_eden()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    _eden_space = new ConcEdenSpace(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    _eden_space = new EdenSpace(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  _from_space = new ContiguousSpace();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  _to_space   = new ContiguousSpace();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  if (_eden_space == NULL || _from_space == NULL || _to_space == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    vm_exit_during_initialization("Could not allocate a new gen space");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Compute the maximum eden and survivor space sizes. These sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // are computed assuming the entire reserved space is committed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // These values are exported as performance counters.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  uintx alignment = GenCollectedHeap::heap()->collector_policy()->min_alignment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  uintx size = _virtual_space.reserved_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  _max_survivor_size = compute_survivor_size(size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  _max_eden_size = size - (2*_max_survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // allocate the performance counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // Generation counters -- generation 0, 3 subspaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  _gen_counters = new GenerationCounters("new", 0, 3, &_virtual_space);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  _gc_counters = new CollectorCounters(policy, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  _eden_counters = new CSpaceCounters("eden", 0, _max_eden_size, _eden_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
                                      _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  _from_counters = new CSpaceCounters("s0", 1, _max_survivor_size, _from_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
                                      _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  _to_counters = new CSpaceCounters("s1", 2, _max_survivor_size, _to_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
                                    _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   194
  compute_space_boundaries(0, SpaceDecorator::Clear, SpaceDecorator::Mangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  _next_gen = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  _tenuring_threshold = MaxTenuringThreshold;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  _pretenure_size_threshold_words = PretenureSizeThreshold >> LogHeapWordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   201
void DefNewGeneration::compute_space_boundaries(uintx minimum_eden_size,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   202
                                                bool clear_space,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   203
                                                bool mangle_space) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   204
  uintx alignment =
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   205
    GenCollectedHeap::heap()->collector_policy()->min_alignment();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   206
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   207
  // If the spaces are being cleared (only done at heap initialization
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   208
  // currently), the survivor spaces need not be empty.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   209
  // Otherwise, no care is taken for used areas in the survivor spaces
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   210
  // so check.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   211
  assert(clear_space || (to()->is_empty() && from()->is_empty()),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   212
    "Initialization of the survivor spaces assumes these are empty");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // Compute sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  uintx size = _virtual_space.committed_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  uintx survivor_size = compute_survivor_size(size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  uintx eden_size = size - (2*survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  if (eden_size < minimum_eden_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    // May happen due to 64Kb rounding, if so adjust eden size back up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    minimum_eden_size = align_size_up(minimum_eden_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    uintx maximum_survivor_size = (size - minimum_eden_size) / 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    uintx unaligned_survivor_size =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
      align_size_down(maximum_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    survivor_size = MAX2(unaligned_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    eden_size = size - (2*survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    assert(eden_size >= minimum_eden_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  char *eden_start = _virtual_space.low();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  char *from_start = eden_start + eden_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  char *to_start   = from_start + survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  char *to_end     = to_start   + survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  assert(to_end == _virtual_space.high(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  assert(Space::is_aligned((HeapWord*)eden_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  assert(Space::is_aligned((HeapWord*)from_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  assert(Space::is_aligned((HeapWord*)to_start),   "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)from_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  MemRegion fromMR((HeapWord*)from_start, (HeapWord*)to_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  MemRegion toMR  ((HeapWord*)to_start, (HeapWord*)to_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   246
  // A minimum eden size implies that there is a part of eden that
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   247
  // is being used and that affects the initialization of any
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   248
  // newly formed eden.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   249
  bool live_in_eden = minimum_eden_size > 0;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   250
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   251
  // If not clearing the spaces, do some checking to verify that
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   252
  // the space are already mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   253
  if (!clear_space) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   254
    // 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: 360
diff changeset
   255
    // the bottom or end of one space may have moved into another
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   256
    // a failure of the check may not correctly indicate which space
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   257
    // is not properly mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   258
    if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   259
      HeapWord* limit = (HeapWord*) _virtual_space.high();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   260
      eden()->check_mangled_unused_area(limit);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   261
      from()->check_mangled_unused_area(limit);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   262
        to()->check_mangled_unused_area(limit);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   263
    }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   264
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   265
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   266
  // Reset the spaces for their new regions.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   267
  eden()->initialize(edenMR,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   268
                     clear_space && !live_in_eden,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   269
                     SpaceDecorator::Mangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   270
  // If clear_space and live_in_eden, we will not have cleared any
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // portion of eden above its top. This can cause newly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // expanded space not to be mangled if using ZapUnusedHeapArea.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  // We explicitly do such mangling here.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   274
  if (ZapUnusedHeapArea && clear_space && live_in_eden && mangle_space) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    eden()->mangle_unused_area();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  }
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   277
  from()->initialize(fromMR, clear_space, mangle_space);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   278
  to()->initialize(toMR, clear_space, mangle_space);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   279
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   280
  // Set next compaction spaces.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  eden()->set_next_compaction_space(from());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // The to-space is normally empty before a compaction so need
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // not be considered.  The exception is during promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  // failure handling when to-space can contain live objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  from()->set_next_compaction_space(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
void DefNewGeneration::swap_spaces() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  ContiguousSpace* s = from();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  _from_space        = to();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  _to_space          = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  eden()->set_next_compaction_space(from());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // The to-space is normally empty before a compaction so need
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  // not be considered.  The exception is during promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // failure handling when to-space can contain live objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  from()->set_next_compaction_space(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    CSpaceCounters* c = _from_counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    _from_counters = _to_counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    _to_counters = c;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
bool DefNewGeneration::expand(size_t bytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  MutexLocker x(ExpandHeap_lock);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   307
  HeapWord* prev_high = (HeapWord*) _virtual_space.high();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  bool success = _virtual_space.expand_by(bytes);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   309
  if (success && ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   310
    // Mangle newly committed space immediately because it
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   311
    // 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: 360
diff changeset
   312
    // spaces have been computed.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   313
    HeapWord* new_high = (HeapWord*) _virtual_space.high();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   314
    MemRegion mangle_region(prev_high, new_high);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   315
    SpaceMangler::mangle_region(mangle_region);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   316
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  // Do not attempt an expand-to-the reserve size.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // request should properly observe the maximum size of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  // the generation so an expand-to-reserve should be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // unnecessary.  Also a second call to expand-to-reserve
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // value potentially can cause an undue expansion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // For example if the first expand fail for unknown reasons,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // but the second succeeds and expands the heap to its maximum
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  // value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  if (GC_locker::is_active()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    if (PrintGC && Verbose) {
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   328
      gclog_or_tty->print_cr("Garbage collection disabled, "
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   329
        "expanded heap instead");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  return success;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
void DefNewGeneration::compute_new_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  // This is called after a gc that includes the following generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  // (which is required to exist.)  So from-space will normally be empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  // Note that we check both spaces, since if scavenge failed they revert roles.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  // If not we bail out (otherwise we would have to relocate the objects)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  if (!from()->is_empty() || !to()->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  int next_level = level() + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  GenCollectedHeap* gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  assert(next_level < gch->_n_gens,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
         "DefNewGeneration cannot be an oldest gen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  Generation* next_gen = gch->_gens[next_level];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  size_t old_size = next_gen->capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  size_t new_size_before = _virtual_space.committed_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  size_t min_new_size = spec()->init_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  size_t max_new_size = reserved().byte_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  assert(min_new_size <= new_size_before &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
         new_size_before <= max_new_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
         "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  // All space sizes must be multiples of Generation::GenGrain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  size_t alignment = Generation::GenGrain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  // Compute desired new generation size based on NewRatio and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  // NewSizeThreadIncrease
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  size_t desired_new_size = old_size/NewRatio;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  int threads_count = Threads::number_of_non_daemon_threads();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  size_t thread_increase_size = threads_count * NewSizeThreadIncrease;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  desired_new_size = align_size_up(desired_new_size + thread_increase_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  // Adjust new generation size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  desired_new_size = MAX2(MIN2(desired_new_size, max_new_size), min_new_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  assert(desired_new_size <= max_new_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  bool changed = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  if (desired_new_size > new_size_before) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    size_t change = desired_new_size - new_size_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    assert(change % alignment == 0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    if (expand(change)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
       changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    // If the heap failed to expand to the desired size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    // "changed" will be false.  If the expansion failed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    // (and at this point it was expected to succeed),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
    // ignore the failure (leaving "changed" as false).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  if (desired_new_size < new_size_before && eden()->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
    // bail out of shrinking if objects in eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
    size_t change = new_size_before - desired_new_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
    assert(change % alignment == 0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
    _virtual_space.shrink_by(change);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  if (changed) {
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   393
    // The spaces have already been mangled at this point but
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   394
    // may not have been cleared (set top = bottom) and should be.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   395
    // Mangling was done when the heap was being expanded.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   396
    compute_space_boundaries(eden()->used(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   397
                             SpaceDecorator::Clear,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   398
                             SpaceDecorator::DontMangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   399
    MemRegion cmr((HeapWord*)_virtual_space.low(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   400
                  (HeapWord*)_virtual_space.high());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    Universe::heap()->barrier_set()->resize_covered_region(cmr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    if (Verbose && PrintGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
      size_t new_size_after  = _virtual_space.committed_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
      size_t eden_size_after = eden()->capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
      size_t survivor_size_after = from()->capacity();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   406
      gclog_or_tty->print("New generation size " SIZE_FORMAT "K->"
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   407
        SIZE_FORMAT "K [eden="
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
        SIZE_FORMAT "K,survivor=" SIZE_FORMAT "K]",
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   409
        new_size_before/K, new_size_after/K,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   410
        eden_size_after/K, survivor_size_after/K);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
      if (WizardMode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
        gclog_or_tty->print("[allowed " SIZE_FORMAT "K extra for %d threads]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
          thread_increase_size/K, threads_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
      gclog_or_tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
void DefNewGeneration::object_iterate_since_last_GC(ObjectClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  // $$$ This may be wrong in case of "scavenge failure"?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  eden()->object_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
void DefNewGeneration::younger_refs_iterate(OopsInGenClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  assert(false, "NYI -- are you sure you want to call this?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
size_t DefNewGeneration::capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  return eden()->capacity()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
       + from()->capacity();  // to() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
size_t DefNewGeneration::used() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  return eden()->used()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
       + from()->used();      // to() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
size_t DefNewGeneration::free() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  return eden()->free()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
       + from()->free();      // to() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
size_t DefNewGeneration::max_capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  const size_t alignment = GenCollectedHeap::heap()->collector_policy()->min_alignment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  const size_t reserved_bytes = reserved().byte_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  return reserved_bytes - compute_survivor_size(reserved_bytes, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
size_t DefNewGeneration::unsafe_max_alloc_nogc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  return eden()->free();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
size_t DefNewGeneration::capacity_before_gc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  return eden()->capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
size_t DefNewGeneration::contiguous_available() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  return eden()->free();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
HeapWord** DefNewGeneration::top_addr() const { return eden()->top_addr(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
HeapWord** DefNewGeneration::end_addr() const { return eden()->end_addr(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
void DefNewGeneration::object_iterate(ObjectClosure* blk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  eden()->object_iterate(blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  from()->object_iterate(blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
void DefNewGeneration::space_iterate(SpaceClosure* blk,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
                                     bool usedOnly) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  blk->do_space(eden());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  blk->do_space(from());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  blk->do_space(to());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
// The last collection bailed out, we are running out of heap space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
// so we try to allocate the from-space, too.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
HeapWord* DefNewGeneration::allocate_from_space(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  HeapWord* result = NULL;
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   486
  if (Verbose && PrintGCDetails) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
    gclog_or_tty->print("DefNewGeneration::allocate_from_space(%u):"
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   488
                        "  will_fail: %s"
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   489
                        "  heap_lock: %s"
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   490
                        "  free: " SIZE_FORMAT,
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   491
                        size,
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   492
                        GenCollectedHeap::heap()->incremental_collection_will_fail(false /* don't consult_young */) ?
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   493
                          "true" : "false",
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   494
                        Heap_lock->is_locked() ? "locked" : "unlocked",
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   495
                        from()->free());
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   496
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  if (should_allocate_from_space() || GC_locker::is_active_and_needs_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
    if (Heap_lock->owned_by_self() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
        (SafepointSynchronize::is_at_safepoint() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
         Thread::current()->is_VM_thread())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
      // If the Heap_lock is not locked by this thread, this will be called
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
      // again later with the Heap_lock held.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
      result = from()->allocate(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
    } else if (PrintGC && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
      gclog_or_tty->print_cr("  Heap_lock is not owned by self");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  } else if (PrintGC && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    gclog_or_tty->print_cr("  should_allocate_from_space: NOT");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  if (PrintGC && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    gclog_or_tty->print_cr("  returns %s", result == NULL ? "NULL" : "object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
HeapWord* DefNewGeneration::expand_and_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
                                                bool   is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
                                                bool   parallel) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // We don't attempt to expand the young generation (but perhaps we should.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  return allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
void DefNewGeneration::collect(bool   full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
                               bool   clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
                               size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
                               bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  assert(full || size > 0, "otherwise we don't want to collect");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  GenCollectedHeap* gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  _next_gen = gch->next_gen(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  assert(_next_gen != NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    "This must be the youngest gen, and not the only gen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  // If the next generation is too full to accomodate promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // from this generation, pass on collection; let the next generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  // do it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  if (!collection_attempt_is_safe()) {
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   538
    if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   539
      gclog_or_tty->print(" :: Collection attempt not safe :: ");
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   540
    }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   541
    gch->set_incremental_collection_failed(); // Slight lie: we did not even attempt one
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  assert(to()->is_empty(), "Else not collection_attempt_is_safe");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  init_assuming_no_promotion_failure();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  TraceTime t1("GC", PrintGC && !PrintGCDetails, true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  // Capture heap used before collection (for printing).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  size_t gch_prev_used = gch->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  SpecializationStats::clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  // These can be shared for all code paths
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  IsAliveClosure is_alive(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  ScanWeakRefClosure scan_weak_ref(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  age_table()->clear();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   559
  to()->clear(SpaceDecorator::Mangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  gch->rem_set()->prepare_for_younger_refs_iterate(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  assert(gch->no_allocs_since_save_marks(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
         "save marks have not been newly set.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  // Not very pretty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  CollectorPolicy* cp = gch->collector_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  FastScanClosure fsc_with_no_gc_barrier(this, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  FastScanClosure fsc_with_gc_barrier(this, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  set_promo_failure_scan_stack_closure(&fsc_with_no_gc_barrier);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  FastEvacuateFollowersClosure evacuate_followers(gch, _level, this,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
                                                  &fsc_with_no_gc_barrier,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
                                                  &fsc_with_gc_barrier);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  assert(gch->no_allocs_since_save_marks(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
         "save marks have not been newly set.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  gch->gen_process_strong_roots(_level,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 1610
diff changeset
   581
                                true,  // Process younger gens, if any,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 1610
diff changeset
   582
                                       // as strong roots.
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 1610
diff changeset
   583
                                true,  // activate StrongRootsScope
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 1610
diff changeset
   584
                                false, // not collecting perm generation.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
                                SharedHeap::SO_AllClasses,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 1610
diff changeset
   586
                                &fsc_with_no_gc_barrier,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 1610
diff changeset
   587
                                true,   // walk *all* scavengable nmethods
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 1610
diff changeset
   588
                                &fsc_with_gc_barrier);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  // "evacuate followers".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  evacuate_followers.do_void();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  FastKeepAliveClosure keep_alive(this, &scan_weak_ref);
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   594
  ReferenceProcessor* rp = ref_processor();
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
   595
  rp->setup_policy(clear_all_soft_refs);
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   596
  rp->process_discovered_references(&is_alive, &keep_alive, &evacuate_followers,
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   597
                                    NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  if (!promotion_failed()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
    // Swap the survivor spaces.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   600
    eden()->clear(SpaceDecorator::Mangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   601
    from()->clear(SpaceDecorator::Mangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   602
    if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   603
      // This is now done here because of the piece-meal mangling which
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   604
      // can check for valid mangling at intermediate points in the
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   605
      // collection(s).  When a minor collection fails to collect
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   606
      // sufficient space resizing of the young generation can occur
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   607
      // an redistribute the spaces in the young generation.  Mangle
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   608
      // here so that unzapped regions don't get distributed to
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   609
      // other spaces.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   610
      to()->mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   611
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
    swap_spaces();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
    assert(to()->is_empty(), "to space should be empty now");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
    // Set the desired survivor size to half the real survivor space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
    _tenuring_threshold =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
      age_table()->compute_tenuring_threshold(to()->capacity()/HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   620
    // A successful scavenge should restart the GC time limit count which is
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   621
    // for full GC's.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   622
    AdaptiveSizePolicy* size_policy = gch->gen_policy()->size_policy();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   623
    size_policy->reset_gc_overhead_limit_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
    if (PrintGC && !PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
      gch->print_heap_change(gch_prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
    }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   627
    assert(!gch->incremental_collection_failed(), "Should be clear");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  } else {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   629
    assert(_promo_failure_scan_stack.is_empty(), "post condition");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   630
    _promo_failure_scan_stack.clear(true); // Clear cached segments.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
    remove_forwarding_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
    if (PrintGCDetails) {
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   634
      gclog_or_tty->print(" (promotion failed) ");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
    // Add to-space to the list of space to compact
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
    // when a promotion failure has occurred.  In that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
    // case there can be live objects in to-space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
    // as a result of a partial evacuation of eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
    // and from-space.
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   641
    swap_spaces();   // For uniformity wrt ParNewGeneration.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    from()->set_next_compaction_space(to());
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   643
    gch->set_incremental_collection_failed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   645
    // Inform the next generation that a promotion failure occurred.
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   646
    _next_gen->promotion_failure_occurred();
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   647
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
    // Reset the PromotionFailureALot counters.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
    NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  // set new iteration safe limit for the survivor spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  from()->set_concurrent_iteration_safe_limit(from()->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  to()->set_concurrent_iteration_safe_limit(to()->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  SpecializationStats::print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  update_time_of_last_gc(os::javaTimeMillis());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
class RemoveForwardPointerClosure: public ObjectClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
  void do_object(oop obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
    obj->init_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
void DefNewGeneration::init_assuming_no_promotion_failure() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  _promotion_failed = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  from()->set_next_compaction_space(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
void DefNewGeneration::remove_forwarding_pointers() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  RemoveForwardPointerClosure rspc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  eden()->object_iterate(&rspc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  from()->object_iterate(&rspc);
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   674
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  // Now restore saved marks, if any.
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   676
  assert(_objs_with_preserved_marks.size() == _preserved_marks_of_objs.size(),
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   677
         "should be the same");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   678
  while (!_objs_with_preserved_marks.is_empty()) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   679
    oop obj   = _objs_with_preserved_marks.pop();
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   680
    markOop m = _preserved_marks_of_objs.pop();
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   681
    obj->set_mark(m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  }
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   683
  _objs_with_preserved_marks.clear(true);
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   684
  _preserved_marks_of_objs.clear(true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  if (m->must_be_preserved_for_promotion_failure(obj)) {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   689
    _objs_with_preserved_marks.push(obj);
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   690
    _preserved_marks_of_objs.push(m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
void DefNewGeneration::handle_promotion_failure(oop old) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  preserve_mark_if_necessary(old, old->mark());
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   696
  if (!_promotion_failed && PrintPromotionFailure) {
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   697
    gclog_or_tty->print(" (promotion failure size = " SIZE_FORMAT ") ",
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   698
                        old->size());
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   699
  }
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   700
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  // forward to self
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  old->forward_to(old);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  _promotion_failed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   705
  _promo_failure_scan_stack.push(old);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  if (!_promo_failure_drain_in_progress) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
    // prevent recursion in copy_to_survivor_space()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    _promo_failure_drain_in_progress = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
    drain_promo_failure_scan_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
    _promo_failure_drain_in_progress = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   715
oop DefNewGeneration::copy_to_survivor_space(oop old) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  assert(is_in_reserved(old) && !old->is_forwarded(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
         "shouldn't be scavenging this oop");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  size_t s = old->size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  oop obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  // Try allocating obj in to-space (unless too old)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  if (old->age() < tenuring_threshold()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    obj = (oop) to()->allocate(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  // Otherwise try allocating obj tenured
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  if (obj == NULL) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   728
    obj = _next_gen->promote(old, s);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
    if (obj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
      handle_promotion_failure(old);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
      return old;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
    // Prefetch beyond obj
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
    const intx interval = PrefetchCopyIntervalInBytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
    Prefetch::write(obj, interval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
    // Copy obj
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
    Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)obj, s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
    // Increment age if obj still in new generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
    obj->incr_age();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
    age_table()->add(obj, s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  // Done, insert forward pointer to obj in this header
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  old->forward_to(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
void DefNewGeneration::drain_promo_failure_scan_stack() {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   753
  while (!_promo_failure_scan_stack.is_empty()) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   754
     oop obj = _promo_failure_scan_stack.pop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
     obj->oop_iterate(_promo_failure_scan_stack_closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
void DefNewGeneration::save_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  eden()->set_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  to()->set_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  from()->set_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
void DefNewGeneration::reset_saved_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  eden()->reset_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  to()->reset_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  from()->reset_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
bool DefNewGeneration::no_allocs_since_save_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  assert(eden()->saved_mark_at_top(), "Violated spec - alloc in eden");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  assert(from()->saved_mark_at_top(), "Violated spec - alloc in from");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  return to()->saved_mark_at_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
#define DefNew_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
                                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
void DefNewGeneration::                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) {   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  cl->set_generation(this);                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  eden()->oop_since_save_marks_iterate##nv_suffix(cl);          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  to()->oop_since_save_marks_iterate##nv_suffix(cl);            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  from()->oop_since_save_marks_iterate##nv_suffix(cl);          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  cl->reset_generation();                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  save_marks();                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
ALL_SINCE_SAVE_MARKS_CLOSURES(DefNew_SINCE_SAVE_MARKS_DEFN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
#undef DefNew_SINCE_SAVE_MARKS_DEFN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
void DefNewGeneration::contribute_scratch(ScratchBlock*& list, Generation* requestor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
                                         size_t max_alloc_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  if (requestor == this || _promotion_failed) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  assert(requestor->level() > level(), "DefNewGeneration must be youngest");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  /* $$$ Assert this?  "trace" is a "MarkSweep" function so that's not appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  if (to_space->top() > to_space->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
    trace("to_space not empty when contribute_scratch called");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  ContiguousSpace* to_space = to();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  assert(to_space->end() >= to_space->top(), "pointers out of order");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  size_t free_words = pointer_delta(to_space->end(), to_space->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  if (free_words >= MinFreeScratchWords) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
    ScratchBlock* sb = (ScratchBlock*)to_space->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
    sb->num_words = free_words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
    sb->next = list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    list = sb;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   817
void DefNewGeneration::reset_scratch() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   818
  // If contributing scratch in to_space, mangle all of
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   819
  // to_space if ZapUnusedHeapArea.  This is needed because
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   820
  // top is not maintained while using to-space as scratch.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   821
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   822
    to()->mangle_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   823
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   824
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   825
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
bool DefNewGeneration::collection_attempt_is_safe() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  if (!to()->is_empty()) {
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   828
    if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   829
      gclog_or_tty->print(" :: to is not empty :: ");
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   830
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  if (_next_gen == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
    GenCollectedHeap* gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    _next_gen = gch->next_gen(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
    assert(_next_gen != NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
           "This must be the youngest gen, and not the only gen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   839
  return _next_gen->promotion_attempt_is_safe(used());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
void DefNewGeneration::gc_epilogue(bool full) {
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   843
  DEBUG_ONLY(static bool seen_incremental_collection_failed = false;)
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   844
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   845
  assert(!GC_locker::is_active(), "We should not be executing here");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  // Check if the heap is approaching full after a collection has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  // been done.  Generally the young generation is empty at
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  // a minimum at the end of a collection.  If it is not, then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  // the heap is approaching full.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  GenCollectedHeap* gch = GenCollectedHeap::heap();
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   851
  if (full) {
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   852
    DEBUG_ONLY(seen_incremental_collection_failed = false;)
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   853
    if (!collection_attempt_is_safe() && !_eden_space->is_empty()) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   854
      if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   855
        gclog_or_tty->print("DefNewEpilogue: cause(%s), full, not safe, set_failed, set_alloc_from, clear_seen",
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   856
                            GCCause::to_string(gch->gc_cause()));
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   857
      }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   858
      gch->set_incremental_collection_failed(); // Slight lie: a full gc left us in that state
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   859
      set_should_allocate_from_space(); // we seem to be running out of space
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   860
    } else {
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   861
      if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   862
        gclog_or_tty->print("DefNewEpilogue: cause(%s), full, safe, clear_failed, clear_alloc_from, clear_seen",
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   863
                            GCCause::to_string(gch->gc_cause()));
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   864
      }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   865
      gch->clear_incremental_collection_failed(); // We just did a full collection
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   866
      clear_should_allocate_from_space(); // if set
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   867
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  } else {
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   869
#ifdef ASSERT
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   870
    // It is possible that incremental_collection_failed() == true
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   871
    // here, because an attempted scavenge did not succeed. The policy
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   872
    // is normally expected to cause a full collection which should
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   873
    // clear that condition, so we should not be here twice in a row
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   874
    // with incremental_collection_failed() == true without having done
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   875
    // a full collection in between.
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   876
    if (!seen_incremental_collection_failed &&
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   877
        gch->incremental_collection_failed()) {
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   878
      if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   879
        gclog_or_tty->print("DefNewEpilogue: cause(%s), not full, not_seen_failed, failed, set_seen_failed",
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   880
                            GCCause::to_string(gch->gc_cause()));
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   881
      }
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   882
      seen_incremental_collection_failed = true;
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   883
    } else if (seen_incremental_collection_failed) {
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   884
      if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   885
        gclog_or_tty->print("DefNewEpilogue: cause(%s), not full, seen_failed, will_clear_seen_failed",
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   886
                            GCCause::to_string(gch->gc_cause()));
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   887
      }
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   888
      assert(gch->gc_cause() == GCCause::_scavenge_alot ||
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   889
             (gch->gc_cause() == GCCause::_java_lang_system_gc && UseConcMarkSweepGC && ExplicitGCInvokesConcurrent) ||
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   890
             !gch->incremental_collection_failed(),
7378
fe845b64d7fb 6998802: ScavengeALot: assert(!gch->incremental_collection_failed()) failed: Twice in a row
ysr
parents: 6986
diff changeset
   891
             "Twice in a row");
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   892
      seen_incremental_collection_failed = false;
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   893
    }
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   894
#endif // ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   897
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   898
    eden()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   899
    from()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   900
    to()->check_mangled_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   901
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   902
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  // update the generation and space performance counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  gch->collector_policy()->counters()->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   908
void DefNewGeneration::record_spaces_top() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   909
  assert(ZapUnusedHeapArea, "Not mangling unused space");
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   910
  eden()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   911
  to()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   912
  from()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   913
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   914
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   915
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
void DefNewGeneration::update_counters() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    _eden_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
    _from_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
    _to_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
    _gen_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
void DefNewGeneration::verify(bool allow_dirty) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  eden()->verify(allow_dirty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  from()->verify(allow_dirty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
    to()->verify(allow_dirty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
void DefNewGeneration::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  Generation::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  st->print("  eden");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  eden()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  st->print("  from");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  from()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  st->print("  to  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  to()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
const char* DefNewGeneration::name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  return "def new generation";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
}
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   945
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   946
// Moved from inline file as they are not called inline
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   947
CompactibleSpace* DefNewGeneration::first_compaction_space() const {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   948
  return eden();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   949
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   950
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   951
HeapWord* DefNewGeneration::allocate(size_t word_size,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   952
                                     bool is_tlab) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   953
  // This is the slow-path allocation for the DefNewGeneration.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   954
  // Most allocations are fast-path in compiled code.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   955
  // We try to allocate from the eden.  If that works, we are happy.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   956
  // Note that since DefNewGeneration supports lock-free allocation, we
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   957
  // have to use it here, as well.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   958
  HeapWord* result = eden()->par_allocate(word_size);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   959
  if (result != NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   960
    return result;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   961
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   962
  do {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   963
    HeapWord* old_limit = eden()->soft_end();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   964
    if (old_limit < eden()->end()) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   965
      // Tell the next generation we reached a limit.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   966
      HeapWord* new_limit =
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   967
        next_gen()->allocation_limit_reached(eden(), eden()->top(), word_size);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   968
      if (new_limit != NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   969
        Atomic::cmpxchg_ptr(new_limit, eden()->soft_end_addr(), old_limit);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   970
      } else {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   971
        assert(eden()->soft_end() == eden()->end(),
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   972
               "invalid state after allocation_limit_reached returned null");
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   973
      }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   974
    } else {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   975
      // The allocation failed and the soft limit is equal to the hard limit,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   976
      // there are no reasons to do an attempt to allocate
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   977
      assert(old_limit == eden()->end(), "sanity check");
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   978
      break;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   979
    }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   980
    // Try to allocate until succeeded or the soft limit can't be adjusted
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   981
    result = eden()->par_allocate(word_size);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   982
  } while (result == NULL);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   983
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   984
  // If the eden is full and the last collection bailed out, we are running
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   985
  // out of heap space, and we try to allocate the from-space, too.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   986
  // allocate_from_space can't be inlined because that would introduce a
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   987
  // circular dependency at compile time.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   988
  if (result == NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   989
    result = allocate_from_space(word_size);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   990
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   991
  return result;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   992
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   993
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   994
HeapWord* DefNewGeneration::par_allocate(size_t word_size,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   995
                                         bool is_tlab) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   996
  return eden()->par_allocate(word_size);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   997
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   998
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   999
void DefNewGeneration::gc_prologue(bool full) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1000
  // Ensure that _end and _soft_end are the same in eden space.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1001
  eden()->set_soft_end(eden()->end());
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1002
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1003
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1004
size_t DefNewGeneration::tlab_capacity() const {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1005
  return eden()->capacity();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1006
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1007
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1008
size_t DefNewGeneration::unsafe_max_tlab_alloc() const {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1009
  return unsafe_max_alloc_nogc();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1010
}