src/hotspot/share/gc/cms/compactibleFreeListSpace.hpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 57782 ca133d5ea78a
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50752
diff changeset
     2
 * Copyright (c) 2001, 2019, 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
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50752
diff changeset
    25
#ifndef SHARE_GC_CMS_COMPACTIBLEFREELISTSPACE_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50752
diff changeset
    26
#define SHARE_GC_CMS_COMPACTIBLEFREELISTSPACE_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    27
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    28
#include "gc/cms/adaptiveFreeList.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    29
#include "gc/cms/promotionInfo.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    30
#include "gc/shared/blockOffsetTable.hpp"
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47816
diff changeset
    31
#include "gc/shared/cardTable.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    32
#include "gc/shared/space.hpp"
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33587
diff changeset
    33
#include "logging/log.hpp"
12507
6182ca66bc7b 7131629: Generalize the CMS free list code
jmasa
parents: 12379
diff changeset
    34
#include "memory/binaryTreeDictionary.hpp"
6182ca66bc7b 7131629: Generalize the CMS free list code
jmasa
parents: 12379
diff changeset
    35
#include "memory/freeList.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    36
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// Classes in support of keeping track of promotions into a non-Contiguous
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// space, in this case a CompactibleFreeListSpace.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// Forward declarations
29701
f638fc81a3d0 8075803: Fix GC includes and forward declarations
stefank
parents: 29681
diff changeset
    41
class CMSCollector;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
class CompactibleFreeListSpace;
29701
f638fc81a3d0 8075803: Fix GC includes and forward declarations
stefank
parents: 29681
diff changeset
    43
class ConcurrentMarkSweepGeneration;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
class BlkClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
class BlkClosureCareful;
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 13728
diff changeset
    46
class FreeChunk;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class UpwardsObjectClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
class ObjectClosureCareful;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
class Klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
49708
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    51
class AFLBinaryTreeDictionary : public BinaryTreeDictionary<FreeChunk, AdaptiveFreeList<FreeChunk> > {
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    52
 public:
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    53
  AFLBinaryTreeDictionary(MemRegion mr)
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    54
      : BinaryTreeDictionary<FreeChunk, AdaptiveFreeList<FreeChunk> >(mr) {}
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    55
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    56
  // Find the list with size "size" in the binary tree and update
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    57
  // the statistics in the list according to "split" (chunk was
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    58
  // split or coalesce) and "birth" (chunk was added or removed).
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    59
  void       dict_census_update(size_t size, bool split, bool birth);
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    60
  // Return true if the dictionary is overpopulated (more chunks of
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    61
  // this size than desired) for size "size".
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    62
  bool       coal_dict_over_populated(size_t size);
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    63
  // Methods called at the beginning of a sweep to prepare the
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    64
  // statistics for the sweep.
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    65
  void       begin_sweep_dict_census(double coalSurplusPercent,
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    66
                                     float inter_sweep_current,
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    67
                                     float inter_sweep_estimate,
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    68
                                     float intra_sweep_estimate);
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    69
  // Methods called after the end of a sweep to modify the
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    70
  // statistics for the sweep.
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    71
  void       end_sweep_dict_census(double splitSurplusPercent);
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    72
  // Accessors for statistics
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    73
  void       set_tree_surplus(double splitSurplusPercent);
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    74
  void       set_tree_hints(void);
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    75
  // Reset statistics for all the lists in the tree.
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    76
  void       clear_tree_census(void);
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    77
  // Print the statistics for all the lists in the tree.  Also may
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    78
  // print out summaries.
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    79
  void       print_dict_census(outputStream* st) const;
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    80
};
6709f13dccd3 8200735: Move CMS specific code from binaryTreeDictionary and freeList to CMS files
stefank
parents: 49392
diff changeset
    81
49392
2956d0ece7a9 8199282: Remove ValueObj class for allocation subclassing for gc code
coleenp
parents: 49164
diff changeset
    82
