hotspot/src/share/vm/gc/serial/defNewGeneration.cpp
author tschatzl
Thu, 28 Jan 2016 13:30:12 +0100
changeset 35877 a2a62511d0f8
parent 35862 411842d0c882
child 36202 219f8808c3bd
permissions -rw-r--r--
8146987: Improve Parallel GC Full GC by caching results of live_words_in_range() Summary: A large part of time in the parallel scavenge collector is spent finding out the amount of live words within memory ranges to find out where to move an object to. Try to incrementally calculate this value. Reviewed-by: tschatzl, mgerdin, jmasa Contributed-by: ray alex <sky1young@gmail.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
35471
deb38c83d759 8146695: FinalizeTest04 crashes VM with EXCEPTION_INT_DIVIDE_BY_ZERO
sangheki
parents: 35458
diff changeset
     2
 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    25
#include "precompiled.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    26
#include "gc/serial/defNewGeneration.inline.hpp"
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
    27
#include "gc/shared/ageTable.inline.hpp"
33212
906b3d079b13 8139434: Unify GenRemSet and CardTableRS
david
parents: 33143
diff changeset
    28
#include "gc/shared/cardTableRS.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    29
#include "gc/shared/collectorCounters.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    30
#include "gc/shared/gcHeapSummary.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    31
#include "gc/shared/gcLocker.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    32
#include "gc/shared/gcPolicyCounters.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    33
#include "gc/shared/gcTimer.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    34
#include "gc/shared/gcTrace.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
    35
#include "gc/shared/gcTraceTime.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    36
#include "gc/shared/genCollectedHeap.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    37
#include "gc/shared/genOopClosures.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    38
#include "gc/shared/generationSpec.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    39
#include "gc/shared/referencePolicy.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    40
#include "gc/shared/space.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    41
#include "gc/shared/spaceDecorator.hpp"
30868
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
    42
#include "gc/shared/strongRootsScope.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
    43
#include "logging/log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    44
#include "memory/iterator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    45
#include "oops/instanceRefKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    46
#include "oops/oop.inline.hpp"
25351
7c198a690050 8044775: Improve usage of umbrella header atomic.inline.hpp.
goetz
parents: 25350
diff changeset
    47
#include "runtime/atomic.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    48
#include "runtime/java.hpp"
24487
71ff0bd674eb 8042737: Introduce umbrella header prefetch.inline.hpp
goetz
parents: 24424
diff changeset
    49
#include "runtime/prefetch.inline.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 13728
diff changeset
    50
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    51
#include "utilities/copy.hpp"
24098
48f07e2c74de 8039957: Replace the last few %p usages with PTR_FORMAT in the GC code
stefank
parents: 24092
diff changeset
    52
#include "utilities/globalDefinitions.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7378
diff changeset
    53
#include "utilities/stack.inline.hpp"
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 30147
diff changeset
    54
#if INCLUDE_ALL_GCS
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30173
diff changeset
    55
