hotspot/src/share/vm/memory/genCollectedHeap.cpp
author tschatzl
Mon, 21 Jul 2014 10:00:31 +0200
changeset 25730 7eb4e685f739
parent 25492 d27050bdfb04
child 26183 bbe259d3c8bc
permissions -rw-r--r--
8048112: G1 Full GC needs to support the case when the very first region is not available Summary: Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett. Reviewed-by: brutisso
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24353
diff changeset
     2
 * Copyright (c) 2000, 2014, 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: 5433
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5433
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: 5433
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: 6985
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    26
#include "classfile/symbolTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    27
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    28
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    29
#include "code/icBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    30
#include "gc_implementation/shared/collectorCounters.hpp"
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24941
diff changeset
    31
#include "gc_implementation/shared/gcTrace.hpp"
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17112
diff changeset
    32
#include "gc_implementation/shared/gcTraceTime.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    33
#include "gc_implementation/shared/vmGCOperations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    34
#include "gc_interface/collectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    35
#include "memory/filemap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    36
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    37
#include "memory/genCollectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    38
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    39
#include "memory/generation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    40
#include "memory/generationSpec.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    41
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    42
#include "memory/sharedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    43
#include "memory/space.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    44
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    45
#include "oops/oop.inline2.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    46
#include "runtime/biasedLocking.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    47
#include "runtime/fprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    48
#include "runtime/handles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    49
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    50
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    51
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    52
#include "services/memoryService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    53
#include "utilities/vmError.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    54
#include "utilities/workgroup.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
    55
#include "utilities/macros.hpp"
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
    56
