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