hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp
author stefank
Wed, 14 Dec 2011 12:15:26 +0100
changeset 11247 d6faa02b3802
parent 10992 b998c6b89fa2
child 11396 917d8673b5ef
permissions -rw-r--r--
7121373: Clean up CollectedHeap::is_in Summary: Fixed G1CollectedHeap::is_in, added tests, cleaned up comments and made Space::is_in pure virtual. Reviewed-by: brutisso, tonyp, jcoomes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
9969
57932d7294a9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 7397
diff changeset
     2
 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5434
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5434
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: 5434
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: 6258
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    28
#include "gc_implementation/concurrentMarkSweep/binaryTreeDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    29
#include "gc_implementation/concurrentMarkSweep/freeList.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    30
#include "gc_implementation/concurrentMarkSweep/promotionInfo.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    31
#include "memory/blockOffsetTable.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    32
#include "memory/space.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    33
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// Classes in support of keeping track of promotions into a non-Contiguous
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// space, in this case a CompactibleFreeListSpace.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// Forward declarations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class CompactibleFreeListSpace;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class BlkClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
class BlkClosureCareful;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
class UpwardsObjectClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
class ObjectClosureCareful;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
class Klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
class LinearAllocBlock VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  LinearAllocBlock() : _ptr(0), _word_size(0), _refillSize(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
    _allocation_size_limit(0) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  void set(HeapWord* ptr, size_t word_size, size_t refill_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
    size_t allocation_size_limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
    _ptr = ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
    _word_size = word_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
    _refillSize = refill_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
    _allocation_size_limit = allocation_size_limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  HeapWord* _ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  size_t    _word_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  size_t    _refillSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  size_t    _allocation_size_limit;  // largest size that will be allocated
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
    60
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
    61
  void print_on(outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// Concrete subclass of CompactibleSpace that implements
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
// a free list space, such as used in the concurrent mark sweep
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
// generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
class CompactibleFreeListSpace: public CompactibleSpace {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  friend class ConcurrentMarkSweepGeneration;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  friend class ASConcurrentMarkSweepGeneration;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  friend class CMSCollector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  friend class CMSPermGenGen;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // Local alloc buffer for promotion into this space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  friend class CFLS_LAB;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // "Size" of chunks of work (executed during parallel remark phases
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // of CMS collection); this probably belongs in CMSCollector, although
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // it's cached here because it's used in
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // initialize_sequential_subtasks_for_rescan() which modifies
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // par_seq_tasks which also lives in Space. XXX
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  const size_t _rescan_task_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  const size_t _marking_task_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // Yet another sequential tasks done structure. This supports
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  // CMS GC, where we have threads dynamically
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // claiming sub-tasks from a larger parallel task.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  SequentialSubTasksDone _conc_par_seq_tasks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  BlockOffsetArrayNonContigSpace _bt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  CMSCollector* _collector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  ConcurrentMarkSweepGeneration* _gen;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // Data structures for free blocks (used during allocation/sweeping)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // Allocation is done linearly from two different blocks depending on
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // whether the request is small or large, in an effort to reduce
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // fragmentation. We assume that any locking for allocation is done
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // by the containing generation. Thus, none of the methods in this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  // space are re-entrant.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  enum SomeConstants {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    SmallForLinearAlloc = 16,        // size < this then use _sLAB
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    SmallForDictionary  = 257,       // size < this then use _indexedFreeList
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5434
diff changeset
   105
    IndexSetSize        = SmallForDictionary  // keep this odd-sized
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  };
10992
b998c6b89fa2 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 10771
diff changeset
   107
  static size_t IndexSetStart;
b998c6b89fa2 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 10771
diff changeset
   108
  static size_t IndexSetStride;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  enum FitStrategyOptions {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    FreeBlockStrategyNone = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    FreeBlockBestFitFirst
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  PromotionInfo _promoInfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // helps to impose a global total order on freelistLock ranks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  // assumes that CFLSpace's are allocated in global total order
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  static int   _lockRank;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  // a lock protecting the free lists and free blocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // mutable because of ubiquity of locking even for otherwise const methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  mutable Mutex _freelistLock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  // locking verifier convenience function
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  void assert_locked() const PRODUCT_RETURN;
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   127
  void assert_locked(const Mutex* lock) const PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // Linear allocation blocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  LinearAllocBlock _smallLinearAllocBlock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  FreeBlockDictionary::DictionaryChoice _dictionaryChoice;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  FreeBlockDictionary* _dictionary;    // ptr to dictionary for large size blocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  FreeList _indexedFreeList[IndexSetSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
                                       // indexed array for small size blocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  // allocation stategy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  bool       _fitStrategy;      // Use best fit strategy.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  bool       _adaptive_freelists; // Use adaptive freelists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // This is an address close to the largest free chunk in the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  // It is currently assumed to be at the end of the heap.  Free
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // chunks with addresses greater than nearLargestChunk are coalesced
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // in an effort to maintain a large chunk at the end of the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  HeapWord*  _nearLargestChunk;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  // Used to keep track of limit of sweep for the space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  HeapWord* _sweep_limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // Support for compacting cms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  HeapWord* cross_threshold(HeapWord* start, HeapWord* end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  HeapWord* forward(oop q, size_t size, CompactPoint* cp, HeapWord* compact_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // Initialization helpers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  void initializeIndexedFreeListArray();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // Extra stuff to manage promotion parallelism.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // a lock protecting the dictionary during par promotion allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  mutable Mutex _parDictionaryAllocLock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  Mutex* parDictionaryAllocLock() const { return &_parDictionaryAllocLock; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // Locks protecting the exact lists during par promotion allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  Mutex* _indexedFreeListParLocks[IndexSetSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // Attempt to obtain up to "n" blocks of the size "word_sz" (which is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // required to be smaller than "IndexSetSize".)  If successful,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // adds them to "fl", which is required to be an empty free list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  // If the count of "fl" is negative, it's absolute value indicates a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  // number of free chunks that had been previously "borrowed" from global
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // list of size "word_sz", and must now be decremented.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  void par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList* fl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // Allocation helper functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // Allocate using a strategy that takes from the indexed free lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  // first.  This allocation strategy assumes a companion sweeping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // strategy that attempts to keep the needed number of chunks in each
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  HeapWord* allocate_adaptive_freelists(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Allocate from the linear allocation buffers first.  This allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // strategy assumes maximal coalescing can maintain chunks large enough
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // to be used as linear allocation buffers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  HeapWord* allocate_non_adaptive_freelists(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  // Gets a chunk from the linear allocation block (LinAB).  If there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // is not enough space in the LinAB, refills it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  HeapWord*  getChunkFromLinearAllocBlock(LinearAllocBlock* blk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  HeapWord*  getChunkFromSmallLinearAllocBlock(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // Get a chunk from the space remaining in the linear allocation block.  Do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // not attempt to refill if the space is not available, return NULL.  Do the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // repairs on the linear allocation block as appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  HeapWord*  getChunkFromLinearAllocBlockRemainder(LinearAllocBlock* blk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  inline HeapWord*  getChunkFromSmallLinearAllocBlockRemainder(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // Helper function for getChunkFromIndexedFreeList.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Replenish the indexed free list for this "size".  Do not take from an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // underpopulated size.
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   198
  FreeChunk*  getChunkFromIndexedFreeListHelper(size_t size, bool replenish = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // Get a chunk from the indexed free list.  If the indexed free list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // does not have a free chunk, try to replenish the indexed free list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  // then get the free chunk from the replenished indexed free list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  inline FreeChunk* getChunkFromIndexedFreeList(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // The returned chunk may be larger than requested (or null).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  FreeChunk* getChunkFromDictionary(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // The returned chunk is the exact size requested (or null).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  FreeChunk* getChunkFromDictionaryExact(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Find a chunk in the indexed free list that is the best
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // fit for size "numWords".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  FreeChunk* bestFitSmall(size_t numWords);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // For free list "fl" of chunks of size > numWords,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // remove a chunk, split off a chunk of size numWords
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // and return it.  The split off remainder is returned to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // the free lists.  The old name for getFromListGreater
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  // was lookInListGreater.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  FreeChunk* getFromListGreater(FreeList* fl, size_t numWords);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  // Get a chunk in the indexed free list or dictionary,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  // by considering a larger chunk and splitting it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  FreeChunk* getChunkFromGreater(size_t numWords);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  //  Verify that the given chunk is in the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  bool verifyChunkInIndexedFreeLists(FreeChunk* fc) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  // Remove the specified chunk from the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  void       removeChunkFromIndexedFreeList(FreeChunk* fc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  // Remove the specified chunk from the dictionary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  void       removeChunkFromDictionary(FreeChunk* fc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // Split a free chunk into a smaller free chunk of size "new_size".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // Return the smaller free chunk and return the remainder to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  FreeChunk* splitChunkAndReturnRemainder(FreeChunk* chunk, size_t new_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // Add a chunk to the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  void       addChunkToFreeLists(HeapWord* chunk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // Add a chunk to the free lists, preferring to suffix it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // to the last free chunk at end of space if possible, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // updating the block census stats as well as block offset table.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  // Take any locks as appropriate if we are multithreaded.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  void       addChunkToFreeListsAtEndRecordingStats(HeapWord* chunk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  // Add a free chunk to the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  void       returnChunkToFreeList(FreeChunk* chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // Add a free chunk to the dictionary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  void       returnChunkToDictionary(FreeChunk* chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  // Functions for maintaining the linear allocation buffers (LinAB).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // Repairing a linear allocation block refers to operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  // performed on the remainder of a LinAB after an allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  // has been made from it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  void       repairLinearAllocationBlocks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  void       repairLinearAllocBlock(LinearAllocBlock* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  void       refillLinearAllocBlock(LinearAllocBlock* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  void       refillLinearAllocBlockIfNeeded(LinearAllocBlock* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  void       refillLinearAllocBlocksIfNeeded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  void       verify_objects_initialized() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // Statistics reporting helper functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  void       reportFreeListStatistics() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  void       reportIndexedFreeListStatistics() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  size_t     maxChunkSizeInIndexedFreeLists() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  size_t     numFreeBlocksInIndexedFreeLists() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // Accessor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  HeapWord* unallocated_block() const {
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   263
    if (BlockOffsetArrayUseUnallocatedBlock) {
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   264
      HeapWord* ub = _bt.unallocated_block();
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   265
      assert(ub >= bottom() &&
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   266
             ub <= end(), "space invariant");
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   267
      return ub;
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   268
    } else {
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   269
      return end();
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   270
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  void freed(HeapWord* start, size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    _bt.freed(start, size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // reset the indexed free list to its initial empty condition.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  void resetIndexedFreeListArray();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  // reset to an initial state with a single free block described
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // by the MemRegion parameter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  void reset(MemRegion mr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // Return the total number of words in the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  size_t     totalSizeInIndexedFreeLists() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  // Constructor...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  CompactibleFreeListSpace(BlockOffsetSharedArray* bs, MemRegion mr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
                           bool use_adaptive_freelists,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
                           FreeBlockDictionary::DictionaryChoice);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  bool bestFitFirst() { return _fitStrategy == FreeBlockBestFitFirst; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  FreeBlockDictionary* dictionary() const { return _dictionary; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  HeapWord* nearLargestChunk() const { return _nearLargestChunk; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  void set_nearLargestChunk(HeapWord* v) { _nearLargestChunk = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5434
diff changeset
   296
  // Set CMS global values
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5434
diff changeset
   297
  static void set_cms_values();
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5434
diff changeset
   298
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // Return the free chunk at the end of the space.  If no such
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // chunk exists, return NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  FreeChunk* find_chunk_at_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
185
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   303
  bool adaptive_freelists() const { return _adaptive_freelists; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  void set_collector(CMSCollector* collector) { _collector = collector; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // Support for parallelization of rescan and marking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  const size_t rescan_task_size()  const { return _rescan_task_size;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  const size_t marking_task_size() const { return _marking_task_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  SequentialSubTasksDone* conc_par_seq_tasks() {return &_conc_par_seq_tasks; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  void initialize_sequential_subtasks_for_rescan(int n_threads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  void initialize_sequential_subtasks_for_marking(int n_threads,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
         HeapWord* low = NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  // Space enquiries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  size_t used() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  size_t free() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  size_t max_alloc_in_words() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // XXX: should have a less conservative used_region() than that of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  // Space; we could consider keeping track of highest allocated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // address and correcting that at each sweep, as the sweeper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // goes through the entire allocated part of the generation. We
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  // could also use that information to keep the sweeper from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // sweeping more than is necessary. The allocator and sweeper will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  // of course need to synchronize on this, since the sweeper will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // try to bump down the address and the allocator will try to bump it up.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // For now, however, we'll just use the default used_region()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  // which overestimates the region by returning the entire
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // committed region (this is safe, but inefficient).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  // Returns a subregion of the space containing all the objects in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  // the space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  MemRegion used_region() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    return MemRegion(bottom(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
                     BlockOffsetArrayUseUnallocatedBlock ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
                     unallocated_block() : end());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  bool is_in(const void* p) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    return used_region().contains(p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  virtual bool is_free_block(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // Resizing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  void set_end(HeapWord* value);  // override
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // mutual exclusion support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  Mutex* freelistLock() const { return &_freelistLock; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  // Iteration support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  void oop_iterate(MemRegion mr, OopClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  void oop_iterate(OopClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  void object_iterate(ObjectClosure* blk);
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   356
  // Apply the closure to each object in the space whose references
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   357
  // point to objects in the heap.  The usage of CompactibleFreeListSpace
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   358
  // by the ConcurrentMarkSweepGeneration for concurrent GC's allows
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   359
  // objects in the space with references to objects that are no longer
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   360
  // valid.  For example, an object may reference another object
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   361
  // that has already been sweep up (collected).  This method uses
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   362
  // obj_is_alive() to determine whether it is safe to iterate of
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   363
  // an object.
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   364
  void safe_object_iterate(ObjectClosure* blk);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  // Requires that "mr" be entirely within the space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // Apply "cl->do_object" to all objects that intersect with "mr".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  // If the iteration encounters an unparseable portion of the region,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  // terminate the iteration and return the address of the start of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  // subregion that isn't done.  Return of "NULL" indicates that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  // interation completed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  virtual HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
       object_iterate_careful_m(MemRegion mr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
                                ObjectClosureCareful* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  virtual HeapWord*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
       object_iterate_careful(ObjectClosureCareful* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  // Override: provides a DCTO_CL specific to this kind of space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  DirtyCardToOopClosure* new_dcto_cl(OopClosure* cl,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
                                     CardTableModRefBS::PrecisionStyle precision,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
                                     HeapWord* boundary);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  void blk_iterate(BlkClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  void blk_iterate_careful(BlkClosureCareful* cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   386
  HeapWord* block_start_const(const void* p) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  HeapWord* block_start_careful(const void* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  size_t block_size(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  size_t block_size_no_stall(HeapWord* p, const CMSCollector* c) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  bool block_is_obj(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  bool obj_is_alive(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  size_t block_size_nopar(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  bool block_is_obj_nopar(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  // iteration support for promotion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  void save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  bool no_allocs_since_save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  void object_iterate_since_last_GC(ObjectClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  // iteration support for sweeping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  void save_sweep_limit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    _sweep_limit = BlockOffsetArrayUseUnallocatedBlock ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
                   unallocated_block() : end();
9969
57932d7294a9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 7397
diff changeset
   404
    if (CMSTraceSweeper) {
57932d7294a9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 7397
diff changeset
   405
      gclog_or_tty->print_cr(">>>>> Saving sweep limit " PTR_FORMAT
57932d7294a9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 7397
diff changeset
   406
                             "  for space [" PTR_FORMAT "," PTR_FORMAT ") <<<<<<",
57932d7294a9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 7397
diff changeset
   407
                             _sweep_limit, bottom(), end());
57932d7294a9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 7397
diff changeset
   408
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  NOT_PRODUCT(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    void clear_sweep_limit() { _sweep_limit = NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  HeapWord* sweep_limit() { return _sweep_limit; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  // Apply "blk->do_oop" to the addresses of all reference fields in objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // promoted into this generation since the most recent save_marks() call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  // Fields in objects allocated by applications of the closure
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  // *are* included in the iteration. Thus, when the iteration completes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  // there should be no further such objects remaining.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  #define CFLS_OOP_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix)  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
    void oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  ALL_SINCE_SAVE_MARKS_CLOSURES(CFLS_OOP_SINCE_SAVE_MARKS_DECL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  #undef CFLS_OOP_SINCE_SAVE_MARKS_DECL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  // Allocation support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  HeapWord* allocate(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  HeapWord* par_allocate(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 185
diff changeset
   429
  oop       promote(oop obj, size_t obj_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  void      gc_prologue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  void      gc_epilogue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  // This call is used by a containing CMS generation / collector
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  // to inform the CFLS space that a sweep has been completed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // and that the space can do any related house-keeping functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  void      sweep_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  // For an object in this space, the mark-word's two
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  // LSB's having the value [11] indicates that it has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  // promoted since the most recent call to save_marks() on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  // this generation and has not subsequently been iterated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  // over (using oop_since_save_marks_iterate() above).
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   443
  // This property holds only for single-threaded collections,
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   444
  // and is typically used for Cheney scans; for MT scavenges,
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   445
  // the property holds for all objects promoted during that
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   446
  // scavenge for the duration of the scavenge and is used
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   447
  // by card-scanning to avoid scanning objects (being) promoted
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   448
  // during that scavenge.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  bool obj_allocated_since_save_marks(const oop obj) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    assert(is_in_reserved(obj), "Wrong space?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    return ((PromotedObject*)obj)->hasPromotedMark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  // A worst-case estimate of the space required (in HeapWords) to expand the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  // heap when promoting an obj of size obj_size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  size_t expansionSpaceRequired(size_t obj_size) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  FreeChunk* allocateScratch(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  // returns true if either the small or large linear allocation buffer is empty.
185
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   461
  bool       linearAllocationWouldFail() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  // Adjust the chunk for the minimum size.  This version is called in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  // most cases in CompactibleFreeListSpace methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  inline static size_t adjustObjectSize(size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    return (size_t) align_object_size(MAX2(size, (size_t)MinChunkSize));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  // This is a virtual version of adjustObjectSize() that is called
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  // only occasionally when the compaction space changes and the type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  // of the new compaction space is is only known to be CompactibleSpace.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  size_t adjust_object_size_v(size_t size) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    return adjustObjectSize(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  // Minimum size of a free block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  virtual size_t minimum_free_block_size() const { return MinChunkSize; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  void      removeFreeChunkFromFreeLists(FreeChunk* chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  void      addChunkAndRepairOffsetTable(HeapWord* chunk, size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
              bool coalesced);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
185
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   480
  // Support for decisions regarding concurrent collection policy
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   481
  bool should_concurrent_collect() const;
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   482
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  // Support for compaction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  void prepare_for_compaction(CompactPoint* cp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  void adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  void compact();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  // reset the space to reflect the fact that a compaction of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  // space has been done.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  virtual void reset_after_compaction();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // Debugging support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  void print()                            const;
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   493
  void print_on(outputStream* st)         const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  void prepare_for_verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  void verify(bool allow_dirty)           const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  void verifyFreeLists()                  const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  void verifyIndexedFreeLists()           const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  void verifyIndexedFreeList(size_t size) const;
10771
68e4b84cfa28 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 9969
diff changeset
   499
  // Verify that the given chunk is in the free lists:
68e4b84cfa28 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 9969
diff changeset
   500
  // i.e. either the binary tree dictionary, the indexed free lists
68e4b84cfa28 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 9969
diff changeset
   501
  // or the linear allocation block.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  bool verifyChunkInFreeLists(FreeChunk* fc) const;
10771
68e4b84cfa28 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 9969
diff changeset
   503
  // Verify that the given chunk is the linear allocation block
68e4b84cfa28 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 9969
diff changeset
   504
  bool verify_chunk_is_linear_alloc_block(FreeChunk* fc) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  // Do some basic checks on the the free lists.
10771
68e4b84cfa28 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 9969
diff changeset
   506
  void check_free_list_consistency()      const PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   508
  // Printing support
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   509
  void dump_at_safepoint_with_locks(CMSCollector* c, outputStream* st);
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   510
  void print_indexed_free_lists(outputStream* st) const;
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   511
  void print_dictionary_free_lists(outputStream* st) const;
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   512
  void print_promo_info_blocks(outputStream* st) const;
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   513
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  NOT_PRODUCT (
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    void initializeIndexedFreeListArrayReturnedBytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
    size_t sumIndexedFreeListArrayReturnedBytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
    // Return the total number of chunks in the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
    size_t totalCountInIndexedFreeLists() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
    // Return the total numberof chunks in the space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
    size_t totalCount();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  // The census consists of counts of the quantities such as
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  // the current count of the free chunks, number of chunks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  // created as a result of the split of a larger chunk or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  // coalescing of smaller chucks, etc.  The counts in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  // census is used to make decisions on splitting and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  // coalescing of chunks during the sweep of garbage.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  // Print the statistics for the free lists.
185
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   531
  void printFLCensus(size_t sweep_count) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  // Statistics functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  // Initialize census for lists before the sweep.
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   535
  void beginSweepFLCensus(float inter_sweep_current,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   536
                          float inter_sweep_estimate,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   537
                          float intra_sweep_estimate);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // Set the surplus for each of the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  void setFLSurplus();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  // Set the hint for each of the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  void setFLHints();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  // Clear the census for each of the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  void clearFLCensus();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  // Perform functions for the census after the end of the sweep.
185
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   545
  void endSweepFLCensus(size_t sweep_count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  // Return true if the count of free chunks is greater
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  // than the desired number of free chunks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  bool coalOverPopulated(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
// Record (for each size):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
//   split-births = #chunks added due to splits in (prev-sweep-end,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
//      this-sweep-start)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
//   split-deaths = #chunks removed for splits in (prev-sweep-end,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
//      this-sweep-start)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
//   num-curr     = #chunks at start of this sweep
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
//   num-prev     = #chunks at end of previous sweep
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
// The above are quantities that are measured. Now define:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
//   num-desired := num-prev + split-births - split-deaths - num-curr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
// Roughly, num-prev + split-births is the supply,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
// split-deaths is demand due to other sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
// and num-curr is what we have left.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
// Thus, num-desired is roughly speaking the "legitimate demand"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
// for blocks of this size and what we are striving to reach at the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
// end of the current sweep.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
// For a given list, let num-len be its current population.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
// Define, for a free list of a given size:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
//   coal-overpopulated := num-len >= num-desired * coal-surplus
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
// (coal-surplus is set to 1.05, i.e. we allow a little slop when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
// coalescing -- we do not coalesce unless we think that the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
// supply has exceeded the estimated demand by more than 5%).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
// For the set of sizes in the binary tree, which is neither dense nor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
// closed, it may be the case that for a particular size we have never
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
// had, or do not now have, or did not have at the previous sweep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
// chunks of that size. We need to extend the definition of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
// coal-overpopulated to such sizes as well:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
//   For a chunk in/not in the binary tree, extend coal-overpopulated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
//   defined above to include all sizes as follows:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
//   . a size that is non-existent is coal-overpopulated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
//   . a size that has a num-desired <= 0 as defined above is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
//     coal-overpopulated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
// Also define, for a chunk heap-offset C and mountain heap-offset M:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
//   close-to-mountain := C >= 0.99 * M
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
// Now, the coalescing strategy is:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
//    Coalesce left-hand chunk with right-hand chunk if and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
//    only if:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
//      EITHER
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
//        . left-hand chunk is of a size that is coal-overpopulated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
//      OR
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
//        . right-hand chunk is close-to-mountain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  void smallCoalBirth(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  void smallCoalDeath(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  void coalBirth(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  void coalDeath(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
  void smallSplitBirth(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  void smallSplitDeath(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  void splitBirth(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  void splitDeath(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  void split(size_t from, size_t to1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  double flsFrag() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
// A parallel-GC-thread-local allocation buffer for allocation into a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
// CompactibleFreeListSpace.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
class CFLS_LAB : public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  // The space that this buffer allocates into.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  CompactibleFreeListSpace* _cfls;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  // Our local free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  FreeList _indexedFreeList[CompactibleFreeListSpace::IndexSetSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  // Initialized from a command-line arg.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   629
  // Allocation statistics in support of dynamic adjustment of
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   630
  // #blocks to claim per get_from_global_pool() call below.
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   631
  static AdaptiveWeightedAverage
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   632
                 _blocks_to_claim  [CompactibleFreeListSpace::IndexSetSize];
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   633
  static size_t _global_num_blocks [CompactibleFreeListSpace::IndexSetSize];
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   634
  static int    _global_num_workers[CompactibleFreeListSpace::IndexSetSize];
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   635
  size_t        _num_blocks        [CompactibleFreeListSpace::IndexSetSize];
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   636
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   637
  // Internal work method
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   638
  void get_from_global_pool(size_t word_sz, FreeList* fl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  CFLS_LAB(CompactibleFreeListSpace* cfls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  // Allocate and return a block of the given size, or else return NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  HeapWord* alloc(size_t word_sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  // Return any unused portions of the buffer to the global pool.
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   647
  void retire(int tid);
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   648
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   649
  // Dynamic OldPLABSize sizing
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   650
  static void compute_desired_plab_size();
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   651
  // When the settings are modified from default static initialization
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   652
  static void modify_initialization(size_t n, unsigned wt);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
size_t PromotionInfo::refillSize() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  const size_t CMSSpoolBlockSize = 256;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  const size_t sz = heap_word_size(sizeof(SpoolBlock) + sizeof(markOop)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
                                   * CMSSpoolBlockSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  return CompactibleFreeListSpace::adjustObjectSize(sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
}
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
   661
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
   662
#endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP