hotspot/src/share/vm/gc/parallel/parallelScavengeHeap.cpp
author tschatzl
Thu, 28 Jan 2016 13:30:12 +0100
changeset 35877 a2a62511d0f8
parent 35862 411842d0c882
child 37073 c39d0903390b
permissions -rw-r--r--
8146987: Improve Parallel GC Full GC by caching results of live_words_in_range() Summary: A large part of time in the parallel scavenge collector is spent finding out the amount of live words within memory ranges to find out where to move an object to. Try to incrementally calculate this value. Reviewed-by: tschatzl, mgerdin, jmasa Contributed-by: ray alex <sky1young@gmail.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
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: 7108
diff changeset
    25
#include "precompiled.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    26
#include "gc/parallel/adjoiningGenerations.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    27
#include "gc/parallel/adjoiningVirtualSpaces.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    28
#include "gc/parallel/cardTableExtension.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    29
#include "gc/parallel/gcTaskManager.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    30
#include "gc/parallel/generationSizer.hpp"
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
    31
#include "gc/parallel/objectStartArray.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    32
#include "gc/parallel/parallelScavengeHeap.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    33
#include "gc/parallel/psAdaptiveSizePolicy.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    34
#include "gc/parallel/psMarkSweep.hpp"
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
    35
#include "gc/parallel/psParallelCompact.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    36
#include "gc/parallel/psPromotionManager.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    37
#include "gc/parallel/psScavenge.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    38
#include "gc/parallel/vmPSOperations.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    39
#include "gc/shared/gcHeapSummary.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    40
#include "gc/shared/gcLocker.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30277
diff changeset
    41
#include "gc/shared/gcWhen.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
    42
#include "logging/log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    43
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    44
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    45
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    46
#include "runtime/vmThread.hpp"
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12379
diff changeset
    47
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    48
#include "utilities/vmError.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
PSYoungGen*  ParallelScavengeHeap::_young_gen = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
PSOldGen*    ParallelScavengeHeap::_old_gen = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
PSAdaptiveSizePolicy* ParallelScavengeHeap::_size_policy = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
PSGCAdaptivePolicyCounters* ParallelScavengeHeap::_gc_policy_counters = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
GCTaskManager* ParallelScavengeHeap::_gc_task_manager = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
jint ParallelScavengeHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4030
diff changeset
    57
  CollectedHeap::pre_initialize();
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4030
diff changeset
    58
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19322
diff changeset
    59
  const size_t heap_size = _collector_policy->max_heap_byte_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19322