#include "gc/cms/parOopClosures.hpp"
30150
d9c940aa42ef 8075955: Replace the macro based implementation of oop_oop_iterate with a template based solution
stefank
parents: 30147
diff changeset
    56
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// DefNewGeneration functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// Methods of protected closure types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    63
DefNewGeneration::IsAliveClosure::IsAliveClosure(Generation* young_gen) : _young_gen(young_gen) {
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    64
  assert(_young_gen->kind() == Generation::ParNew ||
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    65
         _young_gen->kind() == Generation::DefNew, "Expected the young generation here");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
}
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    67
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
bool DefNewGeneration::IsAliveClosure::do_object_b(oop p) {
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    69
  return (HeapWord*)p >= _young_gen->reserved().end() || p->is_forwarded();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
DefNewGeneration::KeepAliveClosure::
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
KeepAliveClosure(ScanWeakRefClosure* cl) : _cl(cl) {
33212
906b3d079b13 8139434: Unify GenRemSet and CardTableRS
david
parents: 33143
diff changeset
    74
  _rs = GenCollectedHeap::heap()->rem_set();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    77
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
    78
void DefNewGeneration::KeepAliveClosure::do_oop(narrowOop* p) { DefNewGeneration::KeepAliveClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
DefNewGeneration::FastKeepAliveClosure::
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
FastKeepAliveClosure(DefNewGeneration* g, ScanWeakRefClosure* cl) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  DefNewGeneration::KeepAliveClosure(cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  _boundary = g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
    87
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
    88
void DefNewGeneration::FastKeepAliveClosure::do_oop(narrowOop* p) { DefNewGeneration::FastKeepAliveClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
DefNewGeneration::EvacuateFollowersClosure::
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    91
EvacuateFollowersClosure(GenCollectedHeap* gch,
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    92
                         ScanClosure* cur,
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    93
                         ScanClosure* older) :
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    94
  _gch(gch), _scan_cur_or_nonheap(cur), _scan_older(older)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
void DefNewGeneration::EvacuateFollowersClosure::do_void() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  do {
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
    99
    _gch->oop_since_save_marks_iterate(GenCollectedHeap::YoungGen, _scan_cur_or_nonheap, _scan_older);
31780
613fc3da8884 8129961: SIGSEGV when copying to survivor space
ecaspole
parents: 31358
diff changeset
   100
  } while (!_gch->no_allocs_since_save_marks());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
DefNewGeneration::FastEvacuateFollowersClosure::
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   104
FastEvacuateFollowersClosure(GenCollectedHeap* gch,
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   105
                             FastScanClosure* cur,
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   106
                             FastScanClosure* older) :
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   107
  _gch(gch), _scan_cur_or_nonheap(cur), _scan_older(older)
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   108
{
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   109
  assert(_gch->young_gen()->kind() == Generation::DefNew, "Generation should be DefNew");
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31964
diff changeset
   110
  _young_gen = (DefNewGeneration*)_gch->young_gen();
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   111
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
void DefNewGeneration::FastEvacuateFollowersClosure::do_void() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  do {
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   115
    _gch->oop_since_save_marks_iterate(GenCollectedHeap::YoungGen, _scan_cur_or_nonheap, _scan_older);
31780
613fc3da8884 8129961: SIGSEGV when copying to survivor space
ecaspole
parents: 31358
diff changeset
   116
  } while (!_gch->no_allocs_since_save_marks());
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31964
diff changeset
   117
  guarantee(_young_gen->promo_failure_scan_is_complete(), "Failed to finish scan");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
ScanClosure::ScanClosure(DefNewGeneration* g, bool gc_barrier) :
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   121
    OopsInKlassOrGenClosure(g), _g(g), _gc_barrier(gc_barrier)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  _boundary = _g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   126
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
   127
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
   128
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
FastScanClosure::FastScanClosure(DefNewGeneration* g, bool gc_barrier) :
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   130
    OopsInKlassOrGenClosure(g), _g(g), _gc_barrier(gc_barrier)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  _boundary = _g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   135
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
   136
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
   137
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   138
void KlassScanClosure::do_klass(Klass* klass) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   139
  NOT_PRODUCT(ResourceMark rm);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   140
  log_develop_trace(gc, scavenge)("KlassScanClosure::do_klass " PTR_FORMAT ", %s, dirty: %s",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   141
                                  p2i(klass),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   142
                                  klass->external_name(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   143
                                  klass->has_modified_oops() ? "true" : "false");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   144
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   145
  // If the klass has not been dirtied we know that there's
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   146
  // no references into  the young gen and we can skip it.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   147
  if (klass->has_modified_oops()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   148
    if (_accumulate_modified_oops) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   149
      klass->accumulate_modified_oops();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   150
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   151
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   152
    // Clear this state since we're going to scavenge all the metadata.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   153
    klass->clear_modified_oops();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   154
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   155
    // Tell the closure which Klass is being scanned so that it can be dirtied
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   156
    // if oops are left pointing into the young gen.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   157
    _scavenge_closure->set_scanned_klass(klass);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   158
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   159
    klass->oops_do(_scavenge_closure);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   160
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   161
    _scavenge_closure->set_scanned_klass(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   162
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   163
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   164
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
ScanWeakRefClosure::ScanWeakRefClosure(DefNewGeneration* g) :
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   166
  _g(g)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  _boundary = _g->reserved().end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   171
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
   172
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
   173
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   174
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
   175
void FilteringClosure::do_oop(narrowOop* p) { FilteringClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   177
KlassScanClosure::KlassScanClosure(OopsInKlassOrGenClosure* scavenge_closure,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   178
                                   KlassRemSet* klass_rem_set)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   179
    : _scavenge_closure(scavenge_closure),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   180
      _accumulate_modified_oops(klass_rem_set->accumulate_modified_oops()) {}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   181
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   182
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
DefNewGeneration::DefNewGeneration(ReservedSpace rs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
                                   size_t initial_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
                                   const char* policy)
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   186
  : Generation(rs, initial_size),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    _promo_failure_drain_in_progress(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    _should_allocate_from_space(false)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  MemRegion cmr((HeapWord*)_virtual_space.low(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
                (HeapWord*)_virtual_space.high());
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30155
diff changeset
   192
  GenCollectedHeap* gch = GenCollectedHeap::heap();
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30155
diff changeset
   193
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30155
diff changeset
   194
  gch->barrier_set()->resize_covered_region(cmr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
27625
07829380b8cd 8061308: Remove iCMS
brutisso
parents: 27252
diff changeset
   196
  _eden_space = new ContiguousSpace();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  _from_space = new ContiguousSpace();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  _to_space   = new ContiguousSpace();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31964
diff changeset
   200
  if (_eden_space == NULL || _from_space == NULL || _to_space == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    vm_exit_during_initialization("Could not allocate a new gen space");
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31964
diff changeset
   202
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // Compute the maximum eden and survivor space sizes. These sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // are computed assuming the entire reserved space is committed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // These values are exported as performance counters.
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30155
diff changeset
   207
  uintx alignment = gch->collector_policy()->space_alignment();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  uintx size = _virtual_space.reserved_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  _max_survivor_size = compute_survivor_size(size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  _max_eden_size = size - (2*_max_survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // allocate the performance counters
32735
c6063d028c3c 8134797: Remove explicit casts in CollectorPolicy hierarchy
kbarrett
parents: 32623
diff changeset
   213
  GenCollectorPolicy* gcp = gch->gen_policy();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // Generation counters -- generation 0, 3 subspaces
26324
6b9c12e15535 8028787: tmtools/jstat/gcoldcapacity/jstat_gcoldcapacity02 fails nsk.share.Failure: OGC < OGCMN in RT_Baseline
sjohanss
parents: 25905
diff changeset
   216
  _gen_counters = new GenerationCounters("new", 0, 3,
6b9c12e15535 8028787: tmtools/jstat/gcoldcapacity/jstat_gcoldcapacity02 fails nsk.share.Failure: OGC < OGCMN in RT_Baseline
sjohanss
parents: 25905
diff changeset
   217
      gcp->min_young_size(), gcp->max_young_size(), &_virtual_space);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  _gc_counters = new CollectorCounters(policy, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  _eden_counters = new CSpaceCounters("eden", 0, _max_eden_size, _eden_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
                                      _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  _from_counters = new CSpaceCounters("s0", 1, _max_survivor_size, _from_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
                                      _gen_counters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  _to_counters = new CSpaceCounters("s1", 2, _max_survivor_size, _to_space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
                                    _gen_counters);
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
  compute_space_boundaries(0, SpaceDecorator::Clear, SpaceDecorator::Mangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  update_counters();
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
   229
  _old_gen = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  _tenuring_threshold = MaxTenuringThreshold;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  _pretenure_size_threshold_words = PretenureSizeThreshold >> LogHeapWordSize;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   232
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   233
  _gc_timer = new (ResourceObj::C_HEAP, mtGC) STWGCTimer();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   236
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
   237
                                                bool clear_space,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   238
                                                bool mangle_space) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   239
  uintx alignment =
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19286
diff changeset
   240
    GenCollectedHeap::heap()->collector_policy()->space_alignment();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   241
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   242
  // 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
   243
  // 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
   244
  // 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
   245
  // so check.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   246
  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
   247
    "Initialization of the survivor spaces assumes these are empty");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  // Compute sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  uintx size = _virtual_space.committed_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  uintx survivor_size = compute_survivor_size(size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  uintx eden_size = size - (2*survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  if (eden_size < minimum_eden_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
    // May happen due to 64Kb rounding, if so adjust eden size back up
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    minimum_eden_size = align_size_up(minimum_eden_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    uintx maximum_survivor_size = (size - minimum_eden_size) / 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    uintx unaligned_survivor_size =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
      align_size_down(maximum_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    survivor_size = MAX2(unaligned_survivor_size, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    eden_size = size - (2*survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    assert(eden_size >= minimum_eden_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  char *eden_start = _virtual_space.low();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  char *from_start = eden_start + eden_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  char *to_start   = from_start + survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  char *to_end     = to_start   + survivor_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  assert(to_end == _virtual_space.high(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  assert(Space::is_aligned((HeapWord*)eden_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  assert(Space::is_aligned((HeapWord*)from_start), "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  assert(Space::is_aligned((HeapWord*)to_start),   "checking alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)from_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  MemRegion fromMR((HeapWord*)from_start, (HeapWord*)to_start);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  MemRegion toMR  ((HeapWord*)to_start, (HeapWord*)to_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   281
  // 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
   282
  // 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
   283
  // newly formed eden.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   284
  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
   285
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   286
  // 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
   287
  // the space are already mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   288
  if (!clear_space) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   289
    // 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
   290
    // 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
   291
    // 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
   292
    // is not properly mangled.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   293
    if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   294
      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
   295
      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
   296
      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
   297
        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
   298
    }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   299
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   300
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   301
  // 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
   302
  eden()->initialize(edenMR,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   303
                     clear_space && !live_in_eden,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   304
                     SpaceDecorator::Mangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   305
  // If clear_space and live_in_eden, we will not have cleared any
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // portion of eden above its top. This can cause newly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // expanded space not to be mangled if using ZapUnusedHeapArea.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // 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
   309
  if (ZapUnusedHeapArea && clear_space && live_in_eden && mangle_space) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    eden()->mangle_unused_area();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  }
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   312
  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
   313
  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
   314
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   315
  // Set next compaction spaces.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  eden()->set_next_compaction_space(from());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // The to-space is normally empty before a compaction so need
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  // not be considered.  The exception is during promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // failure handling when to-space can contain live objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  from()->set_next_compaction_space(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
void DefNewGeneration::swap_spaces() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  ContiguousSpace* s = from();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  _from_space        = to();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  _to_space          = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  eden()->set_next_compaction_space(from());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  // The to-space is normally empty before a compaction so need
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // not be considered.  The exception is during promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  // failure handling when to-space can contain live objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  from()->set_next_compaction_space(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    CSpaceCounters* c = _from_counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    _from_counters = _to_counters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    _to_counters = c;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
bool DefNewGeneration::expand(size_t bytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  MutexLocker x(ExpandHeap_lock);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   342
  HeapWord* prev_high = (HeapWord*) _virtual_space.high();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  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
   344
  if (success && ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   345
    // 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
   346
    // 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
   347
    // spaces have been computed.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   348
    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
   349
    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
   350
    SpaceMangler::mangle_region(mangle_region);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   351
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // Do not attempt an expand-to-the reserve size.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  // request should properly observe the maximum size of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  // the generation so an expand-to-reserve should be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  // unnecessary.  Also a second call to expand-to-reserve
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  // value potentially can cause an undue expansion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // For example if the first expand fail for unknown reasons,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  // but the second succeeds and expands the heap to its maximum
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  // value.
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35471
diff changeset
   361
  if (GCLocker::is_active()) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   362
    log_debug(gc)("Garbage collection disabled, expanded heap instead");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  return success;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
35458
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   368
size_t DefNewGeneration::adjust_for_thread_increase(size_t new_size_candidate,
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   369
                                                    size_t new_size_before,
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   370
                                                    size_t alignment) const {
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   371
  size_t desired_new_size = new_size_before;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   372
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   373
  if (NewSizeThreadIncrease > 0) {
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   374
    int threads_count;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   375
    size_t thread_increase_size = 0;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   376
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   377
    // 1. Check an overflow at 'threads_count * NewSizeThreadIncrease'.
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   378
    threads_count = Threads::number_of_non_daemon_threads();
35471
deb38c83d759 8146695: FinalizeTest04 crashes VM with EXCEPTION_INT_DIVIDE_BY_ZERO
sangheki
parents: 35458
diff changeset
   379
    if (threads_count > 0 && NewSizeThreadIncrease <= max_uintx / threads_count) {
35458
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   380
      thread_increase_size = threads_count * NewSizeThreadIncrease;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   381
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   382
      // 2. Check an overflow at 'new_size_candidate + thread_increase_size'.
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   383
      if (new_size_candidate <= max_uintx - thread_increase_size) {
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   384
        new_size_candidate += thread_increase_size;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   385
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   386
        // 3. Check an overflow at 'align_size_up'.
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   387
        size_t aligned_max = ((max_uintx - alignment) & ~(alignment-1));
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   388
        if (new_size_candidate <= aligned_max) {
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   389
          desired_new_size = align_size_up(new_size_candidate, alignment);
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   390
        }
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   391
      }
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   392
    }
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   393
  }
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   394
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   395
  return desired_new_size;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   396
}
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   397
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
void DefNewGeneration::compute_new_size() {
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   399
  // This is called after a GC that includes the old generation, so from-space
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   400
  // will normally be empty.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  // Note that we check both spaces, since if scavenge failed they revert roles.
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   402
  // If not we bail out (otherwise we would have to relocate the objects).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  if (!from()->is_empty() || !to()->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  GenCollectedHeap* gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   409
  size_t old_size = gch->old_gen()->capacity();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  size_t new_size_before = _virtual_space.committed_size();
33580
c2d95df2c54e 8139772: Cleanups in Generation related code
jwilhelm
parents: 33212
diff changeset
   411
  size_t min_new_size = initial_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  size_t max_new_size = reserved().byte_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  assert(min_new_size <= new_size_before &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
         new_size_before <= max_new_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
         "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // All space sizes must be multiples of Generation::GenGrain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  size_t alignment = Generation::GenGrain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
35458
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   419
  int threads_count = 0;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   420
  size_t thread_increase_size = 0;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   421
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   422
  size_t new_size_candidate = old_size / NewRatio;
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   423
  // Compute desired new generation size based on NewRatio and NewSizeThreadIncrease
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   424
  // and reverts to previous value if any overflow happens
71a08884be5f 8144527: NewSizeThreadIncrease would make an overflow
sangheki
parents: 35061
diff changeset
   425
  size_t desired_new_size = adjust_for_thread_increase(new_size_candidate, new_size_before, alignment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  // Adjust new generation size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  desired_new_size = MAX2(MIN2(desired_new_size, max_new_size), min_new_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  assert(desired_new_size <= max_new_size, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  bool changed = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  if (desired_new_size > new_size_before) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
    size_t change = desired_new_size - new_size_before;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    assert(change % alignment == 0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
    if (expand(change)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
       changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    // If the heap failed to expand to the desired size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    // "changed" will be false.  If the expansion failed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    // (and at this point it was expected to succeed),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    // ignore the failure (leaving "changed" as false).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  if (desired_new_size < new_size_before && eden()->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    // bail out of shrinking if objects in eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
    size_t change = new_size_before - desired_new_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    assert(change % alignment == 0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
    _virtual_space.shrink_by(change);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    changed = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  if (changed) {
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   451
    // 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
   452
    // 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
   453
    // 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
   454
    compute_space_boundaries(eden()->used(),
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   455
                             SpaceDecorator::Clear,
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   456
                             SpaceDecorator::DontMangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   457
    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
   458
                  (HeapWord*)_virtual_space.high());
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30155
diff changeset
   459
    gch->barrier_set()->resize_covered_region(cmr);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   460
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   461
    log_debug(gc, heap, ergo)(
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   462
        "New generation size " SIZE_FORMAT "K->" SIZE_FORMAT "K [eden=" SIZE_FORMAT "K,survivor=" SIZE_FORMAT "K]",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   463
        new_size_before/K, _virtual_space.committed_size()/K,
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   464
        eden()->capacity()/K, from()->capacity()/K);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   465
    log_trace(gc, heap, ergo)(
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   466
        "  [allowed " SIZE_FORMAT "K extra for %d threads]",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
          thread_increase_size/K, threads_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
30870
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30868
diff changeset
   471
void DefNewGeneration::younger_refs_iterate(OopsInGenClosure* cl, uint n_threads) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  assert(false, "NYI -- are you sure you want to call this?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
size_t DefNewGeneration::capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  return eden()->capacity()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
       + from()->capacity();  // to() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
size_t DefNewGeneration::used() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  return eden()->used()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
       + from()->used();      // to() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
size_t DefNewGeneration::free() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  return eden()->free()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
       + from()->free();      // to() is only used during scavenge
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
size_t DefNewGeneration::max_capacity() const {
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19286
diff changeset
   494
  const size_t alignment = GenCollectedHeap::heap()->collector_policy()->space_alignment();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  const size_t reserved_bytes = reserved().byte_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  return reserved_bytes - compute_survivor_size(reserved_bytes, alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
size_t DefNewGeneration::unsafe_max_alloc_nogc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  return eden()->free();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
size_t DefNewGeneration::capacity_before_gc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  return eden()->capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
size_t DefNewGeneration::contiguous_available() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  return eden()->free();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
HeapWord** DefNewGeneration::top_addr() const { return eden()->top_addr(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
HeapWord** DefNewGeneration::end_addr() const { return eden()->end_addr(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
void DefNewGeneration::object_iterate(ObjectClosure* blk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  eden()->object_iterate(blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  from()->object_iterate(blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
void DefNewGeneration::space_iterate(SpaceClosure* blk,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
                                     bool usedOnly) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  blk->do_space(eden());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  blk->do_space(from());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  blk->do_space(to());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
// The last collection bailed out, we are running out of heap space,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
// so we try to allocate the from-space, too.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
HeapWord* DefNewGeneration::allocate_from_space(size_t size) {
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35471
diff changeset
   531
  bool should_try_alloc = should_allocate_from_space() || GCLocker::is_active_and_needs_gc();
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   532
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   533
  // If the Heap_lock is not locked by this thread, this will be called
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   534
  // again later with the Heap_lock held.
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   535
  bool do_alloc = should_try_alloc && (Heap_lock->owned_by_self() || (SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread()));
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   536
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  HeapWord* result = NULL;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   538
  if (do_alloc) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   539
    result = from()->allocate(size);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   540
  }
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   541
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   542
  log_trace(gc, alloc)("DefNewGeneration::allocate_from_space(" SIZE_FORMAT "):  will_fail: %s  heap_lock: %s  free: " SIZE_FORMAT "%s%s returns %s",
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   543
                        size,
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   544
                        GenCollectedHeap::heap()->incremental_collection_will_fail(false /* don't consult_young */) ?
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   545
                          "true" : "false",
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   546
                        Heap_lock->is_locked() ? "locked" : "unlocked",
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   547
                        from()->free(),
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   548
                        should_try_alloc ? "" : "  should_allocate_from_space: NOT",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   549
                        do_alloc ? "  Heap_lock is not owned by self" : "",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   550
                        result == NULL ? "NULL" : "object");
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   551
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
HeapWord* DefNewGeneration::expand_and_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
                                                bool   is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
                                                bool   parallel) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  // We don't attempt to expand the young generation (but perhaps we should.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  return allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
15215
048f775ae371 8005972: ParNew should not update the tenuring threshold when promotion failed has occurred
brutisso
parents: 14583
diff changeset
   562
void DefNewGeneration::adjust_desired_tenuring_threshold() {
048f775ae371 8005972: ParNew should not update the tenuring threshold when promotion failed has occurred
brutisso
parents: 14583
diff changeset
   563
  // Set the desired survivor size to half the real survivor space
30147
af9a41999c6e 8076314: Remove the static instance variable SharedHeap:: _sh
brutisso
parents: 29800
diff changeset
   564
  GCPolicyCounters* gc_counters = GenCollectedHeap::heap()->collector_policy()->counters();
15215
048f775ae371 8005972: ParNew should not update the tenuring threshold when promotion failed has occurred
brutisso
parents: 14583
diff changeset
   565
  _tenuring_threshold =
30147
af9a41999c6e 8076314: Remove the static instance variable SharedHeap:: _sh
brutisso
parents: 29800
diff changeset
   566
    age_table()->compute_tenuring_threshold(to()->capacity()/HeapWordSize, gc_counters);
15215
048f775ae371 8005972: ParNew should not update the tenuring threshold when promotion failed has occurred
brutisso
parents: 14583
diff changeset
   567
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
void DefNewGeneration::collect(bool   full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
                               bool   clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
                               size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
                               bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  assert(full || size > 0, "otherwise we don't want to collect");
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   574
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  GenCollectedHeap* gch = GenCollectedHeap::heap();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   576
21767
41eaa9a17059 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 21561
diff changeset
   577
  _gc_timer->register_gc_start();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   578
  DefNewTracer gc_tracer;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   579
  gc_tracer.report_gc_start(gch->gc_cause(), _gc_timer->gc_start());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   580
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
   581
  _old_gen = gch->old_gen();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   583
  // If the next generation is too full to accommodate promotion
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  // from this generation, pass on collection; let the next generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  // do it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  if (!collection_attempt_is_safe()) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   587
    log_trace(gc)(":: Collection attempt not safe ::");
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   588
    gch->set_incremental_collection_failed(); // Slight lie: we did not even attempt one
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  assert(to()->is_empty(), "Else not collection_attempt_is_safe");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  init_assuming_no_promotion_failure();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   595
  GCTraceTime(Trace, gc) tm("DefNew", NULL, gch->gc_cause());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   597
  gch->trace_heap_before_gc(&gc_tracer);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   598
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  // These can be shared for all code paths
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  IsAliveClosure is_alive(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  ScanWeakRefClosure scan_weak_ref(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  age_table()->clear();
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   604
  to()->clear(SpaceDecorator::Mangle);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  gch->rem_set()->prepare_for_younger_refs_iterate(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
31780
613fc3da8884 8129961: SIGSEGV when copying to survivor space
ecaspole
parents: 31358
diff changeset
   608
  assert(gch->no_allocs_since_save_marks(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
         "save marks have not been newly set.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  // Not very pretty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  CollectorPolicy* cp = gch->collector_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  FastScanClosure fsc_with_no_gc_barrier(this, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  FastScanClosure fsc_with_gc_barrier(this, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   617
  KlassScanClosure klass_scan_closure(&fsc_with_no_gc_barrier,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   618
                                      gch->rem_set()->klass_rem_set());
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   619
  CLDToKlassAndOopClosure cld_scan_closure(&klass_scan_closure,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   620
                                           &fsc_with_no_gc_barrier,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   621
                                           false);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12630
diff changeset
   622
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  set_promo_failure_scan_stack_closure(&fsc_with_no_gc_barrier);
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   624
  FastEvacuateFollowersClosure evacuate_followers(gch,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
                                                  &fsc_with_no_gc_barrier,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
                                                  &fsc_with_gc_barrier);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
31780
613fc3da8884 8129961: SIGSEGV when copying to survivor space
ecaspole
parents: 31358
diff changeset
   628
  assert(gch->no_allocs_since_save_marks(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
         "save marks have not been newly set.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
30868
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   631
  {
30871
e90a8de769e4 8080113: Remove CollectedHeap::set_par_threads()
stefank
parents: 30870
diff changeset
   632
    // DefNew needs to run with n_threads == 0, to make sure the serial
e90a8de769e4 8080113: Remove CollectedHeap::set_par_threads()
stefank
parents: 30870
diff changeset
   633
    // version of the card table scanning code is used.
31964
d34ad1715d96 8130931: Refactor CardTableModRefBS[ForCTRS]
kbarrett
parents: 31780
diff changeset
   634
    // See: CardTableModRefBSForCTRS::non_clean_card_iterate_possibly_parallel.
30868
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   635
    StrongRootsScope srs(0);
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   636
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   637
    gch->gen_process_roots(&srs,
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   638
                           GenCollectedHeap::YoungGen,
30868
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   639
                           true,  // Process younger gens, if any,
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   640
                                  // as strong roots.
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   641
                           GenCollectedHeap::SO_ScavengeCodeCache,
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   642
                           GenCollectedHeap::StrongAndWeakRoots,
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   643
                           &fsc_with_no_gc_barrier,
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   644
                           &fsc_with_gc_barrier,
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   645
                           &cld_scan_closure);
c1b24f26deed 8080110: Remove usage of CollectedHeap::n_par_threads() from root processing
stefank
parents: 30764
diff changeset
   646
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  // "evacuate followers".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  evacuate_followers.do_void();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  FastKeepAliveClosure keep_alive(this, &scan_weak_ref);
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   652
  ReferenceProcessor* rp = ref_processor();
1610
5dddd195cc86 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 1606
diff changeset
   653
  rp->setup_policy(clear_all_soft_refs);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   654
  const ReferenceProcessorStats& stats =
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 1388
diff changeset
   655
  rp->process_discovered_references(&is_alive, &keep_alive, &evacuate_followers,
33107
77bf0d2069a3 8134953: Make the GC ID available in a central place
brutisso
parents: 32735
diff changeset
   656
                                    NULL, _gc_timer);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   657
  gc_tracer.report_gc_reference_stats(stats);
33143
2083f82acec8 8139134: Wrong tenuring threshold in young GC trace event
ehelin
parents: 33107
diff changeset
   658
  gc_tracer.report_tenuring_threshold(tenuring_threshold());
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   659
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   660
  if (!_promotion_failed) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
    // Swap the survivor spaces.
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   662
    eden()->clear(SpaceDecorator::Mangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   663
    from()->clear(SpaceDecorator::Mangle);
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   664
    if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   665
      // 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
   666
      // can check for valid mangling at intermediate points in the
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 31964
diff changeset
   667
      // collection(s).  When a young collection fails to collect
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   668
      // 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
   669
      // 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
   670
      // 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
   671
      // other spaces.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   672
      to()->mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   673
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    swap_spaces();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    assert(to()->is_empty(), "to space should be empty now");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
15215
048f775ae371 8005972: ParNew should not update the tenuring threshold when promotion failed has occurred
brutisso
parents: 14583
diff changeset
   678
    adjust_desired_tenuring_threshold();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   680
    // A successful scavenge should restart the GC time limit count which is
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   681
    // for full GC's.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   682
    AdaptiveSizePolicy* size_policy = gch->gen_policy()->size_policy();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4574
diff changeset
   683
    size_policy->reset_gc_overhead_limit_count();
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   684
    assert(!gch->incremental_collection_failed(), "Should be clear");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  } else {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   686
    assert(_promo_failure_scan_stack.is_empty(), "post condition");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   687
    _promo_failure_scan_stack.clear(true); // Clear cached segments.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
    remove_forwarding_pointers();
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   690
    log_debug(gc)("Promotion failed");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
    // Add to-space to the list of space to compact
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
    // when a promotion failure has occurred.  In that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
    // case there can be live objects in to-space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    // as a result of a partial evacuation of eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
    // and from-space.
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   696
    swap_spaces();   // For uniformity wrt ParNewGeneration.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
    from()->set_next_compaction_space(to());
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   698
    gch->set_incremental_collection_failed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   700
    // Inform the next generation that a promotion failure occurred.
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
   701
    _old_gen->promotion_failure_occurred();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   702
    gc_tracer.report_promotion_failed(_promotion_failed_info);
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 3908
diff changeset
   703
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    // Reset the PromotionFailureALot counters.
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30155
diff changeset
   705
    NOT_PRODUCT(gch->reset_promotion_should_fail();)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  // set new iteration safe limit for the survivor spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  from()->set_concurrent_iteration_safe_limit(from()->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  to()->set_concurrent_iteration_safe_limit(to()->top());
11755
e68b5a95367b 7129514: time warp warnings after 7117303
johnc
parents: 10565
diff changeset
   710
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   711
  // We need to use a monotonically non-decreasing time in ms
11755
e68b5a95367b 7129514: time warp warnings after 7117303
johnc
parents: 10565
diff changeset
   712
  // or we will see time-warp warnings and os::javaTimeMillis()
e68b5a95367b 7129514: time warp warnings after 7117303
johnc
parents: 10565
diff changeset
   713
  // does not guarantee monotonicity.
e68b5a95367b 7129514: time warp warnings after 7117303
johnc
parents: 10565
diff changeset
   714
  jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
e68b5a95367b 7129514: time warp warnings after 7117303
johnc
parents: 10565
diff changeset
   715
  update_time_of_last_gc(now);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   716
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   717
  gch->trace_heap_after_gc(&gc_tracer);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   718
21767
41eaa9a17059 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 21561
diff changeset
   719
  _gc_timer->register_gc_end();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   720
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   721
  gc_tracer.report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
class RemoveForwardPointerClosure: public ObjectClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  void do_object(oop obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
    obj->init_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
void DefNewGeneration::init_assuming_no_promotion_failure() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  _promotion_failed = false;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   733
  _promotion_failed_info.reset();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  from()->set_next_compaction_space(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
void DefNewGeneration::remove_forwarding_pointers() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  RemoveForwardPointerClosure rspc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  eden()->object_iterate(&rspc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  from()->object_iterate(&rspc);
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   741
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  // Now restore saved marks, if any.
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   743
  assert(_objs_with_preserved_marks.size() == _preserved_marks_of_objs.size(),
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   744
         "should be the same");
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   745
  while (!_objs_with_preserved_marks.is_empty()) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   746
    oop obj   = _objs_with_preserved_marks.pop();
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   747
    markOop m = _preserved_marks_of_objs.pop();
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   748
    obj->set_mark(m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  }
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   750
  _objs_with_preserved_marks.clear(true);
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   751
  _preserved_marks_of_objs.clear(true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
7658
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   754
void DefNewGeneration::preserve_mark(oop obj, markOop m) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   755
  assert(_promotion_failed && m->must_be_preserved_for_promotion_failure(obj),
7658
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   756
         "Oversaving!");
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   757
  _objs_with_preserved_marks.push(obj);
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   758
  _preserved_marks_of_objs.push(m);
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   759
}
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   760
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  if (m->must_be_preserved_for_promotion_failure(obj)) {
7658
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   763
    preserve_mark(obj, m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
void DefNewGeneration::handle_promotion_failure(oop old) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   768
  log_debug(gc, promotion)("Promotion failure size = %d) ", old->size());
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   769
7658
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   770
  _promotion_failed = true;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   771
  _promotion_failed_info.register_copy_failure(old->size());
7658
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7419
diff changeset
   772
  preserve_mark_if_necessary(old, old->mark());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  // forward to self
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  old->forward_to(old);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   776
  _promo_failure_scan_stack.push(old);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  if (!_promo_failure_drain_in_progress) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
    // prevent recursion in copy_to_survivor_space()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
    _promo_failure_drain_in_progress = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
    drain_promo_failure_scan_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
    _promo_failure_drain_in_progress = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   786
oop DefNewGeneration::copy_to_survivor_space(oop old) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  assert(is_in_reserved(old) && !old->is_forwarded(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
         "shouldn't be scavenging this oop");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  size_t s = old->size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  oop obj = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  // Try allocating obj in to-space (unless too old)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  if (old->age() < tenuring_threshold()) {
25905
04a3d83cc752 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 25492
diff changeset
   794
    obj = (oop) to()->allocate_aligned(s);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  // Otherwise try allocating obj tenured
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  if (obj == NULL) {
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
   799
    obj = _old_gen->promote(old, s);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
    if (obj == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
      handle_promotion_failure(old);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
      return old;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
    // Prefetch beyond obj
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    const intx interval = PrefetchCopyIntervalInBytes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    Prefetch::write(obj, interval);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    // Copy obj
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
    Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)obj, s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
    // Increment age if obj still in new generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    obj->incr_age();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
    age_table()->add(obj, s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // Done, insert forward pointer to obj in this header
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  old->forward_to(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  return obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
void DefNewGeneration::drain_promo_failure_scan_stack() {
6762
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   824
  while (!_promo_failure_scan_stack.is_empty()) {
f8d1b560700e 6423256: GC stacks should use a better data structure
jcoomes
parents: 5547
diff changeset
   825
     oop obj = _promo_failure_scan_stack.pop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
     obj->oop_iterate(_promo_failure_scan_stack_closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
void DefNewGeneration::save_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  eden()->set_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  to()->set_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  from()->set_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
void DefNewGeneration::reset_saved_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  eden()->reset_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  to()->reset_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  from()->reset_saved_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
bool DefNewGeneration::no_allocs_since_save_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  assert(eden()->saved_mark_at_top(), "Violated spec - alloc in eden");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  assert(from()->saved_mark_at_top(), "Violated spec - alloc in from");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  return to()->saved_mark_at_top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
#define DefNew_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
                                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
void DefNewGeneration::                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) {   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  cl->set_generation(this);                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  eden()->oop_since_save_marks_iterate##nv_suffix(cl);          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  to()->oop_since_save_marks_iterate##nv_suffix(cl);            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
  from()->oop_since_save_marks_iterate##nv_suffix(cl);          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  cl->reset_generation();                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
  save_marks();                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
ALL_SINCE_SAVE_MARKS_CLOSURES(DefNew_SINCE_SAVE_MARKS_DEFN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
#undef DefNew_SINCE_SAVE_MARKS_DEFN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
void DefNewGeneration::contribute_scratch(ScratchBlock*& list, Generation* requestor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
                                         size_t max_alloc_words) {
31358
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   868
  if (requestor == this || _promotion_failed) {
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   869
    return;
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   870
  }
693058672cc6 8077842: Remove the level parameter passed around in GenCollectedHeap
jwilhelm
parents: 31032
diff changeset
   871
  assert(GenCollectedHeap::heap()->is_old_gen(requestor), "We should not call our own generation");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  /* $$$ Assert this?  "trace" is a "MarkSweep" function so that's not appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  if (to_space->top() > to_space->bottom()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    trace("to_space not empty when contribute_scratch called");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  ContiguousSpace* to_space = to();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  assert(to_space->end() >= to_space->top(), "pointers out of order");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  size_t free_words = pointer_delta(to_space->end(), to_space->top());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  if (free_words >= MinFreeScratchWords) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
    ScratchBlock* sb = (ScratchBlock*)to_space->top();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
    sb->num_words = free_words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
    sb->next = list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
    list = sb;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   890
void DefNewGeneration::reset_scratch() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   891
  // 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
   892
  // 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
   893
  // 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
   894
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   895
    to()->mangle_unused_area_complete();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   896
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   897
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   898
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
bool DefNewGeneration::collection_attempt_is_safe() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  if (!to()->is_empty()) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   901
    log_trace(gc)(":: to is not empty ::");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  }
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
   904
  if (_old_gen == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
    GenCollectedHeap* gch = GenCollectedHeap::heap();
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
   906
    _old_gen = gch->old_gen();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  }
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
   908
  return _old_gen->promotion_attempt_is_safe(used());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
void DefNewGeneration::gc_epilogue(bool full) {
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   912
  DEBUG_ONLY(static bool seen_incremental_collection_failed = false;)
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   913
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35471
diff changeset
   914
  assert(!GCLocker::is_active(), "We should not be executing here");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  // Check if the heap is approaching full after a collection has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  // been done.  Generally the young generation is empty at
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  // a minimum at the end of a collection.  If it is not, then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  // the heap is approaching full.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  GenCollectedHeap* gch = GenCollectedHeap::heap();
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   920
  if (full) {
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   921
    DEBUG_ONLY(seen_incremental_collection_failed = false;)
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   922
    if (!collection_attempt_is_safe() && !_eden_space->is_empty()) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   923
      log_trace(gc)("DefNewEpilogue: cause(%s), full, not safe, set_failed, set_alloc_from, clear_seen",
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   924
                            GCCause::to_string(gch->gc_cause()));
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   925
      gch->set_incremental_collection_failed(); // Slight lie: a full gc left us in that state
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   926
      set_should_allocate_from_space(); // we seem to be running out of space
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   927
    } else {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   928
      log_trace(gc)("DefNewEpilogue: cause(%s), full, safe, clear_failed, clear_alloc_from, clear_seen",
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   929
                            GCCause::to_string(gch->gc_cause()));
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   930
      gch->clear_incremental_collection_failed(); // We just did a full collection
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   931
      clear_should_allocate_from_space(); // if set
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6762
diff changeset
   932
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  } else {
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   934
#ifdef ASSERT
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   935
    // It is possible that incremental_collection_failed() == true
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   936
    // here, because an attempted scavenge did not succeed. The policy
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   937
    // is normally expected to cause a full collection which should
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   938
    // clear that condition, so we should not be here twice in a row
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   939
    // with incremental_collection_failed() == true without having done
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   940
    // a full collection in between.
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   941
    if (!seen_incremental_collection_failed &&
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   942
        gch->incremental_collection_failed()) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   943
      log_trace(gc)("DefNewEpilogue: cause(%s), not full, not_seen_failed, failed, set_seen_failed",
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   944
                            GCCause::to_string(gch->gc_cause()));
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   945
      seen_incremental_collection_failed = true;
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   946
    } else if (seen_incremental_collection_failed) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34185
diff changeset
   947
      log_trace(gc)("DefNewEpilogue: cause(%s), not full, seen_failed, will_clear_seen_failed",
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   948
                            GCCause::to_string(gch->gc_cause()));
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   949
      assert(gch->gc_cause() == GCCause::_scavenge_alot ||
31032
8e72621ca186 8072913: [REDO] GCCause should distinguish jcmd GC.run from System.gc()
ysuenaga
parents: 30871
diff changeset
   950
             (GCCause::is_user_requested_gc(gch->gc_cause()) && UseConcMarkSweepGC && ExplicitGCInvokesConcurrent) ||
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   951
             !gch->incremental_collection_failed(),
7378
fe845b64d7fb 6998802: ScavengeALot: assert(!gch->incremental_collection_failed()) failed: Twice in a row
ysr
parents: 6986
diff changeset
   952
             "Twice in a row");
6986
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   953
      seen_incremental_collection_failed = false;
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   954
    }
daf18aec57b5 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 6985
diff changeset
   955
#endif // ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   958
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   959
    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
   960
    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
   961
    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
   962
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   963
10022
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 7658
diff changeset
   964
  if (!CleanChunkPoolAsync) {
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 7658
diff changeset
   965
    Chunk::clean_chunk_pool();
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 7658
diff changeset
   966
  }
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 7658
diff changeset
   967
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  // update the generation and space performance counters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  gch->collector_policy()->counters()->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   973
void DefNewGeneration::record_spaces_top() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   974
  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
   975
  eden()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   976
  to()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   977
  from()->set_top_for_allocations();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   978
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   979
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   980
void DefNewGeneration::ref_processor_init() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   981
  Generation::ref_processor_init();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   982
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17625
diff changeset
   983
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   984
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
void DefNewGeneration::update_counters() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  if (UsePerfData) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
    _eden_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
    _from_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
    _to_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
    _gen_counters->update_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11755
diff changeset
   994
void DefNewGeneration::verify() {
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11755
diff changeset
   995
  eden()->verify();
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11755
diff changeset
   996
  from()->verify();
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11755
diff changeset
   997
    to()->verify();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
void DefNewGeneration::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  Generation::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  st->print("  eden");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  eden()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  st->print("  from");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  from()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  st->print("  to  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  to()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
const char* DefNewGeneration::name() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  return "def new generation";
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
}
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1014
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1015
// 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
  1016
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
  1017
  return eden();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1018
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1019
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
  1020
HeapWord* DefNewGeneration::allocate(size_t word_size, bool is_tlab) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1021
  // 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
  1022
  // 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
  1023
  // 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
  1024
  // 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
  1025
  // 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
  1026
  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
  1027
  if (result != NULL) {
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
  1028
    if (CMSEdenChunksRecordAlways && _old_gen != NULL) {
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
  1029
      _old_gen->sample_eden_chunk();
18994
d32a17b7502c 6990419: CMS Remaining work for 6572569: consistently skewed work distribution in (long) re-mark pauses
jmasa
parents: 18687
diff changeset
  1030
    }
27625
07829380b8cd 8061308: Remove iCMS
brutisso
parents: 27252
diff changeset
  1031
  } else {
07829380b8cd 8061308: Remove iCMS
brutisso
parents: 27252
diff changeset
  1032
    // If the eden is full and the last collection bailed out, we are running
07829380b8cd 8061308: Remove iCMS
brutisso
parents: 27252
diff changeset
  1033
    // out of heap space, and we try to allocate the from-space, too.
07829380b8cd 8061308: Remove iCMS
brutisso
parents: 27252
diff changeset
  1034
    // allocate_from_space can't be inlined because that would introduce a
07829380b8cd 8061308: Remove iCMS
brutisso
parents: 27252
diff changeset
  1035
    // circular dependency at compile time.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1036
    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
  1037
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1038
  return result;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1039
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1040
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1041
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
  1042
                                         bool is_tlab) {
18994
d32a17b7502c 6990419: CMS Remaining work for 6572569: consistently skewed work distribution in (long) re-mark pauses
jmasa
parents: 18687
diff changeset
  1043
  HeapWord* res = eden()->par_allocate(word_size);
29684
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
  1044
  if (CMSEdenChunksRecordAlways && _old_gen != NULL) {
a36d90acae41 8057632: Remove auxiliary code used to handle the generations array
jwilhelm
parents: 29200
diff changeset
  1045
    _old_gen->sample_eden_chunk();
18994
d32a17b7502c 6990419: CMS Remaining work for 6572569: consistently skewed work distribution in (long) re-mark pauses
jmasa
parents: 18687
diff changeset
  1046
  }
d32a17b7502c 6990419: CMS Remaining work for 6572569: consistently skewed work distribution in (long) re-mark pauses
jmasa
parents: 18687
diff changeset
  1047
  return res;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1048
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1049
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1050
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
  1051
  return eden()->capacity();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1052
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1053
22552
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22550
diff changeset
  1054
size_t DefNewGeneration::tlab_used() const {
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22550
diff changeset
  1055
  return eden()->used();
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22550
diff changeset
  1056
}
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22550
diff changeset
  1057
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1058
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
  1059
  return unsafe_max_alloc_nogc();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1060
}