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