#if INCLUDE_ALL_GCS
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    57
#include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    58
#include "gc_implementation/concurrentMarkSweep/vmCMSOperations.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
    59
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
GenCollectedHeap* GenCollectedHeap::_gch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
NOT_PRODUCT(size_t GenCollectedHeap::_skip_header_HeapWords = 0;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
    64
// The set of potentially parallel tasks in root scanning.
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
    65
enum GCH_strong_roots_tasks {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  // We probably want to parallelize both of these internally, but for now...
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  GCH_PS_younger_gens,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  // Leave this one last.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  GCH_PS_NumElements
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
GenCollectedHeap::GenCollectedHeap(GenCollectorPolicy *policy) :
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  SharedHeap(policy),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  _gen_policy(policy),
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
    75
  _gen_process_roots_tasks(new SubTasksDone(GCH_PS_NumElements)),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  _full_collections_completed(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
{
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
    78
  if (_gen_process_roots_tasks == NULL ||
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
    79
      !_gen_process_roots_tasks->valid()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    vm_exit_during_initialization("Failed necessary allocation.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  assert(policy != NULL, "Sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
jint GenCollectedHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 3908
diff changeset
    86
  CollectedHeap::pre_initialize();
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 3908
diff changeset
    87
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  _n_gens = gen_policy()->number_of_generations();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // While there are no constraints in the GC code that HeapWordSize
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  // be any particular value, there are multiple other areas in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // system which believe this to be true (e.g. oop->object_size in some
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // cases incorrectly returns the size in wordSize units rather than
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // HeapWordSize).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // The heap must be at least as aligned as generations.
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
    99
  size_t gen_alignment = Generation::GenGrain;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  _gen_specs = gen_policy()->generations();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  // Make sure the sizes are all aligned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  for (i = 0; i < _n_gens; i++) {
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   105
    _gen_specs[i]->align(gen_alignment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // Allocate space for the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  char* heap_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  size_t total_reserved = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  int n_covered_regions = 0;
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   113
  ReservedSpace heap_rs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
21561
c619b1cb4554 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 21560
diff changeset
   115
  size_t heap_alignment = collector_policy()->heap_alignment();
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   116
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   117
  heap_address = allocate(heap_alignment, &total_reserved,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
                          &n_covered_regions, &heap_rs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  if (!heap_rs.is_reserved()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    vm_shutdown_during_initialization(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
      "Could not reserve enough space for object heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    return JNI_ENOMEM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  _reserved = MemRegion((HeapWord*)heap_rs.base(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
                        (HeapWord*)(heap_rs.base() + heap_rs.size()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // It is important to do this in a way such that concurrent readers can't
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22550
diff changeset
   130
  // temporarily think something is in the heap.  (Seen this happen in asserts.)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  _reserved.set_word_size(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  _reserved.set_start((HeapWord*)heap_rs.base());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   133
  size_t actual_heap_size = heap_rs.size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  _reserved.set_end((HeapWord*)(heap_rs.base() + actual_heap_size));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  _rem_set = collector_policy()->create_rem_set(_reserved, n_covered_regions);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  set_barrier_set(rem_set()->bs());
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 3908
diff changeset
   138
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  _gch = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  for (i = 0; i < _n_gens; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   142
    ReservedSpace this_rs = heap_rs.first_part(_gen_specs[i]->max_size(), false, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    _gens[i] = _gen_specs[i]->init(this_rs, i, rem_set());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    heap_rs = heap_rs.last_part(_gen_specs[i]->max_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   146
  clear_incremental_collection_failed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
   148
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  // If we are running CMS, create the collector responsible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // for collecting the CMS generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  if (collector_policy()->is_concurrent_mark_sweep_policy()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    bool success = create_cms_collector();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    if (!success) return JNI_ENOMEM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
   155
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
char* GenCollectedHeap::allocate(size_t alignment,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
                                 size_t* _total_reserved,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
                                 int* _n_covered_regions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
                                 ReservedSpace* heap_rs){
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  const char overflow_msg[] = "The size of the object heap + VM data exceeds "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    "the maximum representable size";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // Now figure out the total size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  size_t total_reserved = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  int n_covered_regions = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  const size_t pageSize = UseLargePages ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
      os::large_page_size() : os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   174
  assert(alignment % pageSize == 0, "Must be");
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   175
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    total_reserved += _gen_specs[i]->max_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    if (total_reserved < _gen_specs[i]->max_size()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
      vm_exit_during_initialization(overflow_msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    n_covered_regions += _gen_specs[i]->n_covered_regions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  }
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   183
  assert(total_reserved % alignment == 0,
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   184
         err_msg("Gen size; total_reserved=" SIZE_FORMAT ", alignment="
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   185
                 SIZE_FORMAT, total_reserved, alignment));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   187
  // Needed until the cardtable is fixed to have the right number
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   188
  // of covered regions.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   189
  n_covered_regions += 2;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   191
  *_total_reserved = total_reserved;
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19322
diff changeset
   192
  *_n_covered_regions = n_covered_regions;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   194
  *heap_rs = Universe::reserve_heap(total_reserved, alignment);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   195
  return heap_rs->base();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
void GenCollectedHeap::post_initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  SharedHeap::post_initialize();
24353
148147d21135 8027643: Merge GenCollectorPolicy and TwoGenerationCollectorPolicy
jwilhelm
parents: 23854
diff changeset
   201
  GenCollectorPolicy *policy = (GenCollectorPolicy *)collector_policy();
148147d21135 8027643: Merge GenCollectorPolicy and TwoGenerationCollectorPolicy
jwilhelm
parents: 23854
diff changeset
   202
  guarantee(policy->is_generation_policy(), "Illegal policy type");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  DefNewGeneration* def_new_gen = (DefNewGeneration*) get_gen(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  assert(def_new_gen->kind() == Generation::DefNew ||
25485
9c3d427eed01 8034246: remove CMS and ParNew adaptive size policy code
jcoomes
parents: 25350
diff changeset
   205
         def_new_gen->kind() == Generation::ParNew,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
         "Wrong generation kind");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  Generation* old_gen = get_gen(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  assert(old_gen->kind() == Generation::ConcurrentMarkSweep ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
         old_gen->kind() == Generation::MarkSweepCompact,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    "Wrong generation kind");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  policy->initialize_size_policy(def_new_gen->eden()->capacity(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
                                 old_gen->capacity(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
                                 def_new_gen->from()->capacity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  policy->initialize_gc_policy_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
void GenCollectedHeap::ref_processing_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  SharedHeap::ref_processing_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    _gens[i]->ref_processor_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
size_t GenCollectedHeap::capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  size_t res = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    res += _gens[i]->capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
size_t GenCollectedHeap::used() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  size_t res = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    res += _gens[i]->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   242
// Save the "used_region" for generations level and lower.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   243
void GenCollectedHeap::save_used_regions(int level) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  assert(level < _n_gens, "Illegal level parameter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  for (int i = level; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    _gens[i]->save_used_region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
size_t GenCollectedHeap::max_capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  size_t res = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    res += _gens[i]->max_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
// Update the _full_collections_completed counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
// at the end of a stop-world full GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
unsigned int GenCollectedHeap::update_full_collections_completed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  assert(_full_collections_completed <= _total_full_collections,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
         "Can't complete more collections than were started");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  _full_collections_completed = _total_full_collections;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  ml.notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  return _full_collections_completed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
// Update the _full_collections_completed counter, as appropriate,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
// at the end of a concurrent GC cycle. Note the conditional update
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
// below to allow this method to be called by a concurrent collector
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
// without synchronizing in any manner with the VM thread (which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
// may already have initiated a STW full collection "concurrently").
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
unsigned int GenCollectedHeap::update_full_collections_completed(unsigned int count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  assert((_full_collections_completed <= _total_full_collections) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
         (count <= _total_full_collections),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
         "Can't complete more collections than were started");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  if (count > _full_collections_completed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    _full_collections_completed = count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    ml.notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  return _full_collections_completed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
// Override of memory state checking method in CollectedHeap:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
// Some collectors (CMS for example) can't have badHeapWordVal written
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
// in the first two words of an object. (For instance , in the case of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
// CMS these words hold state used to synchronize between certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
// (concurrent) GC steps and direct allocating mutators.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
// The skip_header_HeapWords() method below, allows us to skip
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
// over the requisite number of HeapWord's. Note that (for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
// generational collectors) this means that those many words are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
// skipped in each object, irrespective of the generation in which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
// that object lives. The resultant loss of precision seems to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
// harmless and the pain of avoiding that imprecision appears somewhat
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
// higher than we are prepared to pay for such rudimentary debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
// support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
void GenCollectedHeap::check_for_non_bad_heap_word_value(HeapWord* addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
                                                         size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  if (CheckMemoryInitialization && ZapUnusedHeapArea) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    // We are asked to check a size in HeapWords,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    // but the memory is mangled in juint words.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
    juint* start = (juint*) (addr + skip_header_HeapWords());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
    juint* end   = (juint*) (addr + size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
    for (juint* slot = start; slot < end; slot += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
      assert(*slot == badHeapWordVal,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
             "Found non badHeapWordValue in pre-allocation check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
HeapWord* GenCollectedHeap::attempt_allocation(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
                                               bool is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
                                               bool first_only) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  HeapWord* res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
    if (_gens[i]->should_allocate(size, is_tlab)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
      res = _gens[i]->allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
      if (res != NULL) return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
      else if (first_only) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // Otherwise...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
HeapWord* GenCollectedHeap::mem_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
                                         bool* gc_overhead_limit_was_exceeded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  return collector_policy()->mem_allocate_work(size,
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   334
                                               false /* is_tlab */,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
                                               gc_overhead_limit_was_exceeded);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
bool GenCollectedHeap::must_clear_all_soft_refs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  return _gc_cause == GCCause::_last_ditch_collection;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
bool GenCollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
5433
c182d4c3039e 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 5343
diff changeset
   343
  return UseConcMarkSweepGC &&
c182d4c3039e 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 5343
diff changeset
   344
         ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||
c182d4c3039e 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 5343
diff changeset
   345
          (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
void GenCollectedHeap::do_collection(bool  full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
                                     bool   clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
                                     size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
                                     bool   is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
                                     int    max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  bool prepared_for_verification = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  DEBUG_ONLY(Thread* my_thread = Thread::current();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  assert(my_thread->is_VM_thread() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
         my_thread->is_ConcurrentGC_thread(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
         "incorrect thread type capability");
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   361
  assert(Heap_lock->is_locked(),
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   362
         "the requesting thread should have the Heap_lock");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  guarantee(!is_gc_active(), "collection is not reentrant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  assert(max_level < n_gens(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  if (GC_locker::check_active_before_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
    return; // GC is disabled (e.g. JNI GetXXXCritical operation)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   370
  const bool do_clear_all_soft_refs = clear_all_soft_refs ||
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   371
                          collector_policy()->should_clear_all_soft_refs();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   372
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   373
  ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   374
23854
50f7f89b34e0 8038934: Remove prefix allocated_ from methods and variables in Metaspace
ehelin
parents: 23508
diff changeset
   375
  const size_t metadata_prev_used = MetaspaceAux::used_bytes();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11396
diff changeset
   377
  print_heap_before_gc();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    FlagSetting fl(_is_gc_active, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    bool complete = full && (max_level == (n_gens()-1));
12630
ddf6ee008138 7166894: Add gc cause to GC logging for all collectors
brutisso
parents: 12379
diff changeset
   383
    const char* gc_cause_prefix = complete ? "Full GC" : "GC";
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24941
diff changeset
   386
    // The PrintGCDetails logging starts before we have incremented the GC id. We will do that later
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24941
diff changeset
   387
    // so we can assume here that the next GC id is what we want.
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24941
diff changeset
   388
    GCTraceTime t(GCCauseString(gc_cause_prefix, gc_cause()), PrintGCDetails, false, NULL, GCId::peek());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    gc_prologue(complete);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
    increment_total_collections(complete);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
    size_t gch_prev_used = used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
    int starting_level = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    if (full) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
      // Search for the oldest generation which will collect all younger
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
      // generations, and start collection loop there.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
      for (int i = max_level; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
        if (_gens[i]->full_collects_younger_generations()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
          starting_level = i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
    bool must_restore_marks_for_biased_locking = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    int max_level_collected = starting_level;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    for (int i = starting_level; i <= max_level; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
      if (_gens[i]->should_collect(full, size, is_tlab)) {
3580
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   412
        if (i == n_gens() - 1) {  // a major collection is to happen
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   413
          if (!complete) {
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   414
            // The full_collections increment was missed above.
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   415
            increment_total_full_collections();
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   416
          }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17112
diff changeset
   417
          pre_full_gc_dump(NULL);    // do any pre full gc dumps
3580
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   418
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
        // Timer for individual generations. Last argument is false: no CR
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17112
diff changeset
   420
        // FIXME: We should try to start the timing earlier to cover more of the GC pause
25350
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24941
diff changeset
   421
        // The PrintGCDetails logging starts before we have incremented the GC id. We will do that later
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24941
diff changeset
   422
        // so we can assume here that the next GC id is what we want.
6423a57e5451 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 24941
diff changeset
   423
        GCTraceTime t1(_gens[i]->short_name(), PrintGCDetails, false, NULL, GCId::peek());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
        TraceCollectorStats tcs(_gens[i]->counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 8921
diff changeset
   425
        TraceMemoryManagerStats tmms(_gens[i]->kind(),gc_cause());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
        size_t prev_used = _gens[i]->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
        _gens[i]->stat_record()->invocations++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
        _gens[i]->stat_record()->accumulated_time.start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   431
        // Must be done anew before each collection because
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   432
        // a previous collection will do mangling and will
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   433
        // change top of some spaces.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   434
        record_gen_tops_before_GC();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   435
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
        if (PrintGC && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
          gclog_or_tty->print("level=%d invoke=%d size=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
                     i,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
                     _gens[i]->stat_record()->invocations,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
                     size*HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
        if (VerifyBeforeGC && i >= VerifyGCLevel &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
            total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
          HandleMark hm;  // Discard invalid handles created during verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
          if (!prepared_for_verification) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
            prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
            prepared_for_verification = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
          }
17112
e49af4ba7755 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 17109
diff changeset
   450
          Universe::verify(" VerifyBeforeGC:");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
        COMPILER2_PRESENT(DerivedPointerTable::clear());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
        if (!must_restore_marks_for_biased_locking &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
            _gens[i]->performs_in_place_marking()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
          // We perform this mark word preservation work lazily
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
          // because it's only at this point that we know whether we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
          // absolutely have to do it; we want to avoid doing it for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
          // scavenge-only collections where it's unnecessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
          must_restore_marks_for_biased_locking = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
          BiasedLocking::preserve_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
        // Do collection work
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
          // Note on ref discovery: For what appear to be historical reasons,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
          // GCH enables and disabled (by enqueing) refs discovery.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
          // In the future this should be moved into the generation's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
          // collect method so that ref discovery and enqueueing concerns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
          // are local to a generation. The collect method could return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
          // an appropriate indication in the case that notification on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
          // the ref lock was needed. This will make the treatment of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
          // weak refs more uniform (and indeed remove such concerns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
          // from GCH). XXX
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
          HandleMark hm;  // Discard invalid handles created during gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
          save_marks();   // save marks for all gens
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
          // We want to discover references, but not process them yet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
          // This mode is disabled in process_discovered_references if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
          // generation does some collection work, or in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
          // enqueue_discovered_references if the generation returns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
          // without doing any work.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
          ReferenceProcessor* rp = _gens[i]->ref_processor();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
          // If the discovery of ("weak") refs in this generation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
          // atomic wrt other collectors in this configuration, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
          // are guaranteed to have empty discovered ref lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
          if (rp->discovery_is_atomic()) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10524
diff changeset
   488
            rp->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   489
            rp->setup_policy(do_clear_all_soft_refs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
          } else {
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 977
diff changeset
   491
            // collect() below will enable discovery as appropriate
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
          }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   493
          _gens[i]->collect(full, do_clear_all_soft_refs, size, is_tlab);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
          if (!rp->enqueuing_is_done()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
            rp->enqueue_discovered_references();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
            rp->set_enqueuing_is_done(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
          rp->verify_no_references_recorded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
        max_level_collected = i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
        // Determine if allocation request was met.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
        if (size > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
          if (!is_tlab || _gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
            if (size*HeapWordSize <= _gens[i]->unsafe_max_alloc_nogc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
              size = 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
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
        COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
        _gens[i]->stat_record()->accumulated_time.stop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
        update_gc_stats(i, full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
        if (VerifyAfterGC && i >= VerifyGCLevel &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
            total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
          HandleMark hm;  // Discard invalid handles created during verification
17112
e49af4ba7755 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 17109
diff changeset
   521
          Universe::verify(" VerifyAfterGC:");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
        if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
          gclog_or_tty->print(":");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
          _gens[i]->print_heap_change(prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
    // Update "complete" boolean wrt what actually transpired --
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    // for instance, a promotion failure could have led to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    // a whole heap collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
    complete = complete || (max_level_collected == n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   536
    if (complete) { // We did a "major" collection
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17112
diff changeset
   537
      // FIXME: See comment at pre_full_gc_dump call
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17112
diff changeset
   538
      post_full_gc_dump(NULL);   // do any post full gc dumps
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   539
    }
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   540
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
      print_heap_change(gch_prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   544
      // Print metaspace info for full GC with PrintGCDetails flag.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
      if (complete) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   546
        MetaspaceAux::print_metaspace_change(metadata_prev_used);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
    for (int j = max_level_collected; j >= 0; j -= 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
      // Adjust generation sizes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
      _gens[j]->compute_new_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
    if (complete) {
16385
4a05c6d94b04 8005602: NPG: classunloading does not happen while CMS GC with -XX:+CMSClassUnloadingEnabled is used
mgerdin
parents: 15482
diff changeset
   556
      // Delete metaspaces for unloaded class loaders and clean up loader_data graph
4a05c6d94b04 8005602: NPG: classunloading does not happen while CMS GC with -XX:+CMSClassUnloadingEnabled is used
mgerdin
parents: 15482
diff changeset
   557
      ClassLoaderDataGraph::purge();
17109
90e6c31bbbe4 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 17105
diff changeset
   558
      MetaspaceAux::verify_metrics();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   559
      // Resize the metaspace capacity after full collections
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   560
      MetaspaceGC::compute_new_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
      update_full_collections_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    // Track memory usage and detect low memory after GC finishes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    MemoryService::track_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    gc_epilogue(complete);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    if (must_restore_marks_for_biased_locking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
      BiasedLocking::restore_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11396
diff changeset
   574
  print_heap_after_gc();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1893
diff changeset
   576
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1893
diff changeset
   577
  ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1893
diff changeset
   578
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
HeapWord* GenCollectedHeap::satisfy_failed_allocation(size_t size, bool is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  return collector_policy()->satisfy_failed_allocation(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11251
diff changeset
   585
void GenCollectedHeap::set_par_threads(uint t) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  SharedHeap::set_par_threads(t);
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   587
  _gen_process_roots_tasks->set_n_threads(t);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
void GenCollectedHeap::
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   591
gen_process_roots(int level,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   592
                  bool younger_gens_as_roots,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   593
                  bool activate_scope,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   594
                  SharedHeap::ScanningOption so,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   595
                  OopsInGenClosure* not_older_gens,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   596
                  OopsInGenClosure* weak_roots,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   597
                  OopsInGenClosure* older_gens,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   598
                  CLDClosure* cld_closure,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   599
                  CLDClosure* weak_cld_closure,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   600
                  CodeBlobClosure* code_closure) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   601
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   602
  // General roots.
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   603
  SharedHeap::process_roots(activate_scope, so,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   604
                            not_older_gens, weak_roots,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   605
                            cld_closure, weak_cld_closure,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   606
                            code_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  if (younger_gens_as_roots) {
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   609
    if (!_gen_process_roots_tasks->is_task_claimed(GCH_PS_younger_gens)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
      for (int i = 0; i < level; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
        not_older_gens->set_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
        _gens[i]->oop_iterate(not_older_gens);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
      not_older_gens->reset_generation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  // When collection is parallel, all threads get to cooperate to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  // older-gen scanning.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  for (int i = level+1; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
    older_gens->set_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    rem_set()->younger_refs_iterate(_gens[i], older_gens);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    older_gens->reset_generation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
25492
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   625
  _gen_process_roots_tasks->all_tasks_completed();
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   626
}
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   627
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   628
void GenCollectedHeap::
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   629
gen_process_roots(int level,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   630
                  bool younger_gens_as_roots,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   631
                  bool activate_scope,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   632
                  SharedHeap::ScanningOption so,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   633
                  bool only_strong_roots,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   634
                  OopsInGenClosure* not_older_gens,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   635
                  OopsInGenClosure* older_gens,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   636
                  CLDClosure* cld_closure) {
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   637
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   638
  const bool is_adjust_phase = !only_strong_roots && !younger_gens_as_roots;
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   639
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   640
  bool is_moving_collection = false;
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   641
  if (level == 0 || is_adjust_phase) {
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   642
    // young collections are always moving
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   643
    is_moving_collection = true;
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   644
  }
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   645
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   646
  MarkingCodeBlobClosure mark_code_closure(not_older_gens, is_moving_collection);
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   647
  CodeBlobClosure* code_closure = &mark_code_closure;
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   648
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   649
  gen_process_roots(level,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   650
                    younger_gens_as_roots,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   651
                    activate_scope, so,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   652
                    not_older_gens, only_strong_roots ? NULL : not_older_gens,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   653
                    older_gens,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   654
                    cld_closure, only_strong_roots ? NULL : cld_closure,
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   655
                    code_closure);
d27050bdfb04 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 25491
diff changeset
   656
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
22882
195c8f70d605 8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents: 22552
diff changeset
   659
void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure) {
195c8f70d605 8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents: 22552
diff changeset
   660
  SharedHeap::process_weak_roots(root_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  // "Local" "weak" refs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
    _gens[i]->ref_processor()->weak_oops_do(root_closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
#define GCH_SINCE_SAVE_MARKS_ITERATE_DEFN(OopClosureType, nv_suffix)    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
void GenCollectedHeap::                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
oop_since_save_marks_iterate(int level,                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
                             OopClosureType* cur,                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
                             OopClosureType* older) {                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  _gens[level]->oop_since_save_marks_iterate##nv_suffix(cur);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  for (int i = level+1; i < n_gens(); i++) {                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
    _gens[i]->oop_since_save_marks_iterate##nv_suffix(older);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  }                                                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DEFN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
#undef GCH_SINCE_SAVE_MARKS_ITERATE_DEFN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
bool GenCollectedHeap::no_allocs_since_save_marks(int level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  for (int i = level; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
    if (!_gens[i]->no_allocs_since_save_marks()) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   686
  return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
bool GenCollectedHeap::supports_inline_contig_alloc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  return _gens[0]->supports_inline_contig_alloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
HeapWord** GenCollectedHeap::top_addr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  return _gens[0]->top_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
HeapWord** GenCollectedHeap::end_addr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  return _gens[0]->end_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
// public collection interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
void GenCollectedHeap::collect(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  if (should_do_concurrent_full_gc(cause)) {
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
   705
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
    // mostly concurrent full collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    collect_mostly_concurrent(cause);
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
   708
#else  // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    ShouldNotReachHere();
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
   710
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
    if (cause == GCCause::_scavenge_alot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
      // minor collection only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
      collect(cause, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
      // Stop-the-world full collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
      collect(cause, n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
    // Stop-the-world full collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
    collect(cause, n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
void GenCollectedHeap::collect(GCCause::Cause cause, int max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  // The caller doesn't have the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  collect_locked(cause, max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
void GenCollectedHeap::collect_locked(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  // The caller has the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  assert(Heap_lock->owned_by_self(), "this thread should own the Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  collect_locked(cause, n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
// this is the private collection interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
// The Heap_lock is expected to be held on entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
void GenCollectedHeap::collect_locked(GCCause::Cause cause, int max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  // Read the GC count while holding the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  unsigned int gc_count_before      = total_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  unsigned int full_gc_count_before = total_full_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
    MutexUnlocker mu(Heap_lock);  // give up heap lock, execute gets it back
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
    VM_GenCollectFull op(gc_count_before, full_gc_count_before,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
                         cause, max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
   755
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
bool GenCollectedHeap::create_cms_collector() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
25485
9c3d427eed01 8034246: remove CMS and ParNew adaptive size policy code
jcoomes
parents: 25350
diff changeset
   758
  assert(_gens[1]->kind() == Generation::ConcurrentMarkSweep,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
         "Unexpected generation kinds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  // Skip two header words in the block content verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  NOT_PRODUCT(_skip_header_HeapWords = CMSCollector::skip_header_HeapWords();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  CMSCollector* collector = new CMSCollector(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
    (ConcurrentMarkSweepGeneration*)_gens[1],
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
    _rem_set->as_CardTableRS(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
    (ConcurrentMarkSweepPolicy*) collector_policy());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  if (collector == NULL || !collector->completed_initialization()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
    if (collector) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
      delete collector;  // Be nice in embedded situation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
    vm_shutdown_during_initialization("Could not create CMS collector");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  return true;  // success
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
void GenCollectedHeap::collect_mostly_concurrent(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  assert(!Heap_lock->owned_by_self(), "Should not own Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  // Read the GC counts while holding the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  unsigned int full_gc_count_before = total_full_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  unsigned int gc_count_before      = total_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
    MutexUnlocker mu(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
    VM_GenCollectFullConcurrent op(gc_count_before, full_gc_count_before, cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
}
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
   790
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   792
void GenCollectedHeap::do_full_collection(bool clear_all_soft_refs) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   793
   do_full_collection(clear_all_soft_refs, _n_gens - 1);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   794
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
void GenCollectedHeap::do_full_collection(bool clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
                                          int max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  int local_max_level;
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   799
  if (!incremental_collection_will_fail(false /* don't consult_young */) &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
      gc_cause() == GCCause::_gc_locker) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
    local_max_level = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
    local_max_level = max_level;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  do_collection(true                 /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
                clear_all_soft_refs  /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
                0                    /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
                false                /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
                local_max_level      /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  // Hack XXX FIX ME !!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  // A scavenge may not have been attempted, or may have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  // been attempted and failed, because the old gen was too full
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  if (local_max_level == 0 && gc_cause() == GCCause::_gc_locker &&
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   815
      incremental_collection_will_fail(false /* don't consult_young */)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
    if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
      gclog_or_tty->print_cr("GC locker: Trying a full collection "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
                             "because scavenge failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
    // This time allow the old gen to be collected as well
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
    do_collection(true                 /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
                  clear_all_soft_refs  /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
                  0                    /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
                  false                /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
                  n_gens() - 1         /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   829
bool GenCollectedHeap::is_in_young(oop p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   830
  bool result = ((HeapWord*)p) < _gens[_n_gens - 1]->reserved().start();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   831
  assert(result == _gens[0]->is_in_reserved(p),
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24353
diff changeset
   832
         err_msg("incorrect test - result=%d, p=" INTPTR_FORMAT, result, p2i((void*)p)));
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   833
  return result;
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   834
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   835
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10997
diff changeset
   836
// Returns "TRUE" iff "p" points into the committed areas of the heap.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
bool GenCollectedHeap::is_in(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  #ifndef ASSERT
16680
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16385
diff changeset
   839
  guarantee(VerifyBeforeGC      ||
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16385
diff changeset
   840
            VerifyDuringGC      ||
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16385
diff changeset
   841
            VerifyBeforeExit    ||
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16385
diff changeset
   842
            VerifyDuringStartup ||
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16385
diff changeset
   843
            PrintAssembly       ||
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16385
diff changeset
   844
            tty->count() != 0   ||   // already printing
960505df90e7 8011343: Add new flag for verifying the heap during startup
johnc
parents: 16385
diff changeset
   845
            VerifyAfterGC       ||
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5906
diff changeset
   846
    VMError::fatal_error_in_progress(), "too expensive");
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5906
diff changeset
   847
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  // This might be sped up with a cache of the last generation that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  // answered yes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
    if (_gens[i]->is_in(p)) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  // Otherwise...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   858
#ifdef ASSERT
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   859
// Don't implement this by using is_in_young().  This method is used
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   860
// in some cases to check that is_in_young() is correct.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   861
bool GenCollectedHeap::is_in_partial_collection(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   862
  assert(is_in_reserved(p) || p == NULL,
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   863
    "Does not work if address is non-null and outside of the heap");
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   864
  return p < _gens[_n_gens - 2]->reserved().end() && p != NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
}
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   866
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
   868
void GenCollectedHeap::oop_iterate(ExtendedOopClosure* cl) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
    _gens[i]->oop_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
void GenCollectedHeap::object_iterate(ObjectClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
    _gens[i]->object_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
   880
void GenCollectedHeap::safe_object_iterate(ObjectClosure* cl) {
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
   881
  for (int i = 0; i < _n_gens; i++) {
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
   882
    _gens[i]->safe_object_iterate(cl);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
   883
  }
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
   884
}
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
   885
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
Space* GenCollectedHeap::space_containing(const void* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
    Space* res = _gens[i]->space_containing(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
    if (res != NULL) return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  // Otherwise...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  assert(false, "Could not find containing space");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
HeapWord* GenCollectedHeap::block_start(const void* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  assert(is_in_reserved(addr), "block_start of address outside of heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
    if (_gens[i]->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
      assert(_gens[i]->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
             "addr should be in allocated part of generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
      return _gens[i]->block_start(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  assert(false, "Some generation should contain the address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
size_t GenCollectedHeap::block_size(const HeapWord* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  assert(is_in_reserved(addr), "block_size of address outside of heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
    if (_gens[i]->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
      assert(_gens[i]->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
             "addr should be in allocated part of generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
      return _gens[i]->block_size(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  assert(false, "Some generation should contain the address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
bool GenCollectedHeap::block_is_obj(const HeapWord* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  assert(is_in_reserved(addr), "block_is_obj of address outside of heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  assert(block_start(addr) == addr, "addr must be a block start");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
    if (_gens[i]->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
      return _gens[i]->block_is_obj(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  assert(false, "Some generation should contain the address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
bool GenCollectedHeap::supports_tlab_allocation() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  for (int i = 0; i < _n_gens; i += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
    if (_gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
size_t GenCollectedHeap::tlab_capacity(Thread* thr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  size_t result = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  for (int i = 0; i < _n_gens; i += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
    if (_gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
      result += _gens[i]->tlab_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
22552
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   954
size_t GenCollectedHeap::tlab_used(Thread* thr) const {
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   955
  size_t result = 0;
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   956
  for (int i = 0; i < _n_gens; i += 1) {
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   957
    if (_gens[i]->supports_tlab_allocation()) {
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   958
      result += _gens[i]->tlab_used();
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   959
    }
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   960
  }
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   961
  return result;
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   962
}
a29022212180 8030177: G1: Enable TLAB resizing
brutisso
parents: 22551
diff changeset
   963
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
size_t GenCollectedHeap::unsafe_max_tlab_alloc(Thread* thr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  size_t result = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  for (int i = 0; i < _n_gens; i += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
    if (_gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
      result += _gens[i]->unsafe_max_tlab_alloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
HeapWord* GenCollectedHeap::allocate_new_tlab(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  bool gc_overhead_limit_was_exceeded;
9997
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   976
  return collector_policy()->mem_allocate_work(size /* size */,
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   977
                                               true /* is_tlab */,
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
   978
                                               &gc_overhead_limit_was_exceeded);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
// Requires "*prev_ptr" to be non-NULL.  Deletes and a block of minimal size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
// from the list headed by "*prev_ptr".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
static ScratchBlock *removeSmallestScratch(ScratchBlock **prev_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  bool first = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  size_t min_size = 0;   // "first" makes this conceptually infinite.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  ScratchBlock **smallest_ptr, *smallest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  ScratchBlock  *cur = *prev_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  while (cur) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
    assert(*prev_ptr == cur, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
    if (first || cur->num_words < min_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
      smallest_ptr = prev_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
      smallest     = cur;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
      min_size     = smallest->num_words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
      first        = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
    prev_ptr = &cur->next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    cur     =  cur->next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  smallest      = *smallest_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  *smallest_ptr = smallest->next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  return smallest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
// Sort the scratch block list headed by res into decreasing size order,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
// and set "res" to the result.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
static void sort_scratch_list(ScratchBlock*& list) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  ScratchBlock* sorted = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  ScratchBlock* unsorted = list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  while (unsorted) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
    ScratchBlock *smallest = removeSmallestScratch(&unsorted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
    smallest->next  = sorted;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
    sorted          = smallest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  list = sorted;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
ScratchBlock* GenCollectedHeap::gather_scratch(Generation* requestor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
                                               size_t max_alloc_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  ScratchBlock* res = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
    _gens[i]->contribute_scratch(res, requestor, max_alloc_words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  sort_scratch_list(res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1027
void GenCollectedHeap::release_scratch() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1028
  for (int i = 0; i < _n_gens; i++) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1029
    _gens[i]->reset_scratch();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1030
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1031
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1032
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
class GenPrepareForVerifyClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
    gen->prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
void GenCollectedHeap::prepare_for_verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  ensure_parsability(false);        // no need to retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  GenPrepareForVerifyClosure blk;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  generation_iterate(&blk, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
void GenCollectedHeap::generation_iterate(GenClosure* cl,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
                                          bool old_to_young) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  if (old_to_young) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
    for (int i = _n_gens-1; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
      cl->do_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
    for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
      cl->do_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
void GenCollectedHeap::space_iterate(SpaceClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
    _gens[i]->space_iterate(cl, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
bool GenCollectedHeap::is_maximal_no_gc() const {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
  1066
  for (int i = 0; i < _n_gens; i++) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
    if (!_gens[i]->is_maximal_no_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
void GenCollectedHeap::save_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
    _gens[i]->save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
GenCollectedHeap* GenCollectedHeap::heap() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  assert(_gch != NULL, "Uninitialized access to GenCollectedHeap::heap()");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  assert(_gch->kind() == CollectedHeap::GenCollectedHeap, "not a generational heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  return _gch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
void GenCollectedHeap::prepare_for_compaction() {
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1088
  guarantee(_n_gens = 2, "Wrong number of generations");
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1089
  Generation* old_gen = _gens[1];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  // Start by compacting into same gen.
25730
7eb4e685f739 8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents: 25492
diff changeset
  1091
  CompactPoint cp(old_gen);
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1092
  old_gen->prepare_for_compaction(&cp);
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1093
  Generation* young_gen = _gens[0];
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1094
  young_gen->prepare_for_compaction(&cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
GCStats* GenCollectedHeap::gc_stats(int level) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  return _gens[level]->gc_stats();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11636
diff changeset
  1101
void GenCollectedHeap::verify(bool silent, VerifyOption option /* ignored */) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  for (int i = _n_gens-1; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
    Generation* g = _gens[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
    if (!silent) {
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24353
diff changeset
  1105
      gclog_or_tty->print("%s", g->name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
      gclog_or_tty->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
    }
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11636
diff changeset
  1108
    g->verify();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
  if (!silent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
    gclog_or_tty->print("remset ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  rem_set()->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
void GenCollectedHeap::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
    _gens[i]->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
  1120
  MetaspaceAux::print_on(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
void GenCollectedHeap::gc_threads_do(ThreadClosure* tc) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  if (workers() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
    workers()->threads_do(tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
  1127
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
    ConcurrentMarkSweepThread::threads_do(tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
  1131
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
void GenCollectedHeap::print_gc_threads_on(outputStream* st) const {
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
  1135
#if INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  if (UseParNewGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
    workers()->print_worker_threads_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
    ConcurrentMarkSweepThread::print_all_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  }
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14076
diff changeset
  1142
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1145
void GenCollectedHeap::print_on_error(outputStream* st) const {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1146
  this->CollectedHeap::print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1147
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1148
#if INCLUDE_ALL_GCS
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1149
  if (UseConcMarkSweepGC) {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1150
    st->cr();
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1151
    CMSCollector::print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1152
  }
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1153
#endif // INCLUDE_ALL_GCS
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1154
}
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16680
diff changeset
  1155
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
void GenCollectedHeap::print_tracing_info() const {
24941
4ebbe176a7b1 8042298: Remove the names gen0 and gen1 from the GC code
jwilhelm
parents: 24424
diff changeset
  1157
  if (TraceYoungGenTime) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
    get_gen(0)->print_summary_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  }
24941
4ebbe176a7b1 8042298: Remove the names gen0 and gen1 from the GC code
jwilhelm
parents: 24424
diff changeset
  1160
  if (TraceOldGenTime) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
    get_gen(1)->print_summary_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
void GenCollectedHeap::print_heap_change(size_t prev_used) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  if (PrintGCDetails && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
    gclog_or_tty->print(" "  SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
                        "->" SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
                        "("  SIZE_FORMAT ")",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
                        prev_used, used(), capacity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
    gclog_or_tty->print(" "  SIZE_FORMAT "K"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
                        "->" SIZE_FORMAT "K"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
                        "("  SIZE_FORMAT "K)",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
                        prev_used / K, used() / K, capacity() / K);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
class GenGCPrologueClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  bool _full;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
    gen->gc_prologue(_full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  GenGCPrologueClosure(bool full) : _full(full) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
void GenCollectedHeap::gc_prologue(bool full) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  always_do_update_barrier = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  // Fill TLAB's and such
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
  CollectedHeap::accumulate_statistics_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  ensure_parsability(true);   // retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  // Walk generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  GenGCPrologueClosure blk(full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
  generation_iterate(&blk, false);  // not old-to-young.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
class GenGCEpilogueClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  bool _full;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
    gen->gc_epilogue(_full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  GenGCEpilogueClosure(bool full) : _full(full) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
void GenCollectedHeap::gc_epilogue(bool full) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
#ifdef COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  assert(DerivedPointerTable::is_empty(), "derived pointer present");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  size_t actual_gap = pointer_delta((HeapWord*) (max_uintx-3), *(end_addr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  guarantee(actual_gap > (size_t)FastAllocateSizeLimit, "inline allocation wraps");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
#endif /* COMPILER2 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
  resize_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  GenGCEpilogueClosure blk(full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
  generation_iterate(&blk, false);  // not old-to-young.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
10022
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1224
  if (!CleanChunkPoolAsync) {
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1225
    Chunk::clean_chunk_pool();
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1226
  }
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1227
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
  1228
  MetaspaceCounters::update_performance_counters();
19322
e35f9ed4f081 8014659: NPG: performance counters for compressed klass space
ehelin
parents: 19286
diff changeset
  1229
  CompressedClassSpaceCounters::update_performance_counters();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12781
diff changeset
  1230
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  always_do_update_barrier = UseConcMarkSweepGC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1234
#ifndef PRODUCT
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1235
class GenGCSaveTopsBeforeGCClosure: public GenCollectedHeap::GenClosure {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1236
 private:
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1237
 public:
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1238
  void do_generation(Generation* gen) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1239
    gen->record_spaces_top();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1240
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1241
};
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1242
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1243
void GenCollectedHeap::record_gen_tops_before_GC() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1244
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1245
    GenGCSaveTopsBeforeGCClosure blk;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1246
    generation_iterate(&blk, false);  // not old-to-young.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1247
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1248
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1249
#endif  // not PRODUCT
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1250
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
class GenEnsureParsabilityClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
    gen->ensure_parsability();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
void GenCollectedHeap::ensure_parsability(bool retire_tlabs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  CollectedHeap::ensure_parsability(retire_tlabs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
  GenEnsureParsabilityClosure ep_cl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
  generation_iterate(&ep_cl, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1264
oop GenCollectedHeap::handle_failed_promotion(Generation* old_gen,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
                                              oop obj,
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1266
                                              size_t obj_size) {
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1267
  guarantee(old_gen->level() == 1, "We only get here with an old generation");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
  assert(obj_size == (size_t)obj->size(), "bad obj_size passed in");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
  1271
  result = old_gen->expand_and_allocate(obj_size, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
    Copy::aligned_disjoint_words((HeapWord*)obj, result, obj_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
  return oop(result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
class GenTimeOfLastGCClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
  jlong _time;   // in ms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
  jlong _now;    // in ms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  GenTimeOfLastGCClosure(jlong now) : _time(now), _now(now) { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
  jlong time() { return _time; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
    _time = MIN2(_time, gen->time_of_last_gc(_now));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
jlong GenCollectedHeap::millis_since_last_gc() {
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22550
diff changeset
  1294
  // We need a monotonically non-decreasing time in ms but
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
  1295
  // os::javaTimeMillis() does not guarantee monotonicity.
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
  1296
  jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  GenTimeOfLastGCClosure tolgc_cl(now);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
  // iterate over generations getting the oldest
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  // time that a generation was collected
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
  generation_iterate(&tolgc_cl, false);
11251
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
  1301
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
  1302
  // javaTimeNanos() is guaranteed to be monotonically non-decreasing
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
  1303
  // provided the underlying platform provides such a time source
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
  1304
  // (and it is bug free). So we still have to guard against getting
e29da6b5622b 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 11247
diff changeset
  1305
  // back a time later than 'now'.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
  jlong retVal = now - tolgc_cl.time();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
  if (retVal < 0) {
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24353
diff changeset
  1308
    NOT_PRODUCT(warning("time warp: "INT64_FORMAT, (int64_t) retVal);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
  return retVal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
}