hotspot/src/share/vm/memory/genCollectedHeap.hpp
author tschatzl
Wed, 11 Sep 2013 16:25:02 +0200
changeset 19986 33d188c66ed9
parent 19286 48394008c803
child 21560 b3ae3ba25ebb
permissions -rw-r--r--
8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19286
diff changeset
     2
 * Copyright (c) 2000, 2013, 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: 4637
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4637
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: 4637
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
#ifndef SHARE_VM_MEMORY_GENCOLLECTEDHEAP_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    26
#define SHARE_VM_MEMORY_GENCOLLECTEDHEAP_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    28
#include "gc_implementation/shared/adaptiveSizePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    29
#include "memory/collectorPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    30
#include "memory/generation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    31
#include "memory/sharedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    32
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class SubTasksDone;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// A "GenCollectedHeap" is a SharedHeap that uses generational
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// collection.  It is represented with a sequence of Generation's.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class GenCollectedHeap : public SharedHeap {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  friend class GenCollectorPolicy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  friend class Generation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  friend class DefNewGeneration;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  friend class TenuredGeneration;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  friend class ConcurrentMarkSweepGeneration;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  friend class CMSCollector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  friend class GenMarkSweep;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  friend class VM_GenCollectForAllocation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  friend class VM_GenCollectFull;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  friend class VM_GenCollectFullConcurrent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  friend class VM_GC_HeapInspection;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  friend class VM_HeapDumper;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  friend class HeapInspection;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  friend class GCCauseSetter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  enum SomeConstants {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    max_gens = 10
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  friend class VM_PopulateDumpSharedSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  // Fields:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  static GenCollectedHeap* _gch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  int _n_gens;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  Generation* _gens[max_gens];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  GenerationSpec** _gen_specs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  // The generational collector policy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  GenCollectorPolicy* _gen_policy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
    72
  // Indicates that the most recent previous incremental collection failed.
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
    73
  // The flag is cleared when an action is taken that might clear the
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
    74
  // condition that caused that incremental collection to fail.
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
    75
  bool _incremental_collection_failed;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // In support of ExplicitGCInvokesConcurrent functionality
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  unsigned int _full_collections_completed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // Data structure for claiming the (potentially) parallel tasks in
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // (gen-specific) strong roots processing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  SubTasksDone* _gen_process_strong_tasks;
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 5547
diff changeset
    83
  SubTasksDone* gen_process_strong_tasks() { return _gen_process_strong_tasks; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // In block contents verification, the number of header words to skip
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  NOT_PRODUCT(static size_t _skip_header_HeapWords;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  // Directs each generation up to and including "collectedGen" to recompute
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // its desired size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  void compute_new_generation_sizes(int collectedGen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // Helper functions for allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  HeapWord* attempt_allocation(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
                               bool   is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
                               bool   first_only);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // Helper function for two callbacks below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // Considers collection of the first max_level+1 generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  void do_collection(bool   full,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
                     bool   clear_all_soft_refs,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
                     size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
                     bool   is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
                     int    max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // Callback from VM_GenCollectForAllocation operation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // This function does everything necessary/possible to satisfy an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // allocation request that failed in the youngest generation that should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // have handled it (including collection, expansion, etc.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  HeapWord* satisfy_failed_allocation(size_t size, bool is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // Callback from VM_GenCollectFull operation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  // Perform a full collection of the first max_level+1 generations.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   114
  virtual void do_full_collection(bool clear_all_soft_refs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  void do_full_collection(bool clear_all_soft_refs, int max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // Does the "cause" of GC indicate that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // we absolutely __must__ clear soft refs?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  bool must_clear_all_soft_refs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  GenCollectedHeap(GenCollectorPolicy *policy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  GCStats* gc_stats(int level) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  // Returns JNI_OK on success
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  virtual jint initialize();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   128
  char* allocate(size_t alignment,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
                 size_t* _total_reserved, int* _n_covered_regions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
                 ReservedSpace* heap_rs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // Does operations required after initialization has been done.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  void post_initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  // Initialize ("weak") refs processing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  virtual void ref_processing_init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  virtual CollectedHeap::Name kind() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    return CollectedHeap::GenCollectedHeap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  // The generational collector policy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  GenCollectorPolicy* gen_policy() const { return _gen_policy; }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   144
  virtual CollectorPolicy* collector_policy() const { return (CollectorPolicy*) gen_policy(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  // Adaptive size policy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  virtual AdaptiveSizePolicy* size_policy() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    return gen_policy()->size_policy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19286
diff changeset
   151
  // Return the (conservative) maximum heap alignment
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19286
diff changeset
   152
  static size_t conservative_max_heap_alignment() {
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19286
diff changeset
   153
    return Generation::GenGrain;
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19286
diff changeset
   154
  }
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19286
diff changeset
   155
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  size_t capacity() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  size_t used() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   159
  // Save the "used_region" for generations level and lower.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   160
  void save_used_regions(int level);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  size_t max_capacity() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  HeapWord* mem_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
                         bool*  gc_overhead_limit_was_exceeded);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // We may support a shared contiguous allocation area, if the youngest
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // generation does.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  bool supports_inline_contig_alloc() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  HeapWord** top_addr() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  HeapWord** end_addr() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Return an estimate of the maximum allocation that could be performed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // without triggering any collection activity.  In a generational
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // collector, for example, this is probably the largest allocation that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // could be supported in the youngest generation.  It is "unsafe" because
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // no locks are taken; the result should be treated as an approximation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // not a guarantee.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  size_t unsafe_max_alloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // Does this heap support heap inspection? (+PrintClassHistogram)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  virtual bool supports_heap_inspection() const { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  // Perform a full collection of the heap; intended for use in implementing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  // "System.gc". This implies as full a collection as the CollectedHeap
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // supports. Caller does not hold the Heap_lock on entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  void collect(GCCause::Cause cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // The same as above but assume that the caller holds the Heap_lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  void collect_locked(GCCause::Cause cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // Perform a full collection of the first max_level+1 generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Mostly used for testing purposes. Caller does not hold the Heap_lock on entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  void collect(GCCause::Cause cause, int max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 10997
diff changeset
   196
  // Returns "TRUE" iff "p" points into the committed areas of the heap.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // The methods is_in(), is_in_closed_subset() and is_in_youngest() may
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // be expensive to compute in general, so, to prevent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  // their inadvertent use in product jvm's, we restrict their use to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // assertion checking or verification only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  bool is_in(const void* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // override
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  bool is_in_closed_subset(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    if (UseConcMarkSweepGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
      return is_in_reserved(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
      return is_in(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   212
  // Returns true if the reference is to an object in the reserved space
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   213
  // for the young generation.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   214
  // Assumes the the young gen address range is less than that of the old gen.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   215
  bool is_in_young(oop p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   216
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   217
#ifdef ASSERT
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   218
  virtual bool is_in_partial_collection(const void* p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   219
#endif
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   220
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   221
  virtual bool is_scavengable(const void* addr) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   222
    return is_in_young((oop)addr);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   223
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  // Iteration functions.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   226
  void oop_iterate(ExtendedOopClosure* cl);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   227
  void oop_iterate(MemRegion mr, ExtendedOopClosure* cl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  void object_iterate(ObjectClosure* cl);
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   229
  void safe_object_iterate(ObjectClosure* cl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  Space* space_containing(const void* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // A CollectedHeap is divided into a dense sequence of "blocks"; that is,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // each address in the (reserved) heap is a member of exactly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // one block.  The defining characteristic of a block is that it is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // possible to find its size, and thus to progress forward to the next
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // block.  (Blocks may be of different sizes.)  Thus, blocks may
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  // represent Java objects, or they might be free blocks in a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // free-list-based heap (or subheap), as long as the two kinds are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  // distinguishable and the size of each is determinable.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // Returns the address of the start of the "block" that contains the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  // address "addr".  We say "blocks" instead of "object" since some heaps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // may not pack objects densely; a chunk may either be an object or a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  // non-object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  virtual HeapWord* block_start(const void* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  // Requires "addr" to be the start of a chunk, and returns its size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  // "addr + size" is required to be the start of a new chunk, or the end
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  // of the active area of the heap. Assumes (and verifies in non-product
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  // builds) that addr is in the allocated part of the heap and is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  // the start of a chunk.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  virtual size_t block_size(const HeapWord* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  // Requires "addr" to be the start of a block, and returns "TRUE" iff
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  // the block is an object. Assumes (and verifies in non-product
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // builds) that addr is in the allocated part of the heap and is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // the start of a chunk.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  virtual bool block_is_obj(const HeapWord* addr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // Section on TLAB's.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  virtual bool supports_tlab_allocation() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  virtual size_t tlab_capacity(Thread* thr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  virtual HeapWord* allocate_new_tlab(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 389
diff changeset
   266
  // Can a compiler initialize a new object without store barriers?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 389
diff changeset
   267
  // This permission only extends from the creation of a new object
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 389
diff changeset
   268
  // via a TLAB up to the first subsequent safepoint.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 389
diff changeset
   269
  virtual bool can_elide_tlab_store_barriers() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 389
diff changeset
   270
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 389
diff changeset
   271
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 389
diff changeset
   272
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4031
diff changeset
   273
  virtual bool card_mark_must_follow_store() const {
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4031
diff changeset
   274
    return UseConcMarkSweepGC;
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4031
diff changeset
   275
  }
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4031
diff changeset
   276
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   277
  // We don't need barriers for stores to objects in the
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   278
  // young gen and, a fortiori, for initializing stores to
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   279
  // objects therein. This applies to {DefNew,ParNew}+{Tenured,CMS}
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   280
  // only and may need to be re-examined in case other
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   281
  // kinds of collectors are implemented in the future.
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   282
  virtual bool can_elide_initializing_store_barrier(oop new_obj) {
4031
439e2afc9abc 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 4030
diff changeset
   283
    // We wanted to assert that:-
439e2afc9abc 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 4030
diff changeset
   284
    // assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC,
439e2afc9abc 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 4030
diff changeset
   285
    //       "Check can_elide_initializing_store_barrier() for this collector");
439e2afc9abc 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 4030
diff changeset
   286
    // but unfortunately the flag UseSerialGC need not necessarily always
439e2afc9abc 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 4030
diff changeset
   287
    // be set when DefNew+Tenured are being used.
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9342
diff changeset
   288
    return is_in_young(new_obj);
4030
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   289
  }
4c471254865e 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 3908
diff changeset
   290
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // The "requestor" generation is performing some garbage collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  // action for which it would be useful to have scratch space.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // requestor promises to allocate no more than "max_alloc_words" in any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  // older generation (via promotion say.)   Any blocks of space that can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // be provided are returned as a list of ScratchBlocks, sorted by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  // decreasing size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  ScratchBlock* gather_scratch(Generation* requestor, size_t max_alloc_words);
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 389
diff changeset
   298
  // Allow each generation to reset any scratch space that it has
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 389
diff changeset
   299
  // contributed as it needs.
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 389
diff changeset
   300
  void release_scratch();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // Ensure parsability: override
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  virtual void ensure_parsability(bool retire_tlabs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  // Time in ms since the longest time a collector ran in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // in any generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  virtual jlong millis_since_last_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  // Total number of full collections completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  unsigned int total_full_collections_completed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
    assert(_full_collections_completed <= _total_full_collections,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
           "Can't complete more collections than were started");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    return _full_collections_completed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // Update above counter, as appropriate, at the end of a stop-world GC cycle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  unsigned int update_full_collections_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  // Update above counter, as appropriate, at the end of a concurrent GC cycle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  unsigned int update_full_collections_completed(unsigned int count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // Update "time of last gc" for all constituent generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // to "now".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  void update_time_of_last_gc(jlong now) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
      _gens[i]->update_time_of_last_gc(now);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // Update the gc statistics for each generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  // "level" is the level of the lastest collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  void update_gc_stats(int current_level, bool full) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    for (int i = 0; i < _n_gens; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
      _gens[i]->update_gc_stats(current_level, full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  // Override.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  bool no_gc_in_progress() { return !is_gc_active(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  // Override.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  void prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  // Override.
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11396
diff changeset
   344
  void verify(bool silent, VerifyOption option);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // Override.
10997
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 9997
diff changeset
   347
  virtual void print_on(outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  virtual void print_gc_threads_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  virtual void gc_threads_do(ThreadClosure* tc) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  virtual void print_tracing_info() const;
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 13728
diff changeset
   351
  virtual void print_on_error(outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // PrintGC, PrintGCDetails support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  void print_heap_change(size_t prev_used) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  // The functions below are helper functions that a subclass of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  // "CollectedHeap" can use in the implementation of its virtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  // functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  class GenClosure : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
   public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    virtual void do_generation(Generation* gen) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   365
  // Apply "cl.do_generation" to all generations in the heap
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   366
  // If "old_to_young" determines the order.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  void generation_iterate(GenClosure* cl, bool old_to_young);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  void space_iterate(SpaceClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   371
  // Return "true" if all generations have reached the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  // maximal committed limit that they can reach, without a garbage
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  // collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  virtual bool is_maximal_no_gc() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   376
  // Return the generation before "gen".
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  Generation* prev_gen(Generation* gen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    int l = gen->level();
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   379
    guarantee(l > 0, "Out of bounds");
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   380
    return _gens[l-1];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   383
  // Return the generation after "gen".
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  Generation* next_gen(Generation* gen) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    int l = gen->level() + 1;
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   386
    guarantee(l < _n_gens, "Out of bounds");
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   387
    return _gens[l];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  Generation* get_gen(int i) const {
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   391
    guarantee(i >= 0 && i < _n_gens, "Out of bounds");
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   392
    return _gens[i];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  int n_gens() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    assert(_n_gens == gen_policy()->number_of_generations(), "Sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    return _n_gens;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  // Convenience function to be used in situations where the heap type can be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  // asserted to be this type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  static GenCollectedHeap* heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11247
diff changeset
   404
  void set_par_threads(uint t);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  // Invoke the "do_oop" method of one of the closures "not_older_gens"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  // or "older_gens" on root locations for the generation at
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // "level".  (The "older_gens" closure is used for scanning references
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  // from older generations; "not_older_gens" is used everywhere else.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  // If "younger_gens_as_roots" is false, younger generations are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // not scanned as roots; in this case, the caller must be arranging to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // scan the younger generations itself.  (For example, a generation might
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  // explicitly mark reachable objects in younger generations, to avoid
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   414
  // excess storage retention.)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   415
  // The "so" argument determines which of the roots
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // the closure is applied to:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // "SO_None" does none;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  // "SO_AllClasses" applies the closure to all entries in the SystemDictionary;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  // "SO_SystemClasses" to all the "system" classes and loaders;
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 7419
diff changeset
   420
  // "SO_Strings" applies the closure to all entries in the StringTable.
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   421
  void gen_process_strong_roots(int level,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   422
                                bool younger_gens_as_roots,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   423
                                // The remaining arguments are in an order
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   424
                                // consistent with SharedHeap::process_strong_roots:
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   425
                                bool activate_scope,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   426
                                bool is_scavenging,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
                                SharedHeap::ScanningOption so,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   428
                                OopsInGenClosure* not_older_gens,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3262
diff changeset
   429
                                bool do_code_roots,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   430
                                OopsInGenClosure* older_gens,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   431
                                KlassClosure* klass_closure);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // Apply "blk" to all the weak roots of the system.  These include
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  // JNI weak roots, the code cache, system dictionary, symbol table,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // string table, and referents of reachable weak refs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  void gen_process_weak_roots(OopClosure* root_closure,
17105
25b392a7740d 8012687: Remove unused is_root checks and closures
stefank
parents: 16685
diff changeset
   437
                              CodeBlobClosure* code_roots);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  // Set the saved marks of generations, if that makes sense.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  // In particular, if any generation might iterate over the oops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  // in other generations, it should call this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  void save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  // Apply "cur->do_oop" or "older->do_oop" to all the oops in objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  // allocated since the last call to save_marks in generations at or above
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   446
  // "level".  The "cur" closure is
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // applied to references in the generation at "level", and the "older"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   448
  // closure to older generations.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
#define GCH_SINCE_SAVE_MARKS_ITERATE_DECL(OopClosureType, nv_suffix)    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  void oop_since_save_marks_iterate(int level,                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
                                    OopClosureType* cur,                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
                                    OopClosureType* older);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DECL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
#undef GCH_SINCE_SAVE_MARKS_ITERATE_DECL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  // Returns "true" iff no allocations have occurred in any generation at
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   459
  // "level" or above since the last
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  // call to "save_marks".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  bool no_allocs_since_save_marks(int level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   463
  // Returns true if an incremental collection is likely to fail.
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   464
  // We optionally consult the young gen, if asked to do so;
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   465
  // otherwise we base our answer on whether the previous incremental
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   466
  // collection attempt failed with no corrective action as of yet.
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   467
  bool incremental_collection_will_fail(bool consult_young) {
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   468
    // Assumes a 2-generation system; the first disjunct remembers if an
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   469
    // incremental collection failed, even when we thought (second disjunct)
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   470
    // that it would not.
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   471
    assert(heap()->collector_policy()->is_two_generation_policy(),
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   472
           "the following definition may not be suitable for an n(>2)-generation system");
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   473
    return incremental_collection_failed() ||
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   474
           (consult_young && !get_gen(0)->collection_attempt_is_safe());
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   475
  }
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   476
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  // If a generation bails out of an incremental collection,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  // it sets this flag.
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   479
  bool incremental_collection_failed() const {
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   480
    return _incremental_collection_failed;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   482
  void set_incremental_collection_failed() {
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   483
    _incremental_collection_failed = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  }
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   485
  void clear_incremental_collection_failed() {
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6759
diff changeset
   486
    _incremental_collection_failed = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12379
diff changeset
   489
  // Promotion of obj into gen failed.  Try to promote obj to higher
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  // gens in ascending order; return the new location of obj if successful.
19286
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   491
  // Otherwise, try expand-and-allocate for obj in both the young and old
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   492
  // generation; return the new location of obj if successful.  Otherwise, return NULL.
48394008c803 8022800: Use specific generations rather than generation iteration
brutisso
parents: 18687
diff changeset
   493
  oop handle_failed_promotion(Generation* old_gen,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
                              oop obj,
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   495
                              size_t obj_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  // Accessor for memory state verification support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  NOT_PRODUCT(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
    static size_t skip_header_HeapWords() { return _skip_header_HeapWords; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  // Override
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  void check_for_non_bad_heap_word_value(HeapWord* addr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    size_t size) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  // For use by mark-sweep.  As implemented, mark-sweep-compact is global
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  // in an essential way: compaction is performed across generations, by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  // iterating over spaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  void prepare_for_compaction();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  // Perform a full collection of the first max_level+1 generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  // This is the low level interface used by the public versions of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  // collect() and collect_locked(). Caller holds the Heap_lock on entry.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  void collect_locked(GCCause::Cause cause, int max_level);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // Returns success or failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  bool create_cms_collector();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // In support of ExplicitGCInvokesConcurrent functionality
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  bool should_do_concurrent_full_gc(GCCause::Cause cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  void collect_mostly_concurrent(GCCause::Cause cause);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 389
diff changeset
   524
  // Save the tops of the spaces in all generations
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 389
diff changeset
   525
  void record_gen_tops_before_GC() PRODUCT_RETURN;
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 389
diff changeset
   526
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  virtual void gc_prologue(bool full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  virtual void gc_epilogue(bool full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
   531
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
   532
#endif // SHARE_VM_MEMORY_GENCOLLECTEDHEAP_HPP