class LinearAllocBlock {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  LinearAllocBlock() : _ptr(0), _word_size(0), _refillSize(0),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
    _allocation_size_limit(0) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  void set(HeapWord* ptr, size_t word_size, size_t refill_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
    size_t allocation_size_limit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    _ptr = ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    _word_size = word_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
    _refillSize = refill_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    _allocation_size_limit = allocation_size_limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  HeapWord* _ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  size_t    _word_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  size_t    _refillSize;
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
    96
  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
    97
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
    98
  void print_on(outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// Concrete subclass of CompactibleSpace that implements
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// a free list space, such as used in the concurrent mark sweep
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
// generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
class CompactibleFreeListSpace: public CompactibleSpace {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  friend class ConcurrentMarkSweepGeneration;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  friend class CMSCollector;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Local alloc buffer for promotion into this space.
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35061
diff changeset
   110
  friend class CompactibleFreeListSpaceLAB;
27624
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   111
  // Allow scan_and_* functions to call (private) overrides of the auxiliary functions on this class
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   112
  template <typename SpaceType>
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   113
  friend void CompactibleSpace::scan_and_adjust_pointers(SpaceType* space);
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   114
  template <typename SpaceType>
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   115
  friend void CompactibleSpace::scan_and_compact(SpaceType* space);
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   116
  template <typename SpaceType>
37495
7ef1f23dfc9c 8073321: assert(q > prev_q) failed: we should be moving forward through memory
brutisso
parents: 37433
diff changeset
   117
  friend void CompactibleSpace::verify_up_to_first_dead(SpaceType* space);
7ef1f23dfc9c 8073321: assert(q > prev_q) failed: we should be moving forward through memory
brutisso
parents: 37433
diff changeset
   118
  template <typename SpaceType>
27624
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   119
  friend void CompactibleSpace::scan_and_forward(SpaceType* space, CompactPoint* cp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // "Size" of chunks of work (executed during parallel remark phases
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  // of CMS collection); this probably belongs in CMSCollector, although
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // it's cached here because it's used in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  // initialize_sequential_subtasks_for_rescan() which modifies
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  // par_seq_tasks which also lives in Space. XXX
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  const size_t _rescan_task_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  const size_t _marking_task_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // Yet another sequential tasks done structure. This supports
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // CMS GC, where we have threads dynamically
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  // claiming sub-tasks from a larger parallel task.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  SequentialSubTasksDone _conc_par_seq_tasks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  BlockOffsetArrayNonContigSpace _bt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  CMSCollector* _collector;
32623
390a27af5657 8134626: Misc cleanups after generation array removal
jwilhelm
parents: 30870
diff changeset
   137
  ConcurrentMarkSweepGeneration* _old_gen;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  // Data structures for free blocks (used during allocation/sweeping)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // Allocation is done linearly from two different blocks depending on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  // whether the request is small or large, in an effort to reduce
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // fragmentation. We assume that any locking for allocation is done
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // by the containing generation. Thus, none of the methods in this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  // space are re-entrant.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  enum SomeConstants {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    SmallForLinearAlloc = 16,        // size < this then use _sLAB
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    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
   149
    IndexSetSize        = SmallForDictionary  // keep this odd-sized
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  };
10992
b998c6b89fa2 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 10771
diff changeset
   151
  static size_t IndexSetStart;
b998c6b89fa2 7105163: CMS: some mentions of MinChunkSize should be IndexSetStart
ysr
parents: 10771
diff changeset
   152
  static size_t IndexSetStride;
47816
ac0af7750da9 8189798: SA cleanup - part 1
jgeorge
parents: 47216
diff changeset
   153
  static size_t _min_chunk_size_in_bytes;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  enum FitStrategyOptions {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    FreeBlockStrategyNone = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    FreeBlockBestFitFirst
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  PromotionInfo _promoInfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   163
  // Helps to impose a global total order on freelistLock ranks;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // assumes that CFLSpace's are allocated in global total order
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  static int   _lockRank;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   167
  // A lock protecting the free lists and free blocks;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // mutable because of ubiquity of locking even for otherwise const methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  mutable Mutex _freelistLock;
47816
ac0af7750da9 8189798: SA cleanup - part 1
jgeorge
parents: 47216
diff changeset
   170
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   171
  // Locking verifier convenience function
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  void assert_locked() const PRODUCT_RETURN;
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   173
  void assert_locked(const Mutex* lock) const PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // Linear allocation blocks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  LinearAllocBlock _smallLinearAllocBlock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   178
  AFLBinaryTreeDictionary* _dictionary;    // Pointer to dictionary for large size blocks
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   180
  // Indexed array for small size blocks
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 13728
diff changeset
   181
  AdaptiveFreeList<FreeChunk> _indexedFreeList[IndexSetSize];
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   182
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   183
  // Allocation strategy
33587
c04a7462b0e6 8139952: Remove UseCMSAdaptiveFreeLists, UseAsyncConcMarkSweepGC, CMSDictionaryChoice, CMSOverflowEarlyRestoration and CMSTestInFreeList
david
parents: 32623
diff changeset
   184
  bool _fitStrategy;  // Use best fit strategy
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // This is an address close to the largest free chunk in the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // It is currently assumed to be at the end of the heap.  Free
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // chunks with addresses greater than nearLargestChunk are coalesced
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // in an effort to maintain a large chunk at the end of the heap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  HeapWord*  _nearLargestChunk;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // Used to keep track of limit of sweep for the space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  HeapWord* _sweep_limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
57782
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   195
  // Stable value of used().
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   196
  size_t _used_stable;
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   197
27888
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   198
  // Used to make the young collector update the mod union table
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   199
  MemRegionClosure* _preconsumptionDirtyCardClosure;
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   200
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // Support for compacting cms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  HeapWord* cross_threshold(HeapWord* start, HeapWord* end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  HeapWord* forward(oop q, size_t size, CompactPoint* cp, HeapWord* compact_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // Initialization helpers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  void initializeIndexedFreeListArray();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // Extra stuff to manage promotion parallelism.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   210
  // A lock protecting the dictionary during par promotion allocation.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  mutable Mutex _parDictionaryAllocLock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  Mutex* parDictionaryAllocLock() const { return &_parDictionaryAllocLock; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // Locks protecting the exact lists during par promotion allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  Mutex* _indexedFreeListParLocks[IndexSetSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  // Attempt to obtain up to "n" blocks of the size "word_sz" (which is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  // required to be smaller than "IndexSetSize".)  If successful,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  // adds them to "fl", which is required to be an empty free list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  // If the count of "fl" is negative, it's absolute value indicates a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  // number of free chunks that had been previously "borrowed" from global
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  // list of size "word_sz", and must now be decremented.
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 13728
diff changeset
   223
  void par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
26150
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   225
  // Used by par_get_chunk_of_blocks() for the chunks from the
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   226
  // indexed_free_lists.
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   227
  bool par_get_chunk_of_blocks_IFL(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl);
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   228
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   229
  // Used by par_get_chunk_of_blocks_dictionary() to get a chunk
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   230
  // evenly splittable into "n" "word_sz" chunks.  Returns that
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   231
  // evenly splittable chunk.  May split a larger chunk to get the
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   232
  // evenly splittable chunk.
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   233
  FreeChunk* get_n_way_chunk_to_split(size_t word_sz, size_t n);
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   234
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   235
  // Used by par_get_chunk_of_blocks() for the chunks from the
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   236
  // dictionary.
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   237
  void par_get_chunk_of_blocks_dictionary(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl);
6186fcfeb5ae 8026303: CMS: JVM intermittently crashes with "FreeList of size 258 violates Conservation Principle" assert
jmasa
parents: 25485
diff changeset
   238
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  // Allocation helper functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  // Allocate using a strategy that takes from the indexed free lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // first.  This allocation strategy assumes a companion sweeping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  // strategy that attempts to keep the needed number of chunks in each
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  HeapWord* allocate_adaptive_freelists(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  // Gets a chunk from the linear allocation block (LinAB).  If there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  // is not enough space in the LinAB, refills it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  HeapWord*  getChunkFromLinearAllocBlock(LinearAllocBlock* blk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  HeapWord*  getChunkFromSmallLinearAllocBlock(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  // Get a chunk from the space remaining in the linear allocation block.  Do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  // not attempt to refill if the space is not available, return NULL.  Do the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // repairs on the linear allocation block as appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  HeapWord*  getChunkFromLinearAllocBlockRemainder(LinearAllocBlock* blk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  inline HeapWord*  getChunkFromSmallLinearAllocBlockRemainder(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // Helper function for getChunkFromIndexedFreeList.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // Replenish the indexed free list for this "size".  Do not take from an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  // underpopulated size.
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   259
  FreeChunk*  getChunkFromIndexedFreeListHelper(size_t size, bool replenish = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // Get a chunk from the indexed free list.  If the indexed free list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // does not have a free chunk, try to replenish the indexed free list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // then get the free chunk from the replenished indexed free list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  inline FreeChunk* getChunkFromIndexedFreeList(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  // The returned chunk may be larger than requested (or null).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  FreeChunk* getChunkFromDictionary(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  // The returned chunk is the exact size requested (or null).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  FreeChunk* getChunkFromDictionaryExact(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // Find a chunk in the indexed free list that is the best
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // fit for size "numWords".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  FreeChunk* bestFitSmall(size_t numWords);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // For free list "fl" of chunks of size > numWords,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // remove a chunk, split off a chunk of size numWords
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // and return it.  The split off remainder is returned to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // the free lists.  The old name for getFromListGreater
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  // was lookInListGreater.
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 13728
diff changeset
   279
  FreeChunk* getFromListGreater(AdaptiveFreeList<FreeChunk>* fl, size_t numWords);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // Get a chunk in the indexed free list or dictionary,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  // by considering a larger chunk and splitting it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  FreeChunk* getChunkFromGreater(size_t numWords);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  //  Verify that the given chunk is in the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  bool verifyChunkInIndexedFreeLists(FreeChunk* fc) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // Remove the specified chunk from the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  void       removeChunkFromIndexedFreeList(FreeChunk* fc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // Remove the specified chunk from the dictionary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  void       removeChunkFromDictionary(FreeChunk* fc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  // Split a free chunk into a smaller free chunk of size "new_size".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // Return the smaller free chunk and return the remainder to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  FreeChunk* splitChunkAndReturnRemainder(FreeChunk* chunk, size_t new_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // Add a chunk to the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  void       addChunkToFreeLists(HeapWord* chunk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // Add a chunk to the free lists, preferring to suffix it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  // to the last free chunk at end of space if possible, and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // updating the block census stats as well as block offset table.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  // Take any locks as appropriate if we are multithreaded.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  void       addChunkToFreeListsAtEndRecordingStats(HeapWord* chunk, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // Add a free chunk to the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  void       returnChunkToFreeList(FreeChunk* chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  // Add a free chunk to the dictionary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  void       returnChunkToDictionary(FreeChunk* chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  // Functions for maintaining the linear allocation buffers (LinAB).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // Repairing a linear allocation block refers to operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // performed on the remainder of a LinAB after an allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  // has been made from it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  void       repairLinearAllocationBlocks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  void       repairLinearAllocBlock(LinearAllocBlock* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  void       refillLinearAllocBlock(LinearAllocBlock* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  void       refillLinearAllocBlockIfNeeded(LinearAllocBlock* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  void       refillLinearAllocBlocksIfNeeded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  void       verify_objects_initialized() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // Statistics reporting helper functions
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33587
diff changeset
   318
  void       reportFreeListStatistics(const char* title) const;
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33587
diff changeset
   319
  void       reportIndexedFreeListStatistics(outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  size_t     maxChunkSizeInIndexedFreeLists() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  size_t     numFreeBlocksInIndexedFreeLists() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // Accessor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  HeapWord* unallocated_block() const {
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   324
    if (BlockOffsetArrayUseUnallocatedBlock) {
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   325
      HeapWord* ub = _bt.unallocated_block();
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   326
      assert(ub >= bottom() &&
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   327
             ub <= end(), "space invariant");
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   328
      return ub;
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   329
    } else {
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   330
      return end();
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   331
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  void freed(HeapWord* start, size_t size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    _bt.freed(start, size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
27624
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   337
  // Auxiliary functions for scan_and_{forward,adjust_pointers,compact} support.
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   338
  // See comments for CompactibleSpace for more information.
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   339
  inline HeapWord* scan_limit() const {
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   340
    return end();
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   341
  }
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   342
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   343
  inline bool scanned_block_is_obj(const HeapWord* addr) const {
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   344
    return CompactibleFreeListSpace::block_is_obj(addr); // Avoid virtual call
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   345
  }
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   346
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   347
  inline size_t scanned_block_size(const HeapWord* addr) const {
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   348
    return CompactibleFreeListSpace::block_size(addr); // Avoid virtual call
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   349
  }
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   350
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   351
  inline size_t adjust_obj_size(size_t size) const {
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   352
    return adjustObjectSize(size);
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   353
  }
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   354
35862
411842d0c882 8146395: Add inline qualifier in oop.hpp and fix inlining in gc files
goetz
parents: 35492
diff changeset
   355
  inline size_t obj_size(const HeapWord* addr) const;
27624
fe43edc5046d 8043243: convert SCAN_AND_FORWARD, SCAN_AND_ADJUST_POINTERS, SCAN_AND_COMPACT macros to methods
mlarsson
parents: 26150
diff changeset
   356
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
 protected:
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   358
  // Reset the indexed free list to its initial empty condition.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  void resetIndexedFreeListArray();
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   360
  // Reset to an initial state with a single free block described
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  // by the MemRegion parameter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  void reset(MemRegion mr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  // Return the total number of words in the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  size_t     totalSizeInIndexedFreeLists() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
 public:
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   367
  // Constructor
33587
c04a7462b0e6 8139952: Remove UseCMSAdaptiveFreeLists, UseAsyncConcMarkSweepGC, CMSDictionaryChoice, CMSOverflowEarlyRestoration and CMSTestInFreeList
david
parents: 32623
diff changeset
   368
  CompactibleFreeListSpace(BlockOffsetSharedArray* bs, MemRegion mr);
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   369
  // Accessors
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  bool bestFitFirst() { return _fitStrategy == FreeBlockBestFitFirst; }
46674
a9e42ff6158f 8183923: Get rid of FreeBlockDictionary and dithering
mgerdin
parents: 46618
diff changeset
   371
  AFLBinaryTreeDictionary* dictionary() const { return _dictionary; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  HeapWord* nearLargestChunk() const { return _nearLargestChunk; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  void set_nearLargestChunk(HeapWord* v) { _nearLargestChunk = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   375
  // Set CMS global values.
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5434
diff changeset
   376
  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
   377
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  // Return the free chunk at the end of the space.  If no such
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  // chunk exists, return NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  FreeChunk* find_chunk_at_end();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  void set_collector(CMSCollector* collector) { _collector = collector; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   384
  // Support for parallelization of rescan and marking.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  const size_t rescan_task_size()  const { return _rescan_task_size;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  const size_t marking_task_size() const { return _marking_task_size; }
37433
f8fd0bcc60af 8152182: Possible overflow in initialzation of _rescan_task_size and _marking_task_size
sangheki
parents: 35862
diff changeset
   387
  // Return ergonomic max size for CMSRescanMultiple and CMSConcMarkMultiple.
f8fd0bcc60af 8152182: Possible overflow in initialzation of _rescan_task_size and _marking_task_size
sangheki
parents: 35862
diff changeset
   388
  const size_t max_flag_size_for_task_size() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  SequentialSubTasksDone* conc_par_seq_tasks() {return &_conc_par_seq_tasks; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  void initialize_sequential_subtasks_for_rescan(int n_threads);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  void initialize_sequential_subtasks_for_marking(int n_threads,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
         HeapWord* low = NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
27888
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   394
  virtual MemRegionClosure* preconsumptionDirtyCardClosure() const {
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   395
    return _preconsumptionDirtyCardClosure;
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   396
  }
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   397
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   398
  void setPreconsumptionDirtyCardClosure(MemRegionClosure* cl) {
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   399
    _preconsumptionDirtyCardClosure = cl;
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   400
  }
a52ea0e7671e 8065218: Move CMS-specific fields from Space to CompactibleFreeListSpace
mgerdin
parents: 27624
diff changeset
   401
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  // Space enquiries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  size_t used() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  size_t free() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  size_t max_alloc_in_words() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  // XXX: should have a less conservative used_region() than that of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  // Space; we could consider keeping track of highest allocated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // address and correcting that at each sweep, as the sweeper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  // goes through the entire allocated part of the generation. We
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  // could also use that information to keep the sweeper from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // sweeping more than is necessary. The allocator and sweeper will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // of course need to synchronize on this, since the sweeper will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  // try to bump down the address and the allocator will try to bump it up.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  // For now, however, we'll just use the default used_region()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  // which overestimates the region by returning the entire
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // committed region (this is safe, but inefficient).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
57782
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   418
  // Returns monotonically increasing stable used space bytes for CMS.
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   419
  // This is required for jstat and other memory monitoring tools
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   420
  // that might otherwise see inconsistent used space values during a garbage
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   421
  // collection, promotion or allocation into compactibleFreeListSpace.
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   422
  // The value returned by this function might be smaller than the
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   423
  // actual value.
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   424
  size_t used_stable() const;
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   425
  // Recalculate and cache the current stable used() value. Only to be called
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   426
  // in places where we can be sure that the result is stable.
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   427
  void recalculate_used_stable();
ca133d5ea78a 8229420: [Redo] jstat reports incorrect values for OU for CMS GC
poonam
parents: 57777
diff changeset
   428
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // Returns a subregion of the space containing all the objects in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  // the space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  MemRegion used_region() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
    return MemRegion(bottom(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
                     BlockOffsetArrayUseUnallocatedBlock ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
                     unallocated_block() : end());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  virtual bool is_free_block(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  // Resizing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  void set_end(HeapWord* value);  // override
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
29681
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 28206
diff changeset
   442
  // Never mangle CompactibleFreeListSpace
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 28206
diff changeset
   443
  void mangle_unused_area() {}
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 28206
diff changeset
   444
  void mangle_unused_area_complete() {}
e96b344b2c42 8073463: G1 does not mangle freed heap regions
david
parents: 28206
diff changeset
   445
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   446
  // Mutual exclusion support
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  Mutex* freelistLock() const { return &_freelistLock; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // Iteration support
50752
9d62da00bf15 8204540: Automatic oop closure devirtualization
stefank
parents: 50034
diff changeset
   450
  void oop_iterate(OopIterateClosure* cl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  void object_iterate(ObjectClosure* blk);
1893
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   453
  // 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
   454
  // 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
   455
  // by the ConcurrentMarkSweepGeneration for concurrent GC's allows
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   456
  // 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
   457
  // valid.  For example, an object may reference another object
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   458
  // 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
   459
  // 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
   460
  // an object.
c82e388e17c5 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 1388
diff changeset
   461
  void safe_object_iterate(ObjectClosure* blk);
23535
6306204d22a9 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 23508
diff changeset
   462
6306204d22a9 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 23508
diff changeset
   463
  // Iterate over all objects that intersect with mr, calling "cl->do_object"
6306204d22a9 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 23508
diff changeset
   464
  // on each.  There is an exception to this: if this closure has already
6306204d22a9 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 23508
diff changeset
   465
  // been invoked on an object, it may skip such objects in some cases.  This is
6306204d22a9 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 23508
diff changeset
   466
  // Most likely to happen in an "upwards" (ascending address) iteration of
6306204d22a9 8038404: Move object_iterate_mem from Space to CMS since it is only ever used by CMS
mgerdin
parents: 23508
diff changeset
   467
  // MemRegions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  // Requires that "mr" be entirely within the space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  // Apply "cl->do_object" to all objects that intersect with "mr".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  // If the iteration encounters an unparseable portion of the region,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  // terminate the iteration and return the address of the start of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  // subregion that isn't done.  Return of "NULL" indicates that the
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   475
  // iteration completed.
23536
5ad11152daa9 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 23535
diff changeset
   476
  HeapWord* object_iterate_careful_m(MemRegion mr,
5ad11152daa9 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 23535
diff changeset
   477
                                     ObjectClosureCareful* cl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  // Override: provides a DCTO_CL specific to this kind of space.
50752
9d62da00bf15 8204540: Automatic oop closure devirtualization
stefank
parents: 50034
diff changeset
   480
  DirtyCardToOopClosure* new_dcto_cl(OopIterateClosure* cl,
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 47816
diff changeset
   481
                                     CardTable::PrecisionStyle precision,
30870
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   482
                                     HeapWord* boundary,
3050fdcdc60b 8080112: Replace and remove the last usages of CollectedHeap::n_par_threads()
stefank
parents: 30764
diff changeset
   483
                                     bool parallel);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  void blk_iterate(BlkClosure* cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  void blk_iterate_careful(BlkClosureCareful* cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   487
  HeapWord* block_start_const(const void* p) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  HeapWord* block_start_careful(const void* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  size_t block_size(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  size_t block_size_no_stall(HeapWord* p, const CMSCollector* c) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  bool block_is_obj(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  bool obj_is_alive(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  size_t block_size_nopar(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  bool block_is_obj_nopar(const HeapWord* p) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   496
  // Iteration support for promotion
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  void save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  bool no_allocs_since_save_marks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   500
  // Iteration support for sweeping
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  void save_sweep_limit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    _sweep_limit = BlockOffsetArrayUseUnallocatedBlock ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
                   unallocated_block() : end();
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33587
diff changeset
   504
    log_develop_trace(gc, sweep)(">>>>> Saving sweep limit " PTR_FORMAT
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33587
diff changeset
   505
                                 "  for space [" PTR_FORMAT "," PTR_FORMAT ") <<<<<<",
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 33587
diff changeset
   506
                                 p2i(_sweep_limit), p2i(bottom()), p2i(end()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  NOT_PRODUCT(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
    void clear_sweep_limit() { _sweep_limit = NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  HeapWord* sweep_limit() { return _sweep_limit; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  // Apply "blk->do_oop" to the addresses of all reference fields in objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  // promoted into this generation since the most recent save_marks() call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  // Fields in objects allocated by applications of the closure
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  // *are* included in the iteration. Thus, when the iteration completes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  // there should be no further such objects remaining.
50034
01a88f825a84 8202641: Replace OOP_SINCE_SAVE_MARKS with templates
stefank
parents: 49708
diff changeset
   518
  template <typename OopClosureType>
01a88f825a84 8202641: Replace OOP_SINCE_SAVE_MARKS with templates
stefank
parents: 49708
diff changeset
   519
  void oop_since_save_marks_iterate(OopClosureType* blk);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  // Allocation support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  HeapWord* allocate(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  HeapWord* par_allocate(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 185
diff changeset
   525
  oop       promote(oop obj, size_t obj_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  void      gc_prologue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  void      gc_epilogue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  // This call is used by a containing CMS generation / collector
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  // to inform the CFLS space that a sweep has been completed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  // and that the space can do any related house-keeping functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  void      sweep_completed();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  // For an object in this space, the mark-word's two
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // LSB's having the value [11] indicates that it has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  // promoted since the most recent call to save_marks() on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  // this generation and has not subsequently been iterated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // over (using oop_since_save_marks_iterate() above).
5434
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   539
  // This property holds only for single-threaded collections,
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   540
  // and is typically used for Cheney scans; for MT scavenges,
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   541
  // the property holds for all objects promoted during that
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   542
  // scavenge for the duration of the scavenge and is used
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   543
  // by card-scanning to avoid scanning objects (being) promoted
a2e785749780 6951188: CMS: move PromotionInfo into its own file
ysr
parents: 4574
diff changeset
   544
  // during that scavenge.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  bool obj_allocated_since_save_marks(const oop obj) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
    assert(is_in_reserved(obj), "Wrong space?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
    return ((PromotedObject*)obj)->hasPromotedMark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  // A worst-case estimate of the space required (in HeapWords) to expand the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  // heap when promoting an obj of size obj_size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  size_t expansionSpaceRequired(size_t obj_size) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  FreeChunk* allocateScratch(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   556
  // 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
   557
  bool       linearAllocationWouldFail() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  // Adjust the chunk for the minimum size.  This version is called in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  // most cases in CompactibleFreeListSpace methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  inline static size_t adjustObjectSize(size_t size) {
46618
d503911aa948 8178489: Make align functions more type safe and consistent
stefank
parents: 37495
diff changeset
   562
    return align_object_size(MAX2(size, (size_t)MinChunkSize));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  // This is a virtual version of adjustObjectSize() that is called
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  // only occasionally when the compaction space changes and the type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  // of the new compaction space is is only known to be CompactibleSpace.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  size_t adjust_object_size_v(size_t size) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    return adjustObjectSize(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  // Minimum size of a free block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  virtual size_t minimum_free_block_size() const { return MinChunkSize; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  void      removeFreeChunkFromFreeLists(FreeChunk* chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  void      addChunkAndRepairOffsetTable(HeapWord* chunk, size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
              bool coalesced);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   576
  // Support for compaction.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  void prepare_for_compaction(CompactPoint* cp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  void adjust_pointers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  void compact();
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   580
  // Reset the space to reflect the fact that a compaction of the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  // space has been done.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  virtual void reset_after_compaction();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   584
  // Debugging support.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  void print()                            const;
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   586
  void print_on(outputStream* st)         const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  void prepare_for_verify();
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 11396
diff changeset
   588
  void verify()                           const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  void verifyFreeLists()                  const PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  void verifyIndexedFreeLists()           const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  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
   592
  // 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
   593
  // 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
   594
  // or the linear allocation block.
12509
6228e2085074 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 12507
diff changeset
   595
  bool verify_chunk_in_free_list(FreeChunk* fc) const;
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   596
  // Verify that the given chunk is the linear allocation block.
10771
68e4b84cfa28 7099817: CMS: +FLSVerifyLists +FLSVerifyIndexTable asserts: odd slot non-empty, chunk not on free list
ysr
parents: 9969
diff changeset
   597
  bool verify_chunk_is_linear_alloc_block(FreeChunk* fc) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  // 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
   599
  void check_free_list_consistency()      const PRODUCT_RETURN;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   601
  // Printing support
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   602
  void dump_at_safepoint_with_locks(CMSCollector* c, outputStream* st);
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   603
  void print_indexed_free_lists(outputStream* st) const;
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   604
  void print_dictionary_free_lists(outputStream* st) const;
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   605
  void print_promo_info_blocks(outputStream* st) const;
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   606
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  NOT_PRODUCT (
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
    void initializeIndexedFreeListArrayReturnedBytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
    size_t sumIndexedFreeListArrayReturnedBytes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
    // Return the total number of chunks in the indexed free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
    size_t totalCountInIndexedFreeLists() const;
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   612
    // Return the total number of chunks in the space.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
    size_t totalCount();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  // The census consists of counts of the quantities such as
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  // the current count of the free chunks, number of chunks
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  // created as a result of the split of a larger chunk or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  // coalescing of smaller chucks, etc.  The counts in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  // census is used to make decisions on splitting and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  // coalescing of chunks during the sweep of garbage.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  // Print the statistics for the free lists.
185
cda2a1eb4be5 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 1
diff changeset
   624
  void printFLCensus(size_t sweep_count) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  // Statistics functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  // Initialize census for lists before the sweep.
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   628
  void beginSweepFLCensus(float inter_sweep_current,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   629
                          float inter_sweep_estimate,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   630
                          float intra_sweep_estimate);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  // Set the surplus for each of the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  void setFLSurplus();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  // Set the hint for each of the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  void setFLHints();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  // Clear the census for each of the free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  void clearFLCensus();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  // 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
   638
  void endSweepFLCensus(size_t sweep_count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  // Return true if the count of free chunks is greater
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  // than the desired number of free chunks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  bool coalOverPopulated(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
// Record (for each size):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
//   split-births = #chunks added due to splits in (prev-sweep-end,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
//      this-sweep-start)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
//   split-deaths = #chunks removed for splits in (prev-sweep-end,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
//      this-sweep-start)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
//   num-curr     = #chunks at start of this sweep
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
//   num-prev     = #chunks at end of previous sweep
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
// The above are quantities that are measured. Now define:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
//   num-desired := num-prev + split-births - split-deaths - num-curr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
// Roughly, num-prev + split-births is the supply,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
// split-deaths is demand due to other sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
// and num-curr is what we have left.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
// Thus, num-desired is roughly speaking the "legitimate demand"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
// for blocks of this size and what we are striving to reach at the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
// end of the current sweep.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
// For a given list, let num-len be its current population.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
// Define, for a free list of a given size:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
//   coal-overpopulated := num-len >= num-desired * coal-surplus
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
// (coal-surplus is set to 1.05, i.e. we allow a little slop when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
// coalescing -- we do not coalesce unless we think that the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
// supply has exceeded the estimated demand by more than 5%).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
// For the set of sizes in the binary tree, which is neither dense nor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
// closed, it may be the case that for a particular size we have never
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
// had, or do not now have, or did not have at the previous sweep,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
// chunks of that size. We need to extend the definition of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
// coal-overpopulated to such sizes as well:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
//   For a chunk in/not in the binary tree, extend coal-overpopulated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
//   defined above to include all sizes as follows:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
//   . a size that is non-existent is coal-overpopulated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
//   . a size that has a num-desired <= 0 as defined above is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
//     coal-overpopulated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
// Also define, for a chunk heap-offset C and mountain heap-offset M:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
//   close-to-mountain := C >= 0.99 * M
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
// Now, the coalescing strategy is:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
//    Coalesce left-hand chunk with right-hand chunk if and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
//    only if:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
//      EITHER
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
//        . left-hand chunk is of a size that is coal-overpopulated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
//      OR
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
//        . right-hand chunk is close-to-mountain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  void smallCoalBirth(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  void smallCoalDeath(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  void coalBirth(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  void coalDeath(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  void smallSplitBirth(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  void smallSplitDeath(size_t size);
12509
6228e2085074 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 12507
diff changeset
   704
  void split_birth(size_t size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
  void splitDeath(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  void split(size_t from, size_t to1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  double flsFrag() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
// A parallel-GC-thread-local allocation buffer for allocation into a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
// CompactibleFreeListSpace.
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35061
diff changeset
   713
class CompactibleFreeListSpaceLAB : public CHeapObj<mtGC> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  // The space that this buffer allocates into.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  CompactibleFreeListSpace* _cfls;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  // Our local free lists.
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 13728
diff changeset
   718
  AdaptiveFreeList<FreeChunk> _indexedFreeList[CompactibleFreeListSpace::IndexSetSize];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  // Initialized from a command-line arg.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   722
  // Allocation statistics in support of dynamic adjustment of
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   723
  // #blocks to claim per get_from_global_pool() call below.
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   724
  static AdaptiveWeightedAverage
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   725
                 _blocks_to_claim  [CompactibleFreeListSpace::IndexSetSize];
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   726
  static size_t _global_num_blocks [CompactibleFreeListSpace::IndexSetSize];
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11247
diff changeset
   727
  static uint   _global_num_workers[CompactibleFreeListSpace::IndexSetSize];
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   728
  size_t        _num_blocks        [CompactibleFreeListSpace::IndexSetSize];
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   729
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   730
  // Internal work method
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 13728
diff changeset
   731
  void get_from_global_pool(size_t word_sz, AdaptiveFreeList<FreeChunk>* fl);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
public:
28206
98aac9173d5f 8061611: Remove deprecated command line flags
drwhite
parents: 27888
diff changeset
   734
  static const int _default_dynamic_old_plab_size = 16;
98aac9173d5f 8061611: Remove deprecated command line flags
drwhite
parents: 27888
diff changeset
   735
  static const int _default_static_old_plab_size  = 50;
98aac9173d5f 8061611: Remove deprecated command line flags
drwhite
parents: 27888
diff changeset
   736
35492
c8c0273e6b91 8146690: Make all classes in GC follow the naming convention.
david
parents: 35061
diff changeset
   737
  CompactibleFreeListSpaceLAB(CompactibleFreeListSpace* cfls);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  // Allocate and return a block of the given size, or else return NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  HeapWord* alloc(size_t word_sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  // 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
   743
  void retire(int tid);
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   744
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   745
  // Dynamic OldPLABSize sizing
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   746
  static void compute_desired_plab_size();
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   747
  // When the settings are modified from default static initialization
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 2105
diff changeset
   748
  static void modify_initialization(size_t n, unsigned wt);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
size_t PromotionInfo::refillSize() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  const size_t CMSSpoolBlockSize = 256;
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 55557
diff changeset
   753
  const size_t sz = heap_word_size(sizeof(SpoolBlock) + sizeof(markWord)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
                                   * CMSSpoolBlockSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  return CompactibleFreeListSpace::adjustObjectSize(sz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
}
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
   757
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50752
diff changeset
   758
#endif // SHARE_GC_CMS_COMPACTIBLEFREELISTSPACE_HPP