hotspot/src/share/vm/memory/genCollectedHeap.cpp
author johnc
Thu, 22 Sep 2011 10:57:37 -0700
changeset 10670 4ea0e7d2ffbc
parent 10524 6594ca81279a
child 10997 0be4b3be7197
permissions -rw-r--r--
6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8921
14bfe81f2a9d 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 8076
diff changeset
     2
 * Copyright (c) 2000, 2011, 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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    31
#include "gc_implementation/shared/vmGCOperations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    32
#include "gc_interface/collectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    33
#include "memory/compactPermGen.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    34
#include "memory/filemap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    35
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    36
#include "memory/genCollectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    37
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    38
#include "memory/generation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    39
#include "memory/generationSpec.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    40
#include "memory/permGen.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/aprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    47
#include "runtime/biasedLocking.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    48
#include "runtime/fprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    49
#include "runtime/handles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    50
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    51
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    52
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    53
#include "services/memoryService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    54
#include "utilities/vmError.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    55
#include "utilities/workgroup.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    56
#ifndef SERIALGC
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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    59
#endif
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// The set of potentially parallel tasks in strong root scanning.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
enum GCH_process_strong_roots_tasks {
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),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  _gen_process_strong_tasks(new SubTasksDone(GCH_PS_NumElements)),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  _full_collections_completed(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  if (_gen_process_strong_tasks == NULL ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
      !_gen_process_strong_tasks->valid()) {
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
  _preloading_shared_classes = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
jint GenCollectedHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 3908
diff changeset
    87
  CollectedHeap::pre_initialize();
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 3908
diff changeset
    88
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  _n_gens = gen_policy()->number_of_generations();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  // While there are no constraints in the GC code that HeapWordSize
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // be any particular value, there are multiple other areas in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // system which believe this to be true (e.g. oop->object_size in some
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // cases incorrectly returns the size in wordSize units rather than
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // HeapWordSize).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // The heap must be at least as aligned as generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  size_t alignment = Generation::GenGrain;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  _gen_specs = gen_policy()->generations();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  PermanentGenerationSpec *perm_gen_spec =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
                                collector_policy()->permanent_generation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // Make sure the sizes are all aligned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  for (i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    _gen_specs[i]->align(alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  perm_gen_spec->align(alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // If we are dumping the heap, then allocate a wasted block of address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  // space in order to push the heap to a lower address.  This extra
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // address range allows for other (or larger) libraries to be loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // without them occupying the space required for the shared spaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  if (DumpSharedSpaces) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    uintx reserved = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    uintx block_size = 64*1024*1024;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    while (reserved < SharedDummyBlockSize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
      char* dummy = os::reserve_memory(block_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
      reserved += block_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  // Allocate space for the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  char* heap_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  size_t total_reserved = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  int n_covered_regions = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  ReservedSpace heap_rs(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  heap_address = allocate(alignment, perm_gen_spec, &total_reserved,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
                          &n_covered_regions, &heap_rs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  if (UseSharedSpaces) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    if (!heap_rs.is_reserved() || heap_address != heap_rs.base()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
      if (heap_rs.is_reserved()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
        heap_rs.release();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
      FileMapInfo* mapinfo = FileMapInfo::current_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
      mapinfo->fail_continue("Unable to reserve shared region.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
      allocate(alignment, perm_gen_spec, &total_reserved, &n_covered_regions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
               &heap_rs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  if (!heap_rs.is_reserved()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
    vm_shutdown_during_initialization(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
      "Could not reserve enough space for object heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    return JNI_ENOMEM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  _reserved = MemRegion((HeapWord*)heap_rs.base(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
                        (HeapWord*)(heap_rs.base() + heap_rs.size()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // It is important to do this in a way such that concurrent readers can't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  // temporarily think somethings in the heap.  (Seen this happen in asserts.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  _reserved.set_word_size(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  _reserved.set_start((HeapWord*)heap_rs.base());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  size_t actual_heap_size = heap_rs.size() - perm_gen_spec->misc_data_size()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
                                           - perm_gen_spec->misc_code_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  _reserved.set_end((HeapWord*)(heap_rs.base() + actual_heap_size));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  _rem_set = collector_policy()->create_rem_set(_reserved, n_covered_regions);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  set_barrier_set(rem_set()->bs());
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 3908
diff changeset
   167
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  _gch = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  for (i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    ReservedSpace this_rs = heap_rs.first_part(_gen_specs[i]->max_size(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
                                              UseSharedSpaces, UseSharedSpaces);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    _gens[i] = _gen_specs[i]->init(this_rs, i, rem_set());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    heap_rs = heap_rs.last_part(_gen_specs[i]->max_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  _perm_gen = perm_gen_spec->init(heap_rs, PermSize, rem_set());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   178
  clear_incremental_collection_failed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // If we are running CMS, create the collector responsible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // for collecting the CMS generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  if (collector_policy()->is_concurrent_mark_sweep_policy()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    bool success = create_cms_collector();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    if (!success) return JNI_ENOMEM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  return JNI_OK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
char* GenCollectedHeap::allocate(size_t alignment,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
                                 PermanentGenerationSpec* perm_gen_spec,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
                                 size_t* _total_reserved,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
                                 int* _n_covered_regions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
                                 ReservedSpace* heap_rs){
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  const char overflow_msg[] = "The size of the object heap + VM data exceeds "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    "the maximum representable size";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // Now figure out the total size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  size_t total_reserved = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  int n_covered_regions = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  const size_t pageSize = UseLargePages ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
      os::large_page_size() : os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    total_reserved += _gen_specs[i]->max_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    if (total_reserved < _gen_specs[i]->max_size()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
      vm_exit_during_initialization(overflow_msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    n_covered_regions += _gen_specs[i]->n_covered_regions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  }
5906
b8d07a1a73e8 6888573: class data sharing does not always disable large pages
jcoomes
parents: 5547
diff changeset
   214
  assert(total_reserved % pageSize == 0,
b8d07a1a73e8 6888573: class data sharing does not always disable large pages
jcoomes
parents: 5547
diff changeset
   215
         err_msg("Gen size; total_reserved=" SIZE_FORMAT ", pageSize="
b8d07a1a73e8 6888573: class data sharing does not always disable large pages
jcoomes
parents: 5547
diff changeset
   216
                 SIZE_FORMAT, total_reserved, pageSize));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  total_reserved += perm_gen_spec->max_size();
5906
b8d07a1a73e8 6888573: class data sharing does not always disable large pages
jcoomes
parents: 5547
diff changeset
   218
  assert(total_reserved % pageSize == 0,
b8d07a1a73e8 6888573: class data sharing does not always disable large pages
jcoomes
parents: 5547
diff changeset
   219
         err_msg("Perm size; total_reserved=" SIZE_FORMAT ", pageSize="
b8d07a1a73e8 6888573: class data sharing does not always disable large pages
jcoomes
parents: 5547
diff changeset
   220
                 SIZE_FORMAT ", perm gen max=" SIZE_FORMAT, total_reserved,
b8d07a1a73e8 6888573: class data sharing does not always disable large pages
jcoomes
parents: 5547
diff changeset
   221
                 pageSize, perm_gen_spec->max_size()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  if (total_reserved < perm_gen_spec->max_size()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    vm_exit_during_initialization(overflow_msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  n_covered_regions += perm_gen_spec->n_covered_regions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // Add the size of the data area which shares the same reserved area
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // as the heap, but which is not actually part of the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  size_t s = perm_gen_spec->misc_data_size() + perm_gen_spec->misc_code_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  total_reserved += s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  if (total_reserved < s) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    vm_exit_during_initialization(overflow_msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  if (UseLargePages) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    assert(total_reserved != 0, "total_reserved cannot be 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    total_reserved = round_to(total_reserved, os::large_page_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    if (total_reserved < os::large_page_size()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
      vm_exit_during_initialization(overflow_msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // Calculate the address at which the heap must reside in order for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  // the shared data to be at the required address.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  char* heap_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  if (UseSharedSpaces) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    // Calculate the address of the first word beyond the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    FileMapInfo* mapinfo = FileMapInfo::current_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    int lr = CompactingPermGenGen::n_regions - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    size_t capacity = align_size_up(mapinfo->space_capacity(lr), alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    heap_address = mapinfo->region_base(lr) + capacity;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    // Calculate the address of the first word of the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    heap_address -= total_reserved;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    heap_address = NULL;  // any address will do.
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   261
    if (UseCompressedOops) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   262
      heap_address = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   263
      *_total_reserved = total_reserved;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   264
      *_n_covered_regions = n_covered_regions;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   265
      *heap_rs = ReservedHeapSpace(total_reserved, alignment,
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   266
                                   UseLargePages, heap_address);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   267
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   268
      if (heap_address != NULL && !heap_rs->is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   269
        // Failed to reserve at specified address - the requested memory
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   270
        // region is taken already, for example, by 'java' launcher.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   271
        // Try again to reserver heap higher.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   272
        heap_address = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   273
        *heap_rs = ReservedHeapSpace(total_reserved, alignment,
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   274
                                     UseLargePages, heap_address);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   275
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   276
        if (heap_address != NULL && !heap_rs->is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   277
          // Failed to reserve at specified address again - give up.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   278
          heap_address = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   279
          assert(heap_address == NULL, "");
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   280
          *heap_rs = ReservedHeapSpace(total_reserved, alignment,
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   281
                                       UseLargePages, heap_address);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   282
        }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   283
      }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   284
      return heap_address;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2141
diff changeset
   285
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  *_total_reserved = total_reserved;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  *_n_covered_regions = n_covered_regions;
823
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   290
  *heap_rs = ReservedHeapSpace(total_reserved, alignment,
9a5271881bc0 6716785: implicit null checks not triggering with CompressedOops
coleenp
parents: 670
diff changeset
   291
                               UseLargePages, heap_address);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  return heap_address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
void GenCollectedHeap::post_initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  SharedHeap::post_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  TwoGenerationCollectorPolicy *policy =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    (TwoGenerationCollectorPolicy *)collector_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  guarantee(policy->is_two_generation_policy(), "Illegal policy type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  DefNewGeneration* def_new_gen = (DefNewGeneration*) get_gen(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  assert(def_new_gen->kind() == Generation::DefNew ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
         def_new_gen->kind() == Generation::ParNew ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
         def_new_gen->kind() == Generation::ASParNew,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
         "Wrong generation kind");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  Generation* old_gen = get_gen(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  assert(old_gen->kind() == Generation::ConcurrentMarkSweep ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
         old_gen->kind() == Generation::ASConcurrentMarkSweep ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
         old_gen->kind() == Generation::MarkSweepCompact,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    "Wrong generation kind");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  policy->initialize_size_policy(def_new_gen->eden()->capacity(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
                                 old_gen->capacity(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
                                 def_new_gen->from()->capacity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  policy->initialize_gc_policy_counters();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
void GenCollectedHeap::ref_processing_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  SharedHeap::ref_processing_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    _gens[i]->ref_processor_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
size_t GenCollectedHeap::capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  size_t res = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    res += _gens[i]->capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
size_t GenCollectedHeap::used() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  size_t res = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    res += _gens[i]->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
// Save the "used_region" for generations level and lower,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
// and, if perm is true, for perm gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
void GenCollectedHeap::save_used_regions(int level, bool perm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  assert(level < _n_gens, "Illegal level parameter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  for (int i = level; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    _gens[i]->save_used_region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  if (perm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
    perm_gen()->save_used_region();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
size_t GenCollectedHeap::max_capacity() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  size_t res = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    res += _gens[i]->max_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
// Update the _full_collections_completed counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
// at the end of a stop-world full GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
unsigned int GenCollectedHeap::update_full_collections_completed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  assert(_full_collections_completed <= _total_full_collections,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
         "Can't complete more collections than were started");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  _full_collections_completed = _total_full_collections;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  ml.notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  return _full_collections_completed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
// Update the _full_collections_completed counter, as appropriate,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
// at the end of a concurrent GC cycle. Note the conditional update
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
// below to allow this method to be called by a concurrent collector
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
// without synchronizing in any manner with the VM thread (which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
// may already have initiated a STW full collection "concurrently").
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
unsigned int GenCollectedHeap::update_full_collections_completed(unsigned int count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  MonitorLockerEx ml(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  assert((_full_collections_completed <= _total_full_collections) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
         (count <= _total_full_collections),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
         "Can't complete more collections than were started");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  if (count > _full_collections_completed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    _full_collections_completed = count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
    ml.notify_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  return _full_collections_completed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
// Override of memory state checking method in CollectedHeap:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
// Some collectors (CMS for example) can't have badHeapWordVal written
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
// in the first two words of an object. (For instance , in the case of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
// CMS these words hold state used to synchronize between certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
// (concurrent) GC steps and direct allocating mutators.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
// The skip_header_HeapWords() method below, allows us to skip
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
// over the requisite number of HeapWord's. Note that (for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
// generational collectors) this means that those many words are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
// skipped in each object, irrespective of the generation in which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
// that object lives. The resultant loss of precision seems to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
// harmless and the pain of avoiding that imprecision appears somewhat
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
// higher than we are prepared to pay for such rudimentary debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
// support.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
void GenCollectedHeap::check_for_non_bad_heap_word_value(HeapWord* addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
                                                         size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  if (CheckMemoryInitialization && ZapUnusedHeapArea) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    // We are asked to check a size in HeapWords,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    // but the memory is mangled in juint words.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    juint* start = (juint*) (addr + skip_header_HeapWords());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    juint* end   = (juint*) (addr + size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    for (juint* slot = start; slot < end; slot += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
      assert(*slot == badHeapWordVal,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
             "Found non badHeapWordValue in pre-allocation check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
HeapWord* GenCollectedHeap::attempt_allocation(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
                                               bool is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
                                               bool first_only) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  HeapWord* res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
    if (_gens[i]->should_allocate(size, is_tlab)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
      res = _gens[i]->allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
      if (res != NULL) return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
      else if (first_only) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  // Otherwise...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
HeapWord* GenCollectedHeap::mem_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
                                         bool* gc_overhead_limit_was_exceeded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  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
   439
                                               false /* is_tlab */,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
                                               gc_overhead_limit_was_exceeded);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
bool GenCollectedHeap::must_clear_all_soft_refs() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  return _gc_cause == GCCause::_last_ditch_collection;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
bool GenCollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
5433
c182d4c3039e 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 5343
diff changeset
   448
  return UseConcMarkSweepGC &&
c182d4c3039e 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 5343
diff changeset
   449
         ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||
c182d4c3039e 6919638: CMS: ExplicitGCInvokesConcurrent misinteracts with gc locker
ysr
parents: 5343
diff changeset
   450
          (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
void GenCollectedHeap::do_collection(bool  full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
                                     bool   clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
                                     size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
                                     bool   is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
                                     int    max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  bool prepared_for_verification = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  DEBUG_ONLY(Thread* my_thread = Thread::current();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  assert(my_thread->is_VM_thread() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
         my_thread->is_ConcurrentGC_thread(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
         "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
   466
  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
   467
         "the requesting thread should have the Heap_lock");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  guarantee(!is_gc_active(), "collection is not reentrant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  assert(max_level < n_gens(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  if (GC_locker::check_active_before_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    return; // GC is disabled (e.g. JNI GetXXXCritical operation)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   475
  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
   476
                          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
   477
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   478
  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
   479
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  const size_t perm_prev_used = perm_gen()->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  if (PrintHeapAtGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    Universe::print_heap_before_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    if (Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
      gclog_or_tty->print_cr("GC Cause: %s", GCCause::to_string(gc_cause()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    FlagSetting fl(_is_gc_active, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    bool complete = full && (max_level == (n_gens()-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    const char* gc_cause_str = "GC ";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
    if (complete) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
      GCCause::Cause cause = gc_cause();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
      if (cause == GCCause::_java_lang_system_gc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
        gc_cause_str = "Full GC (System) ";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
        gc_cause_str = "Full GC ";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
    TraceTime t(gc_cause_str, PrintGCDetails, false, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
    gc_prologue(complete);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
    increment_total_collections(complete);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
    size_t gch_prev_used = used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    int starting_level = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    if (full) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
      // Search for the oldest generation which will collect all younger
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
      // generations, and start collection loop there.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
      for (int i = max_level; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
        if (_gens[i]->full_collects_younger_generations()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
          starting_level = i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    bool must_restore_marks_for_biased_locking = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
    int max_level_collected = starting_level;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
    for (int i = starting_level; i <= max_level; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
      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
   528
        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
   529
          if (!complete) {
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   530
            // The full_collections increment was missed above.
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   531
            increment_total_full_collections();
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   532
          }
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   533
          pre_full_gc_dump();    // do any pre full gc dumps
3580
55775b48f5e5 6862295: JDWP threadid changes during debugging session (leading to ingored breakpoints)
dcubed
parents: 1610
diff changeset
   534
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
        // Timer for individual generations. Last argument is false: no CR
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
        TraceTime t1(_gens[i]->short_name(), PrintGCDetails, false, gclog_or_tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
        TraceCollectorStats tcs(_gens[i]->counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 8921
diff changeset
   538
        TraceMemoryManagerStats tmms(_gens[i]->kind(),gc_cause());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
        size_t prev_used = _gens[i]->used();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
        _gens[i]->stat_record()->invocations++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
        _gens[i]->stat_record()->accumulated_time.start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   544
        // 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
   545
        // 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
   546
        // change top of some spaces.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   547
        record_gen_tops_before_GC();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
   548
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
        if (PrintGC && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
          gclog_or_tty->print("level=%d invoke=%d size=" SIZE_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
                     i,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
                     _gens[i]->stat_record()->invocations,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
                     size*HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
        if (VerifyBeforeGC && i >= VerifyGCLevel &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
            total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
          HandleMark hm;  // Discard invalid handles created during verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
          if (!prepared_for_verification) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
            prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
            prepared_for_verification = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
          gclog_or_tty->print(" VerifyBeforeGC:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
          Universe::verify(true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
        COMPILER2_PRESENT(DerivedPointerTable::clear());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
        if (!must_restore_marks_for_biased_locking &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
            _gens[i]->performs_in_place_marking()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
          // We perform this mark word preservation work lazily
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
          // because it's only at this point that we know whether we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
          // absolutely have to do it; we want to avoid doing it for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
          // scavenge-only collections where it's unnecessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
          must_restore_marks_for_biased_locking = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
          BiasedLocking::preserve_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
        // Do collection work
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
          // Note on ref discovery: For what appear to be historical reasons,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
          // GCH enables and disabled (by enqueing) refs discovery.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
          // In the future this should be moved into the generation's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
          // collect method so that ref discovery and enqueueing concerns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
          // are local to a generation. The collect method could return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
          // an appropriate indication in the case that notification on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
          // the ref lock was needed. This will make the treatment of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
          // weak refs more uniform (and indeed remove such concerns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
          // from GCH). XXX
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
          HandleMark hm;  // Discard invalid handles created during gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
          save_marks();   // save marks for all gens
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
          // We want to discover references, but not process them yet.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
          // This mode is disabled in process_discovered_references if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
          // generation does some collection work, or in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
          // enqueue_discovered_references if the generation returns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
          // without doing any work.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
          ReferenceProcessor* rp = _gens[i]->ref_processor();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
          // If the discovery of ("weak") refs in this generation is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
          // atomic wrt other collectors in this configuration, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
          // are guaranteed to have empty discovered ref lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
          if (rp->discovery_is_atomic()) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10524
diff changeset
   602
            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
   603
            rp->setup_policy(do_clear_all_soft_refs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
          } else {
1606
dcf9714addbe 6684579: SoftReference processing can be made more efficient
ysr
parents: 977
diff changeset
   605
            // collect() below will enable discovery as appropriate
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
          }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4641
diff changeset
   607
          _gens[i]->collect(full, do_clear_all_soft_refs, size, is_tlab);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
          if (!rp->enqueuing_is_done()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
            rp->enqueue_discovered_references();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
            rp->set_enqueuing_is_done(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
          rp->verify_no_references_recorded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
        max_level_collected = i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
        // Determine if allocation request was met.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
        if (size > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
          if (!is_tlab || _gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
            if (size*HeapWordSize <= _gens[i]->unsafe_max_alloc_nogc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
              size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
        COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
        _gens[i]->stat_record()->accumulated_time.stop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
        update_gc_stats(i, full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
        if (VerifyAfterGC && i >= VerifyGCLevel &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
            total_collections() >= VerifyGCStartAt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
          HandleMark hm;  // Discard invalid handles created during verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
          gclog_or_tty->print(" VerifyAfterGC:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
          Universe::verify(false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
        if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
          gclog_or_tty->print(":");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
          _gens[i]->print_heap_change(prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
    // Update "complete" boolean wrt what actually transpired --
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
    // for instance, a promotion failure could have led to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
    // a whole heap collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
    complete = complete || (max_level_collected == n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
2141
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   651
    if (complete) { // We did a "major" collection
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   652
      post_full_gc_dump();   // do any post full gc dumps
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   653
    }
e9a644aaff87 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 2010
diff changeset
   654
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
    if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
      print_heap_change(gch_prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
      // Print perm gen info for full GC with PrintGCDetails flag.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
      if (complete) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
        print_perm_heap_change(perm_prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
    for (int j = max_level_collected; j >= 0; j -= 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
      // Adjust generation sizes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
      _gens[j]->compute_new_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
    if (complete) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
      // Ask the permanent generation to adjust size for full collections
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
      perm()->compute_new_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
      update_full_collections_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
    // Track memory usage and detect low memory after GC finishes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
    MemoryService::track_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    gc_epilogue(complete);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
    if (must_restore_marks_for_biased_locking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
      BiasedLocking::restore_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  AdaptiveSizePolicy* sp = gen_policy()->size_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  AdaptiveSizePolicyOutput(sp, total_collections());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  if (PrintHeapAtGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
    Universe::print_heap_after_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1893
diff changeset
   692
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1893
diff changeset
   693
  ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1893
diff changeset
   694
#endif
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 1893
diff changeset
   695
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
    tty->print_cr("Stopping after GC #%d", ExitAfterGCNum);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
    vm_exit(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
HeapWord* GenCollectedHeap::satisfy_failed_allocation(size_t size, bool is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  return collector_policy()->satisfy_failed_allocation(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
void GenCollectedHeap::set_par_threads(int t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
  SharedHeap::set_par_threads(t);
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6176
diff changeset
   708
  _gen_process_strong_tasks->set_n_threads(t);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
void GenCollectedHeap::
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
gen_process_strong_roots(int level,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
                         bool younger_gens_as_roots,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   714
                         bool activate_scope,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
                         bool collecting_perm_gen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
                         SharedHeap::ScanningOption so,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   717
                         OopsInGenClosure* not_older_gens,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   718
                         bool do_code_roots,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   719
                         OopsInGenClosure* older_gens) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  // General strong roots.
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   721
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   722
  if (!do_code_roots) {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   723
    SharedHeap::process_strong_roots(activate_scope, collecting_perm_gen, so,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   724
                                     not_older_gens, NULL, older_gens);
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   725
  } else {
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   726
    bool do_code_marking = (activate_scope || nmethod::oops_do_marking_is_active());
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   727
    CodeBlobToOopClosure code_roots(not_older_gens, /*do_marking=*/ do_code_marking);
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   728
    SharedHeap::process_strong_roots(activate_scope, collecting_perm_gen, so,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   729
                                     not_older_gens, &code_roots, older_gens);
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   730
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  if (younger_gens_as_roots) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    if (!_gen_process_strong_tasks->is_task_claimed(GCH_PS_younger_gens)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
      for (int i = 0; i < level; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
        not_older_gens->set_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
        _gens[i]->oop_iterate(not_older_gens);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
      not_older_gens->reset_generation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  // When collection is parallel, all threads get to cooperate to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  // older-gen scanning.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  for (int i = level+1; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
    older_gens->set_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
    rem_set()->younger_refs_iterate(_gens[i], older_gens);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
    older_gens->reset_generation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  _gen_process_strong_tasks->all_tasks_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   753
                                              CodeBlobClosure* code_roots,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
                                              OopClosure* non_root_closure) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3581
diff changeset
   755
  SharedHeap::process_weak_roots(root_closure, code_roots, non_root_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  // "Local" "weak" refs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
    _gens[i]->ref_processor()->weak_oops_do(root_closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
#define GCH_SINCE_SAVE_MARKS_ITERATE_DEFN(OopClosureType, nv_suffix)    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
void GenCollectedHeap::                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
oop_since_save_marks_iterate(int level,                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
                             OopClosureType* cur,                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
                             OopClosureType* older) {                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  _gens[level]->oop_since_save_marks_iterate##nv_suffix(cur);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  for (int i = level+1; i < n_gens(); i++) {                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
    _gens[i]->oop_since_save_marks_iterate##nv_suffix(older);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  }                                                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  perm_gen()->oop_since_save_marks_iterate##nv_suffix(older);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DEFN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
#undef GCH_SINCE_SAVE_MARKS_ITERATE_DEFN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
bool GenCollectedHeap::no_allocs_since_save_marks(int level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  for (int i = level; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
    if (!_gens[i]->no_allocs_since_save_marks()) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  return perm_gen()->no_allocs_since_save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
bool GenCollectedHeap::supports_inline_contig_alloc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  return _gens[0]->supports_inline_contig_alloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
HeapWord** GenCollectedHeap::top_addr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  return _gens[0]->top_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
HeapWord** GenCollectedHeap::end_addr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  return _gens[0]->end_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
size_t GenCollectedHeap::unsafe_max_alloc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  return _gens[0]->unsafe_max_alloc_nogc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
// public collection interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
void GenCollectedHeap::collect(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  if (should_do_concurrent_full_gc(cause)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    // mostly concurrent full collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    collect_mostly_concurrent(cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
#else  // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
    if (cause == GCCause::_scavenge_alot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
      // minor collection only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
      collect(cause, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
      // Stop-the-world full collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
      collect(cause, n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
    // Stop-the-world full collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
    collect(cause, n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
void GenCollectedHeap::collect(GCCause::Cause cause, int max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  // The caller doesn't have the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  collect_locked(cause, max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
// This interface assumes that it's being called by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
// vm thread. It collects the heap assuming that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
// heap lock is already held and that we are executing in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
// the context of the vm thread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
void GenCollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  assert(Thread::current()->is_VM_thread(), "Precondition#1");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  assert(Heap_lock->is_locked(), "Precondition#2");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  GCCauseSetter gcs(this, cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  switch (cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
    case GCCause::_heap_inspection:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
    case GCCause::_heap_dump: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
      HandleMark hm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
      do_full_collection(false,         // don't clear all soft refs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
                         n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    default: // XXX FIX ME
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
      ShouldNotReachHere(); // Unexpected use of this function
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
void GenCollectedHeap::collect_locked(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  // The caller has the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
  assert(Heap_lock->owned_by_self(), "this thread should own the Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  collect_locked(cause, n_gens() - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
// this is the private collection interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
// The Heap_lock is expected to be held on entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
void GenCollectedHeap::collect_locked(GCCause::Cause cause, int max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  if (_preloading_shared_classes) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7419
diff changeset
   866
    report_out_of_shared_space(SharedPermGen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  // Read the GC count while holding the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  unsigned int gc_count_before      = total_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  unsigned int full_gc_count_before = total_full_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
    MutexUnlocker mu(Heap_lock);  // give up heap lock, execute gets it back
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
    VM_GenCollectFull op(gc_count_before, full_gc_count_before,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
                         cause, max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
bool GenCollectedHeap::create_cms_collector() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  assert(((_gens[1]->kind() == Generation::ConcurrentMarkSweep) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
         (_gens[1]->kind() == Generation::ASConcurrentMarkSweep)) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
         _perm_gen->as_gen()->kind() == Generation::ConcurrentMarkSweep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
         "Unexpected generation kinds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  // Skip two header words in the block content verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  NOT_PRODUCT(_skip_header_HeapWords = CMSCollector::skip_header_HeapWords();)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  CMSCollector* collector = new CMSCollector(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
    (ConcurrentMarkSweepGeneration*)_gens[1],
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
    (ConcurrentMarkSweepGeneration*)_perm_gen->as_gen(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
    _rem_set->as_CardTableRS(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    (ConcurrentMarkSweepPolicy*) collector_policy());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  if (collector == NULL || !collector->completed_initialization()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
    if (collector) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
      delete collector;  // Be nice in embedded situation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
    vm_shutdown_during_initialization("Could not create CMS collector");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  return true;  // success
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
void GenCollectedHeap::collect_mostly_concurrent(GCCause::Cause cause) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  assert(!Heap_lock->owned_by_self(), "Should not own Heap_lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  // Read the GC counts while holding the Heap_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
  unsigned int full_gc_count_before = total_full_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  unsigned int gc_count_before      = total_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
    MutexUnlocker mu(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
    VM_GenCollectFullConcurrent op(gc_count_before, full_gc_count_before, cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
void GenCollectedHeap::do_full_collection(bool clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
                                          int max_level) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  int local_max_level;
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   923
  if (!incremental_collection_will_fail(false /* don't consult_young */) &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
      gc_cause() == GCCause::_gc_locker) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
    local_max_level = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
    local_max_level = max_level;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
  do_collection(true                 /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
                clear_all_soft_refs  /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
                0                    /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
                false                /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
                local_max_level      /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  // Hack XXX FIX ME !!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  // A scavenge may not have been attempted, or may have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  // been attempted and failed, because the old gen was too full
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  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
   939
      incremental_collection_will_fail(false /* don't consult_young */)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
    if (PrintGCDetails) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
      gclog_or_tty->print_cr("GC locker: Trying a full collection "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
                             "because scavenge failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
    // This time allow the old gen to be collected as well
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
    do_collection(true                 /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
                  clear_all_soft_refs  /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
                  0                    /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
                  false                /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
                  n_gens() - 1         /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   953
bool GenCollectedHeap::is_in_young(oop p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   954
  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
   955
  assert(result == _gens[0]->is_in_reserved(p),
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   956
         err_msg("incorrect test - result=%d, p=" PTR_FORMAT, result, (void*)p));
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   957
  return result;
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   958
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   959
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
// Returns "TRUE" iff "p" points into the allocated area of the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
bool GenCollectedHeap::is_in(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
  #ifndef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  guarantee(VerifyBeforeGC   ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
            VerifyDuringGC   ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
            VerifyBeforeExit ||
4584
e2a449e8cc6f 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 3908
diff changeset
   966
            PrintAssembly    ||
e2a449e8cc6f 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 3908
diff changeset
   967
            tty->count() != 0 ||   // already printing
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5906
diff changeset
   968
            VerifyAfterGC    ||
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5906
diff changeset
   969
    VMError::fatal_error_in_progress(), "too expensive");
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5906
diff changeset
   970
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  // This might be sped up with a cache of the last generation that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  // answered yes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
    if (_gens[i]->is_in(p)) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  if (_perm_gen->as_gen()->is_in(p)) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  // Otherwise...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   982
#ifdef ASSERT
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   983
// 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
   984
// 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
   985
bool GenCollectedHeap::is_in_partial_collection(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   986
  assert(is_in_reserved(p) || p == NULL,
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   987
    "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
   988
  // The order of the generations is young (low addr), old, perm (high addr)
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   989
  return p < _gens[_n_gens - 2]->reserved().end() && p != NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
}
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   991
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
void GenCollectedHeap::oop_iterate(OopClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
    _gens[i]->oop_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
void GenCollectedHeap::oop_iterate(MemRegion mr, OopClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
    _gens[i]->oop_iterate(mr, cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
void GenCollectedHeap::object_iterate(ObjectClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
    _gens[i]->object_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  perm_gen()->object_iterate(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
  1012
void GenCollectedHeap::safe_object_iterate(ObjectClosure* cl) {
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
  1013
  for (int i = 0; i < _n_gens; i++) {
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
  1014
    _gens[i]->safe_object_iterate(cl);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
  1015
  }
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
  1016
  perm_gen()->safe_object_iterate(cl);
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
  1017
}
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1610
diff changeset
  1018
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
void GenCollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
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]->object_iterate_since_last_GC(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
Space* GenCollectedHeap::space_containing(const void* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
    Space* res = _gens[i]->space_containing(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
    if (res != NULL) return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  Space* res = perm_gen()->space_containing(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  if (res != NULL) return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  // Otherwise...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  assert(false, "Could not find containing space");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
HeapWord* GenCollectedHeap::block_start(const void* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  assert(is_in_reserved(addr), "block_start of address outside of heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
    if (_gens[i]->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
      assert(_gens[i]->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
             "addr should be in allocated part of generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
      return _gens[i]->block_start(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  if (perm_gen()->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
    assert(perm_gen()->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
           "addr should be in allocated part of perm gen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
    return perm_gen()->block_start(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  assert(false, "Some generation should contain the address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
size_t GenCollectedHeap::block_size(const HeapWord* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
  assert(is_in_reserved(addr), "block_size of address outside of heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
    if (_gens[i]->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
      assert(_gens[i]->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
             "addr should be in allocated part of generation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
      return _gens[i]->block_size(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  if (perm_gen()->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
    assert(perm_gen()->is_in(addr),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
           "addr should be in allocated part of perm gen");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
    return perm_gen()->block_size(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  assert(false, "Some generation should contain the address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
bool GenCollectedHeap::block_is_obj(const HeapWord* addr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  assert(is_in_reserved(addr), "block_is_obj of address outside of heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
  assert(block_start(addr) == addr, "addr must be a block start");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
    if (_gens[i]->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
      return _gens[i]->block_is_obj(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  if (perm_gen()->is_in_reserved(addr)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
    return perm_gen()->block_is_obj(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  assert(false, "Some generation should contain the address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
bool GenCollectedHeap::supports_tlab_allocation() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  for (int i = 0; i < _n_gens; i += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
    if (_gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
size_t GenCollectedHeap::tlab_capacity(Thread* thr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  size_t result = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
  for (int i = 0; i < _n_gens; i += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
    if (_gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
      result += _gens[i]->tlab_capacity();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
size_t GenCollectedHeap::unsafe_max_tlab_alloc(Thread* thr) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  size_t result = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
  for (int i = 0; i < _n_gens; i += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
    if (_gens[i]->supports_tlab_allocation()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
      result += _gens[i]->unsafe_max_tlab_alloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
HeapWord* GenCollectedHeap::allocate_new_tlab(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  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
  1120
  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
  1121
                                               true /* is_tlab */,
b75b7939f448 6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents: 9995
diff changeset
  1122
                                               &gc_overhead_limit_was_exceeded);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
// Requires "*prev_ptr" to be non-NULL.  Deletes and a block of minimal size
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
// from the list headed by "*prev_ptr".
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
static ScratchBlock *removeSmallestScratch(ScratchBlock **prev_ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  bool first = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  size_t min_size = 0;   // "first" makes this conceptually infinite.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  ScratchBlock **smallest_ptr, *smallest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  ScratchBlock  *cur = *prev_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  while (cur) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
    assert(*prev_ptr == cur, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
    if (first || cur->num_words < min_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
      smallest_ptr = prev_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
      smallest     = cur;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
      min_size     = smallest->num_words;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
      first        = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
    prev_ptr = &cur->next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
    cur     =  cur->next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  smallest      = *smallest_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  *smallest_ptr = smallest->next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  return smallest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
// Sort the scratch block list headed by res into decreasing size order,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
// and set "res" to the result.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
static void sort_scratch_list(ScratchBlock*& list) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  ScratchBlock* sorted = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  ScratchBlock* unsorted = list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  while (unsorted) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
    ScratchBlock *smallest = removeSmallestScratch(&unsorted);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
    smallest->next  = sorted;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
    sorted          = smallest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  list = sorted;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
ScratchBlock* GenCollectedHeap::gather_scratch(Generation* requestor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
                                               size_t max_alloc_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  ScratchBlock* res = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
    _gens[i]->contribute_scratch(res, requestor, max_alloc_words);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
  sort_scratch_list(res);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1171
void GenCollectedHeap::release_scratch() {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1172
  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
  1173
    _gens[i]->reset_scratch();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1174
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1175
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1176
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
class GenPrepareForVerifyClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
    gen->prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
void GenCollectedHeap::prepare_for_verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  ensure_parsability(false);        // no need to retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  GenPrepareForVerifyClosure blk;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  generation_iterate(&blk, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  perm_gen()->prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
void GenCollectedHeap::generation_iterate(GenClosure* cl,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
                                          bool old_to_young) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  if (old_to_young) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
    for (int i = _n_gens-1; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
      cl->do_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
    for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
      cl->do_generation(_gens[i]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
void GenCollectedHeap::space_iterate(SpaceClosure* cl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
    _gens[i]->space_iterate(cl, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  perm_gen()->space_iterate(cl, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
bool GenCollectedHeap::is_maximal_no_gc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  for (int i = 0; i < _n_gens; i++) {  // skip perm gen
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
    if (!_gens[i]->is_maximal_no_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
void GenCollectedHeap::save_marks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
    _gens[i]->save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  perm_gen()->save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
void GenCollectedHeap::compute_new_generation_sizes(int collectedGen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
  for (int i = 0; i <= collectedGen; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
    _gens[i]->compute_new_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
GenCollectedHeap* GenCollectedHeap::heap() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  assert(_gch != NULL, "Uninitialized access to GenCollectedHeap::heap()");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
  assert(_gch->kind() == CollectedHeap::GenCollectedHeap, "not a generational heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  return _gch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
void GenCollectedHeap::prepare_for_compaction() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
  Generation* scanning_gen = _gens[_n_gens-1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  // Start by compacting into same gen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  CompactPoint cp(scanning_gen, NULL, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  while (scanning_gen != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
    scanning_gen->prepare_for_compaction(&cp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
    scanning_gen = prev_gen(scanning_gen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
GCStats* GenCollectedHeap::gc_stats(int level) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
  return _gens[level]->gc_stats();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9935
diff changeset
  1254
void GenCollectedHeap::verify(bool allow_dirty, bool silent, VerifyOption option /* ignored */) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  if (!silent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
    gclog_or_tty->print("permgen ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
  perm_gen()->verify(allow_dirty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  for (int i = _n_gens-1; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
    Generation* g = _gens[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
    if (!silent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
      gclog_or_tty->print(g->name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
      gclog_or_tty->print(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
    g->verify(allow_dirty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
  if (!silent) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
    gclog_or_tty->print("remset ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
  rem_set()->verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
void GenCollectedHeap::print() const { print_on(tty); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
void GenCollectedHeap::print_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
  for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
    _gens[i]->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
  perm_gen()->print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
void GenCollectedHeap::gc_threads_do(ThreadClosure* tc) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
  if (workers() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
    workers()->threads_do(tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
    ConcurrentMarkSweepThread::threads_do(tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
void GenCollectedHeap::print_gc_threads_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
#ifndef SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  if (UseParNewGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
    workers()->print_worker_threads_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
    ConcurrentMarkSweepThread::print_all_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
void GenCollectedHeap::print_tracing_info() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
  if (TraceGen0Time) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
    get_gen(0)->print_summary_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
  if (TraceGen1Time) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
    get_gen(1)->print_summary_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
void GenCollectedHeap::print_heap_change(size_t prev_used) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
  if (PrintGCDetails && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
    gclog_or_tty->print(" "  SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
                        "->" SIZE_FORMAT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
                        "("  SIZE_FORMAT ")",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
                        prev_used, used(), capacity());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
    gclog_or_tty->print(" "  SIZE_FORMAT "K"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
                        "->" SIZE_FORMAT "K"
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
                        "("  SIZE_FORMAT "K)",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
                        prev_used / K, used() / K, capacity() / K);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
//New method to print perm gen info with PrintGCDetails flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
void GenCollectedHeap::print_perm_heap_change(size_t perm_prev_used) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
  gclog_or_tty->print(", [%s :", perm_gen()->short_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  perm_gen()->print_heap_change(perm_prev_used);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
  gclog_or_tty->print("]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
class GenGCPrologueClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
  bool _full;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
    gen->gc_prologue(_full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  GenGCPrologueClosure(bool full) : _full(full) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
void GenCollectedHeap::gc_prologue(bool full) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  always_do_update_barrier = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  // Fill TLAB's and such
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
  CollectedHeap::accumulate_statistics_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
  ensure_parsability(true);   // retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
  // Call allocation profiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
  AllocationProfiler::iterate_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  // Walk generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
  GenGCPrologueClosure blk(full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
  generation_iterate(&blk, false);  // not old-to-young.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
  perm_gen()->gc_prologue(full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
class GenGCEpilogueClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
  bool _full;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
    gen->gc_epilogue(_full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  GenGCEpilogueClosure(bool full) : _full(full) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
void GenCollectedHeap::gc_epilogue(bool full) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
#ifdef COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
  assert(DerivedPointerTable::is_empty(), "derived pointer present");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  size_t actual_gap = pointer_delta((HeapWord*) (max_uintx-3), *(end_addr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
  guarantee(actual_gap > (size_t)FastAllocateSizeLimit, "inline allocation wraps");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
#endif /* COMPILER2 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
  resize_all_tlabs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
  GenGCEpilogueClosure blk(full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  generation_iterate(&blk, false);  // not old-to-young.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
  perm_gen()->gc_epilogue(full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
10022
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1382
  if (!CleanChunkPoolAsync) {
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1383
    Chunk::clean_chunk_pool();
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1384
  }
377345fb5fb5 7061204: clean the chunk table synchronously in embedded builds
jcoomes
parents: 9997
diff changeset
  1385
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
  always_do_update_barrier = UseConcMarkSweepGC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1389
#ifndef PRODUCT
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1390
class GenGCSaveTopsBeforeGCClosure: public GenCollectedHeap::GenClosure {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1391
 private:
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1392
 public:
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1393
  void do_generation(Generation* gen) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1394
    gen->record_spaces_top();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1395
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1396
};
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1397
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1398
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
  1399
  if (ZapUnusedHeapArea) {
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1400
    GenGCSaveTopsBeforeGCClosure blk;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1401
    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
  1402
    perm_gen()->record_spaces_top();
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1403
  }
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1404
}
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1405
#endif  // not PRODUCT
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 360
diff changeset
  1406
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
class GenEnsureParsabilityClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
    gen->ensure_parsability();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
void GenCollectedHeap::ensure_parsability(bool retire_tlabs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
  CollectedHeap::ensure_parsability(retire_tlabs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
  GenEnsureParsabilityClosure ep_cl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
  generation_iterate(&ep_cl, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
  perm_gen()->ensure_parsability();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
oop GenCollectedHeap::handle_failed_promotion(Generation* gen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
                                              oop obj,
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1423
                                              size_t obj_size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
  assert(obj_size == (size_t)obj->size(), "bad obj_size passed in");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
  // First give each higher generation a chance to allocate the promoted object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
  Generation* allocator = next_gen(gen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
  if (allocator != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
    do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
      result = allocator->allocate(obj_size, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
    } while (result == NULL && (allocator = next_gen(allocator)) != NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
  if (result == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
    // Then give gen and higher generations a chance to expand and allocate the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
    // object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
    do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
      result = gen->expand_and_allocate(obj_size, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
    } while (result == NULL && (gen = next_gen(gen)) != NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
    Copy::aligned_disjoint_words((HeapWord*)obj, result, obj_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
  return oop(result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
class GenTimeOfLastGCClosure: public GenCollectedHeap::GenClosure {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  jlong _time;   // in ms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
  jlong _now;    // in ms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
  GenTimeOfLastGCClosure(jlong now) : _time(now), _now(now) { }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
  jlong time() { return _time; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
  void do_generation(Generation* gen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
    _time = MIN2(_time, gen->time_of_last_gc(_now));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
jlong GenCollectedHeap::millis_since_last_gc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
  jlong now = os::javaTimeMillis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  GenTimeOfLastGCClosure tolgc_cl(now);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
  // iterate over generations getting the oldest
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
  // time that a generation was collected
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  generation_iterate(&tolgc_cl, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
  tolgc_cl.do_generation(perm_gen());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
  // XXX Despite the assert above, since javaTimeMillis()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  // doesnot guarantee monotonically increasing return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  // values (note, i didn't say "strictly monotonic"),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  // we need to guard against getting back a time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
  // later than now. This should be fixed by basing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  // on someting like gethrtime() which guarantees
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
  // monotonicity. Note that cond_wait() is susceptible
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
  // to a similar problem, because its interface is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
  // based on absolute time in the form of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
  // system time's notion of UCT. See also 4506635
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
  // for yet another problem of similar nature. XXX
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
  jlong retVal = now - tolgc_cl.time();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
  if (retVal < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
    NOT_PRODUCT(warning("time warp: %d", retVal);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  return retVal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
}