diff changeset
    61
  ReservedSpace heap_rs = Universe::reserve_heap(heap_size, _collector_policy->heap_alignment());
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12379
diff changeset
    62
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19322
diff changeset
    63
  os::trace_page_sizes("ps main", _collector_policy->min_heap_byte_size(),
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19322
diff changeset
    64
                       heap_size, generation_alignment(),
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    65
                       heap_rs.base(),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    66
                       heap_rs.size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
26829
26315213bab8 8055091: CollectedHeap::_reserved usage should be cleaned up
mlarsson
parents: 26160
diff changeset
    68
  initialize_reserved_region((HeapWord*)heap_rs.base(), (HeapWord*)(heap_rs.base() + heap_rs.size()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
27687
3a6367d7110b 8064721: The card tables only ever need two covering regions
ehelin
parents: 26829
diff changeset
    70
  CardTableExtension* const barrier_set = new CardTableExtension(reserved_region());
26160
aba6b01cb988 8038423: G1: Decommit memory within heap
tschatzl
parents: 24941
diff changeset
    71
  barrier_set->initialize();
30152
5fe1c8494b49 8076454: Clean up/move things out of SharedHeap
brutisso
parents: 29803
diff changeset
    72
  set_barrier_set(barrier_set);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // Make up the generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // Calculate the maximum size that a generation can grow.  This
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  // includes growth into the other generation.  Note that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // parameter _max_gen_size is kept as the maximum
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // size of the generation as the boundaries currently stand.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // _max_gen_size is still used as that value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  double max_gc_pause_sec = ((double) MaxGCPauseMillis)/1000.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19322
diff changeset
    83
  _gens = new AdjoiningGenerations(heap_rs, _collector_policy, generation_alignment());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  _old_gen = _gens->old_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  _young_gen = _gens->young_gen();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  const size_t eden_capacity = _young_gen->eden_space()->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  const size_t old_capacity = _old_gen->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  const size_t initial_promo_size = MIN2(eden_capacity, old_capacity);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  _size_policy =
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    new PSAdaptiveSizePolicy(eden_capacity,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
                             initial_promo_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
                             young_gen()->to_space()->capacity_in_bytes(),
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 19322
diff changeset
    95
                             _collector_policy->gen_alignment(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
                             max_gc_pause_sec,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
                             max_gc_minor_pause_sec,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
                             GCTimeRatio
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
                             );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  assert(!UseAdaptiveGCBoundary ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    (old_gen()->virtual_space()->high_boundary() ==
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
     young_gen()->virtual_space()->low_boundary()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    "Boundaries must meet");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // initialize the policy counters - 2 collectors, 3 generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  _gc_policy_counters =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    new PSGCAdaptivePolicyCounters("ParScav:MSC", 2, 3, _size_policy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Set up the GCTaskManager
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  _gc_task_manager = GCTaskManager::create(ParallelGCThreads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  if (UseParallelOldGC && !PSParallelCompact::initialize()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    return JNI_ENOMEM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
void ParallelScavengeHeap::post_initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // Need to init the tenuring threshold
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  PSScavenge::initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  if (UseParallelOldGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    PSParallelCompact::post_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    PSMarkSweep::initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  PSPromotionManager::initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
void ParallelScavengeHeap::update_counters() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  young_gen()->update_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  old_gen()->update_counters();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   133
  MetaspaceCounters::update_performance_counters();
19322
e35f9ed4f081 8014659: NPG: performance counters for compressed klass space
ehelin
parents: 18025
diff changeset
   134
  CompressedClassSpaceCounters::update_performance_counters();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
size_t ParallelScavengeHeap::capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  size_t value = young_gen()->capacity_in_bytes() + old_gen()->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  return value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
size_t ParallelScavengeHeap::used() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  size_t value = young_gen()->used_in_bytes() + old_gen()->used_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  return value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
bool ParallelScavengeHeap::is_maximal_no_gc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  return old_gen()->is_maximal_no_gc() && young_gen()->is_maximal_no_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
size_t ParallelScavengeHeap::max_capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  size_t estimated = reserved_region().byte_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  if (UseAdaptiveSizePolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    estimated -= _size_policy->max_survivor_size(young_gen()->max_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    estimated -= young_gen()->to_space()->capacity_in_bytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  return MAX2(estimated, capacity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
bool ParallelScavengeHeap::is_in(const void* p) const {
30177
925cd0b4f0e7 8077403: Remove guarantee from GenCollectedHeap::is_in()
brutisso
parents: 30173
diff changeset
   163
  return young_gen()->is_in(p) || old_gen()->is_in(p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
bool ParallelScavengeHeap::is_in_reserved(const void* p) const {
30177
925cd0b4f0e7 8077403: Remove guarantee from GenCollectedHeap::is_in()
brutisso
parents: 30173
diff changeset
   167
  return young_gen()->is_in_reserved(p) || old_gen()->is_in_reserved(p);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 8321
diff changeset
   170
bool ParallelScavengeHeap::is_scavengable(const void* addr) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 8321
diff changeset
   171
  return is_in_young((oop)addr);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 8321
diff changeset
   172
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 8321
diff changeset
   173
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
// There are two levels of allocation policy here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
// When an allocation request fails, the requesting thread must invoke a VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
// operation, transfer control to the VM thread, and await the results of a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
// garbage collection. That is quite expensive, and we should avoid doing it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
// multiple times if possible.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
// To accomplish this, we have a basic allocation policy, and also a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
// failed allocation policy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
// The basic allocation policy controls how you allocate memory without
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
// attempting garbage collection. It is okay to grab locks and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
// expand the heap, if that can be done without coming to a safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
// It is likely that the basic allocation policy will not be very
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
// aggressive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
// The failed allocation policy is invoked from the VM thread after
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
// the basic allocation policy is unable to satisfy a mem_allocate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
// request. This policy needs to cover the entire range of collection,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
// heap expansion, and out-of-memory conditions. It should make every
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
// attempt to allocate the requested memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
// Basic allocation policy. Should never be called at a safepoint, or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
// from the VM thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
// This method must handle cases where many mem_allocate requests fail
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
// simultaneously. When that happens, only one VM operation will succeed,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
// and the rest will not be executed. For that reason, this method loops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
// during failed allocation attempts. If the java heap becomes exhausted,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
// we rely on the size_policy object to force a bail out.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
HeapWord* ParallelScavengeHeap::mem_allocate(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
                                     size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
                                     bool* gc_overhead_limit_was_exceeded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  assert(!SafepointSynchronize::is_at_safepoint(), "should not be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  assert(Thread::current() != (Thread*)VMThread::vm_thread(), "should not be in vm thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   211
  // In general gc_overhead_limit_was_exceeded should be false so
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   212
  // set it so here and reset it to true only if the gc time
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   213
  // limit is being exceeded as checked below.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   214
  *gc_overhead_limit_was_exceeded = false;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   215
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   216
  HeapWord* result = young_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  uint loop_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  uint gc_count = 0;
29078
3b7dd035c20b 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 28940
diff changeset
   220
  uint gclocker_stalled_count = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  while (result == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    // We don't want to have multiple collections for a single filled generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    // To prevent this, each thread tracks the total_collections() value, and if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    // the count has changed, does not do a new collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    // The collection count must be read only while holding the heap lock. VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    // operations also hold the heap lock during collections. There is a lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    // contention case where thread A blocks waiting on the Heap_lock, while
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    // thread B is holding it doing a collection. When thread A gets the lock,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    // the collection count has already changed. To prevent duplicate collections,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    // The policy MUST attempt allocations during the same period it reads the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    // total_collections() value!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
      MutexLocker ml(Heap_lock);
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30152
diff changeset
   236
      gc_count = total_collections();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   238
      result = young_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
      if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
        return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
      }
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   242
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   243
      // If certain conditions hold, try allocating from the old gen.
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   244
      result = mem_allocate_old_gen(size);
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   245
      if (result != NULL) {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   246
        return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
      }
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   248
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 16386
diff changeset
   249
      if (gclocker_stalled_count > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 16386
diff changeset
   250
        return NULL;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 16386
diff changeset
   251
      }
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 16386
diff changeset
   252
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   253
      // Failed to allocate without a gc.
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35061
diff changeset
   254
      if (GCLocker::is_active_and_needs_gc()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
        // If this thread is not in a jni critical section, we stall
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
        // the requestor until the critical section has cleared and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
        // GC allowed. When the critical section clears, a GC is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
        // initiated by the last thread exiting the critical section; so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
        // we retry the allocation sequence from the beginning of the loop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
        // rather than causing more, now probably unnecessary, GC attempts.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
        JavaThread* jthr = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
        if (!jthr->in_critical()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
          MutexUnlocker mul(Heap_lock);
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35061
diff changeset
   264
          GCLocker::stall_until_clear();
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 16386
diff changeset
   265
          gclocker_stalled_count += 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
          if (CheckJNICalls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
            fatal("Possible deadlock due to allocating while"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
                  " in jni critical section");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
          return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    if (result == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
      // Generate a VM operation
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   279
      VM_ParallelGCFailedAllocation op(size, gc_count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
      VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
      // Did the VM operation execute? If so, return the result directly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
      // This prevents us from looping until time out on requests that can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
      // not be satisfied.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
      if (op.prologue_succeeded()) {
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30152
diff changeset
   286
        assert(is_in_or_null(op.result()), "result not in heap");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
        // If GC was locked out during VM operation then retry allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
        // and/or stall as necessary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
        if (op.gc_locked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
          assert(op.result() == NULL, "must be NULL if gc_locked() is true");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
          continue;  // retry and/or stall as necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
        }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   294
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   295
        // Exit the loop if the gc time limit has been exceeded.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   296
        // The allocation must have failed above ("result" guarding
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   297
        // this path is NULL) and the most recent collection has exceeded the
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   298
        // gc overhead limit (although enough may have been collected to
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   299
        // satisfy the allocation).  Exit the loop so that an out-of-memory
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   300
        // will be thrown (return a NULL ignoring the contents of
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   301
        // op.result()),
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   302
        // but clear gc_overhead_limit_exceeded so that the next collection
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   303
        // starts with a clean slate (i.e., forgets about previous overhead
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   304
        // excesses).  Fill op.result() with a filler object so that the
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   305
        // heap remains parsable.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   306
        const bool limit_exceeded = size_policy()->gc_overhead_limit_exceeded();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   307
        const bool softrefs_clear = collector_policy()->all_soft_refs_clear();
15959
9a29e0e3a633 6976528: PS: assert(!limit_exceeded || softrefs_clear) failed: Should have been cleared
jmasa
parents: 13728
diff changeset
   308
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   309
        if (limit_exceeded && softrefs_clear) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   310
          *gc_overhead_limit_was_exceeded = true;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   311
          size_policy()->set_gc_overhead_limit_exceeded(false);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   312
          log_trace(gc)("ParallelScavengeHeap::mem_allocate: return NULL because gc_overhead_limit_exceeded is set");
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   313
          if (op.result() != NULL) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   314
            CollectedHeap::fill_with_object(op.result(), size);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   315
          }
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   316
          return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
        }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4637
diff changeset
   318
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
        return op.result();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    // The policy object will prevent us from looping forever. If the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    // time spent in gc crosses a threshold, we will bail out.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    loop_count++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    if ((result == NULL) && (QueuedAllocationWarningCount > 0) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
        (loop_count % QueuedAllocationWarningCount == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
      warning("ParallelScavengeHeap::mem_allocate retries %d times \n\t"
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 23470
diff changeset
   329
              " size=" SIZE_FORMAT, loop_count, size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   336
// A "death march" is a series of ultra-slow allocations in which a full gc is
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   337
// done before each allocation, and after the full gc the allocation still
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   338
// cannot be satisfied from the young gen.  This routine detects that condition;
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   339
// it should be called after a full gc has been done and the allocation
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   340
// attempted from the young gen. The parameter 'addr' should be the result of
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   341
// that young gen allocation attempt.
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   342
void
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   343
ParallelScavengeHeap::death_march_check(HeapWord* const addr, size_t size) {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   344
  if (addr != NULL) {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   345
    _death_march_count = 0;  // death march has ended
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   346
  } else if (_death_march_count == 0) {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   347
    if (should_alloc_in_eden(size)) {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   348
      _death_march_count = 1;    // death march has started
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   349
    }
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   350
  }
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   351
}
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   352
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   353
HeapWord* ParallelScavengeHeap::mem_allocate_old_gen(size_t size) {
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35061
diff changeset
   354
  if (!should_alloc_in_eden(size) || GCLocker::is_active_and_needs_gc()) {
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   355
    // Size is too big for eden, or gc is locked out.
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   356
    return old_gen()->allocate(size);
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   357
  }
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   358
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   359
  // If a "death march" is in progress, allocate from the old gen a limited
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   360
  // number of times before doing a GC.
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   361
  if (_death_march_count > 0) {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   362
    if (_death_march_count < 64) {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   363
      ++_death_march_count;
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   364
      return old_gen()->allocate(size);
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   365
    } else {
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   366
      _death_march_count = 0;
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   367
    }
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   368
  }
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   369
  return NULL;
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   370
}
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   371
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   372
void ParallelScavengeHeap::do_full_collection(bool clear_all_soft_refs) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   373
  if (UseParallelOldGC) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   374
    // The do_full_collection() parameter clear_all_soft_refs
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   375
    // is interpreted here as maximum_compaction which will
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   376
    // cause SoftRefs to be cleared.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   377
    bool maximum_compaction = clear_all_soft_refs;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   378
    PSParallelCompact::invoke(maximum_compaction);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   379
  } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   380
    PSMarkSweep::invoke(clear_all_soft_refs);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   381
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   382
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   383
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
// Failed allocation policy. Must be called from the VM thread, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
// only at a safepoint! Note that this method has policy for allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
// flow, and NOT collection policy. So we do not check for gc collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
// time over limit here, that is the responsibility of the heap specific
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
// collection methods. This method decides where to attempt allocations,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
// and when to attempt collections, but no collection specific policy.
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   390
HeapWord* ParallelScavengeHeap::failed_mem_allocate(size_t size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread");
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30152
diff changeset
   393
  assert(!is_gc_active(), "not reentrant");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   396
  // We assume that allocation in eden will fail unless we collect.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  // First level allocation failure, scavenge and allocate in young gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  GCCauseSetter gccs(this, GCCause::_allocation_failure);
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   400
  const bool invoked_full_gc = PSScavenge::invoke();
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   401
  HeapWord* result = young_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  // Second level allocation failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  //   Mark sweep and allocate in young generation.
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   405
  if (result == NULL && !invoked_full_gc) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   406
    do_full_collection(false);
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   407
    result = young_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
11758
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   410
  death_march_check(result, size);
b1a0089f89d2 6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents: 10997
diff changeset
   411
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // Third level allocation failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  //   After mark sweep and young generation allocation failure,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  //   allocate in old generation.
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   415
  if (result == NULL) {
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   416
    result = old_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  // Fourth level allocation failure. We're running out of memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  //   More complete mark sweep and allocate in young generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  if (result == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   422
    do_full_collection(true);
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   423
    result = young_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  // Fifth level allocation failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  //   After more complete mark sweep, allocate in old generation.
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   428
  if (result == NULL) {
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   429
    result = old_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
void ParallelScavengeHeap::ensure_parsability(bool retire_tlabs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  CollectedHeap::ensure_parsability(retire_tlabs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  young_gen()->eden_space()->ensure_parsability();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
size_t ParallelScavengeHeap::tlab_capacity(Thread* thr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  return young_gen()->eden_space()->tlab_capacity(thr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
22552
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   444
size_t ParallelScavengeHeap::tlab_used(Thread* thr) const {
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   445
  return young_gen()->eden_space()->tlab_used(thr);
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   446
}
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   447
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
size_t ParallelScavengeHeap::unsafe_max_tlab_alloc(Thread* thr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  return young_gen()->eden_space()->unsafe_max_tlab_alloc(thr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
HeapWord* ParallelScavengeHeap::allocate_new_tlab(size_t size) {
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   453
  return young_gen()->allocate(size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
void ParallelScavengeHeap::accumulate_statistics_all_tlabs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  CollectedHeap::accumulate_statistics_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
void ParallelScavengeHeap::resize_all_tlabs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  CollectedHeap::resize_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   464
bool ParallelScavengeHeap::can_elide_initializing_store_barrier(oop new_obj) {
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   465
  // We don't need barriers for stores to objects in the
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   466
  // young gen and, a fortiori, for initializing stores to
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   467
  // objects therein.
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   468
  return is_in_young(new_obj);
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   469
}
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   470
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
// This method is used by System.gc() and JVMTI.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
void ParallelScavengeHeap::collect(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  assert(!Heap_lock->owned_by_self(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
    "this thread should not own the Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
29078
3b7dd035c20b 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 28940
diff changeset
   476
  uint gc_count      = 0;
3b7dd035c20b 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 28940
diff changeset
   477
  uint full_gc_count = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
    MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
    // This value is guarded by the Heap_lock
30173
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30152
diff changeset
   481
    gc_count      = total_collections();
13cf7580b000 8077413: Avoid use of Universe::heap() inside collectors
pliden
parents: 30152
diff changeset
   482
    full_gc_count = total_full_collections();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  VM_ParallelGCSystemGC op(gc_count, full_gc_count, cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
void ParallelScavengeHeap::object_iterate(ObjectClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  young_gen()->object_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  old_gen()->object_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
HeapWord* ParallelScavengeHeap::block_start(const void* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  if (young_gen()->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
    assert(young_gen()->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
           "addr should be in allocated part of young gen");
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 5547
diff changeset
   499
    // called from os::print_location by find or VMError
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 5547
diff changeset
   500
    if (Debugging || VMError::fatal_error_in_progress())  return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  } else if (old_gen()->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
    assert(old_gen()->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
           "addr should be in allocated part of old gen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    return old_gen()->start_array()->object_start((HeapWord*)addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
size_t ParallelScavengeHeap::block_size(const HeapWord* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  return oop(addr)->size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
bool ParallelScavengeHeap::block_is_obj(const HeapWord* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  return block_start(addr) == addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
jlong ParallelScavengeHeap::millis_since_last_gc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  return UseParallelOldGC ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
    PSParallelCompact::millis_since_last_gc() :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    PSMarkSweep::millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
void ParallelScavengeHeap::prepare_for_verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  ensure_parsability(false);  // no need to retire TLABs for verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   528
PSHeapSummary ParallelScavengeHeap::create_ps_heap_summary() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   529
  PSOldGen* old = old_gen();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   530
  HeapWord* old_committed_end = (HeapWord*)old->virtual_space()->committed_high_addr();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   531
  VirtualSpaceSummary old_summary(old->reserved().start(), old_committed_end, old->reserved().end());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   532
  SpaceSummary old_space(old->reserved().start(), old_committed_end, old->used_in_bytes());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   533
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   534
  PSYoungGen* young = young_gen();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   535
  VirtualSpaceSummary young_summary(young->reserved().start(),
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   536
    (HeapWord*)young->virtual_space()->committed_high_addr(), young->reserved().end());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   537
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   538
  MutableSpace* eden = young_gen()->eden_space();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   539
  SpaceSummary eden_space(eden->bottom(), eden->end(), eden->used_in_bytes());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   540
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   541
  MutableSpace* from = young_gen()->from_space();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   542
  SpaceSummary from_space(from->bottom(), from->end(), from->used_in_bytes());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   543
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   544
  MutableSpace* to = young_gen()->to_space();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   545
  SpaceSummary to_space(to->bottom(), to->end(), to->used_in_bytes());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   546
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   547
  VirtualSpaceSummary heap_summary = create_heap_space_summary();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   548
  return PSHeapSummary(heap_summary, used(), old_summary, old_space, young_summary, eden_space, from_space, to_space);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   549
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   550
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
void ParallelScavengeHeap::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  young_gen()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  old_gen()->print_on(st);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   554
  MetaspaceAux::print_on(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   557
void ParallelScavengeHeap::print_on_error(outputStream* st) const {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   558
  this->CollectedHeap::print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   559
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   560
  if (UseParallelOldGC) {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   561
    st->cr();
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   562
    PSParallelCompact::print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   563
  }
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   564
}
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16604
diff changeset
   565
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
void ParallelScavengeHeap::gc_threads_do(ThreadClosure* tc) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  PSScavenge::gc_task_manager()->threads_do(tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
void ParallelScavengeHeap::print_gc_threads_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  PSScavenge::gc_task_manager()->print_threads_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
void ParallelScavengeHeap::print_tracing_info() const {
24941
4ebbe176a7b1 8042298: Remove the names gen0 and gen1 from the GC code
jwilhelm
parents: 24424
diff changeset
   575
  if (TraceYoungGenTime) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
    double time = PSScavenge::accumulated_time()->seconds();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
    tty->print_cr("[Accumulated GC generation 0 time %3.7f secs]", time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  }
24941
4ebbe176a7b1 8042298: Remove the names gen0 and gen1 from the GC code
jwilhelm
parents: 24424
diff changeset
   579
  if (TraceOldGenTime) {
16386
e436eb52ae05 6733980: par compact - TraceGen1Time always shows 0.0000 seconds
tschatzl
parents: 15959
diff changeset
   580
    double time = UseParallelOldGC ? PSParallelCompact::accumulated_time()->seconds() : PSMarkSweep::accumulated_time()->seconds();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    tty->print_cr("[Accumulated GC generation 1 time %3.7f secs]", time);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   586
void ParallelScavengeHeap::verify(VerifyOption option /* ignored */) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  // Why do we need the total_collections()-filter below?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  if (total_collections() > 0) {
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   589
    log_debug(gc, verify)("Tenured");
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11758
diff changeset
   590
    old_gen()->verify();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 30764
diff changeset
   592
    log_debug(gc, verify)("Eden");
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11758
diff changeset
   593
    young_gen()->verify();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
28940
c314cf1db3fa 8066566: Refactor ParNewGeneration to contain ParNewTracer
mlarsson
parents: 27687
diff changeset
   597
void ParallelScavengeHeap::trace_heap(GCWhen::Type when, const GCTracer* gc_tracer) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   598
  const PSHeapSummary& heap_summary = create_ps_heap_summary();
23470
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 22552
diff changeset
   599
  gc_tracer->report_gc_heap_summary(when, heap_summary);
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 22552
diff changeset
   600
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   601
  const MetaspaceSummary& metaspace_summary = create_metaspace_summary();
23470
ff2a7ea4225d 8036703: Add trace event with statistics for the metaspace chunk free lists
ehelin
parents: 22552
diff changeset
   602
  gc_tracer->report_metaspace_summary(when, metaspace_summary);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   603
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 16685
diff changeset
   604
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
ParallelScavengeHeap* ParallelScavengeHeap::heap() {
30258
413e15d1b146 8077415: Remove duplicate variables holding the CollectedHeap
pliden
parents: 30177
diff changeset
   606
  CollectedHeap* heap = Universe::heap();
413e15d1b146 8077415: Remove duplicate variables holding the CollectedHeap
pliden
parents: 30177
diff changeset
   607
  assert(heap != NULL, "Uninitialized access to ParallelScavengeHeap::heap()");
413e15d1b146 8077415: Remove duplicate variables holding the CollectedHeap
pliden
parents: 30177
diff changeset
   608
  assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Not a ParallelScavengeHeap");
413e15d1b146 8077415: Remove duplicate variables holding the CollectedHeap
pliden
parents: 30177
diff changeset
   609
  return (ParallelScavengeHeap*)heap;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
// Before delegating the resize to the young generation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
// the reserved space for the young and old generations
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22203
diff changeset
   614
// may be changed to accommodate the desired resize.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
void ParallelScavengeHeap::resize_young_gen(size_t eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
    size_t survivor_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  if (UseAdaptiveGCBoundary) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
    if (size_policy()->bytes_absorbed_from_eden() != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
      size_policy()->reset_bytes_absorbed_from_eden();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
      return;  // The generation changed size already.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    gens()->adjust_boundary_for_young_gen_needs(eden_size, survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  // Delegate the resize to the generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  _young_gen->resize(eden_size, survivor_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
// Before delegating the resize to the old generation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
// the reserved space for the young and old generations
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22203
diff changeset
   631
// may be changed to accommodate the desired resize.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
void ParallelScavengeHeap::resize_old_gen(size_t desired_free_space) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  if (UseAdaptiveGCBoundary) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
    if (size_policy()->bytes_absorbed_from_eden() != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
      size_policy()->reset_bytes_absorbed_from_eden();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
      return;  // The generation changed size already.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
    gens()->adjust_boundary_for_old_gen_needs(desired_free_space);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  // Delegate the resize to the generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  _old_gen->resize(desired_free_space);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
}
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   644
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   645
ParallelScavengeHeap::ParStrongRootsScope::ParStrongRootsScope() {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   646
  // nothing particular
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   647
}
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   648
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   649
ParallelScavengeHeap::ParStrongRootsScope::~ParStrongRootsScope() {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   650
  // nothing particular
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   651
}
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   652
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   653
#ifndef PRODUCT
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   654
void ParallelScavengeHeap::record_gen_tops_before_GC() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   655
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   656
    young_gen()->record_spaces_top();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   657
    old_gen()->record_spaces_top();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   658
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   659
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   660
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   661
void ParallelScavengeHeap::gen_mangle_unused_area() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   662
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   663
    young_gen()->eden_space()->mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   664
    young_gen()->to_space()->mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   665
    young_gen()->from_space()->mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   666
    old_gen()->object_space()->mangle_unused_area();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   667
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   668
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 386
diff changeset
   669
#endif