hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.hpp
author ysr
Wed, 23 Dec 2009 09:23:54 -0800
changeset 4574 b2d5b0975515
parent 670 ddf3e9583f2f
child 5547 f4b087cbb361
permissions -rw-r--r--
6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
670
ddf3e9583f2f 6719955: Update copyright year
xdono
parents: 578
diff changeset
     2
 * Copyright 2001-2008 Sun Microsystems, Inc.  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
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
 * A binary tree based search structure for free blocks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
 * This is currently used in the Concurrent Mark&Sweep implementation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
// A TreeList is a FreeList which can be used to maintain a
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// binary tree of free lists.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class TreeChunk;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class BinaryTreeDictionary;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class AscendTreeCensusClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class DescendTreeCensusClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class DescendTreeSearchClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class TreeList: public FreeList {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  friend class TreeChunk;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  friend class BinaryTreeDictionary;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  friend class AscendTreeCensusClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  friend class DescendTreeCensusClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  friend class DescendTreeSearchClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  TreeList* parent() const { return _parent; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  TreeList* left()   const { return _left;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  TreeList* right()  const { return _right;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  // Accessors for links in tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  void setLeft(TreeList* tl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
    _left   = tl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    if (tl != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
      tl->setParent(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  void setRight(TreeList* tl) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    _right  = tl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    if (tl != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
      tl->setParent(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  void setParent(TreeList* tl)  { _parent = tl;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  void clearLeft()               { _left = NULL;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  void clearRight()              { _right = NULL;  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  void clearParent()             { _parent = NULL; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  void initialize()              { clearLeft(); clearRight(), clearParent(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  // For constructing a TreeList from a Tree chunk or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  // address and size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  static TreeList* as_TreeList(TreeChunk* tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  static TreeList* as_TreeList(HeapWord* addr, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // Returns the head of the free list as a pointer to a TreeChunk.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  TreeChunk* head_as_TreeChunk();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // Returns the first available chunk in the free list as a pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // to a TreeChunk.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  TreeChunk* first_available();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
    82
  // Returns the block with the largest heap address amongst
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
    83
  // those in the list for this size; potentially slow and expensive,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
    84
  // use with caution!
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
    85
  TreeChunk* largest_address();
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
    86
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // removeChunkReplaceIfNeeded() removes the given "tc" from the TreeList.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // If "tc" is the first chunk in the list, it is also the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  // TreeList that is the node in the tree.  removeChunkReplaceIfNeeded()
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // returns the possibly replaced TreeList* for the node in
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // the tree.  It also updates the parent of the original
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  // node to point to the new node.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  TreeList* removeChunkReplaceIfNeeded(TreeChunk* tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // See FreeList.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  void returnChunkAtHead(TreeChunk* tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  void returnChunkAtTail(TreeChunk* tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
// A TreeChunk is a subclass of a FreeChunk that additionally
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
// maintains a pointer to the free list on which it is currently
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// linked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// A TreeChunk is also used as a node in the binary tree.  This
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
// allows the binary tree to be maintained without any additional
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
// storage (the free chunks are used).  In a binary tree the first
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
// chunk in the free list is also the tree node.  Note that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
// TreeChunk has an embedded TreeList for this purpose.  Because
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
// the first chunk in the list is distinguished in this fashion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
// (also is the node in the tree), it is the last chunk to be found
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
// on the free list for a node in the tree and is only removed if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
// it is the last chunk on the free list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
class TreeChunk : public FreeChunk {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  friend class TreeList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  TreeList* _list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  TreeList _embedded_list;  // if non-null, this chunk is on _list
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  TreeList* embedded_list() const { return (TreeList*) &_embedded_list; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  void set_embedded_list(TreeList* v) { _embedded_list = *v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  TreeList* list() { return _list; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  void set_list(TreeList* v) { _list = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  static TreeChunk* as_TreeChunk(FreeChunk* fc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // Initialize fields in a TreeChunk that should be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  // initialized when the TreeChunk is being added to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  // a free list in the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  void initialize() { embedded_list()->initialize(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  // debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  void verifyTreeChunkList() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
const size_t MIN_TREE_CHUNK_SIZE  = sizeof(TreeChunk)/HeapWordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
class BinaryTreeDictionary: public FreeBlockDictionary {
578
862a85ed20db 6670684: 4/5 SA command universe did not print out CMS space information
dcubed
parents: 1
diff changeset
   135
  friend class VMStructs;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  bool       _splay;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  size_t     _totalSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  size_t     _totalFreeBlocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  TreeList* _root;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  // private accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  bool splay() const { return _splay; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  void set_splay(bool v) { _splay = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  size_t totalSize() const { return _totalSize; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  void set_totalSize(size_t v) { _totalSize = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  virtual void inc_totalSize(size_t v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  virtual void dec_totalSize(size_t v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  size_t totalFreeBlocks() const { return _totalFreeBlocks; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  void set_totalFreeBlocks(size_t v) { _totalFreeBlocks = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  TreeList* root() const { return _root; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  void set_root(TreeList* v) { _root = v; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  // Remove a chunk of size "size" or larger from the tree and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  // return it.  If the chunk
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // is the last chunk of that size, remove the node for that size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  // from the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  TreeChunk* getChunkFromTree(size_t size, Dither dither, bool splay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  // Return a list of the specified size or NULL from the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // The list is not removed from the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  TreeList* findList (size_t size) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  // Remove this chunk from the tree.  If the removal results
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // in an empty list in the tree, remove the empty list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  TreeChunk* removeChunkFromTree(TreeChunk* tc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  // Remove the node in the trees starting at tl that has the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // minimum value and return it.  Repair the tree as needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  TreeList* removeTreeMinimum(TreeList* tl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  void       semiSplayStep(TreeList* tl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  // Add this free chunk to the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  void       insertChunkInTree(FreeChunk* freeChunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  void       verifyTree() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  // verify that the given chunk is in the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  bool       verifyChunkInFreeLists(FreeChunk* tc) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  void          verifyTreeHelper(TreeList* tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  static size_t verifyPrevFreePtrs(TreeList* tl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // Returns the total number of chunks in the list.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  size_t     totalListLength(TreeList* tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Returns the total number of words in the chunks in the tree
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // starting at "tl".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  size_t     totalSizeInTree(TreeList* tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // Returns the sum of the square of the size of each block
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  // in the tree starting at "tl".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  double     sum_of_squared_block_sizes(TreeList* const tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // Returns the total number of free blocks in the tree starting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // at "tl".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  size_t     totalFreeBlocksInTree(TreeList* tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  size_t     numFreeBlocks() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  size_t     treeHeight() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  size_t     treeHeightHelper(TreeList* tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  size_t     totalNodesInTree(TreeList* tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  size_t     totalNodesHelper(TreeList* tl) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  BinaryTreeDictionary(MemRegion mr, bool splay = false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  // Reset the dictionary to the initial conditions with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // a single free chunk.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  void       reset(MemRegion mr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  void       reset(HeapWord* addr, size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // Reset the dictionary to be empty.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  void       reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // Return a chunk of size "size" or greater from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // want a better dynamic splay strategy for the future.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  FreeChunk* getChunk(size_t size, Dither dither) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    verify_par_locked();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    FreeChunk* res = getChunkFromTree(size, dither, splay());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    assert(res == NULL || res->isFree(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
           "Should be returning a free chunk");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  void returnChunk(FreeChunk* chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    verify_par_locked();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    insertChunkInTree(chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  void removeChunk(FreeChunk* chunk) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    verify_par_locked();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    removeChunkFromTree((TreeChunk*)chunk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    assert(chunk->isFree(), "Should still be a free chunk");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  size_t     maxChunkSize() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  size_t     totalChunkSize(debug_only(const Mutex* lock)) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    debug_only(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
      if (lock != NULL && lock->owned_by_self()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
        assert(totalSizeInTree(root()) == totalSize(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
               "_totalSize inconsistency");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    return totalSize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  size_t     minSize() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    return MIN_TREE_CHUNK_SIZE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  double     sum_of_squared_block_sizes() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    return sum_of_squared_block_sizes(root());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  FreeChunk* find_chunk_ends_at(HeapWord* target) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  // Find the list with size "size" in the binary tree and update
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  // the statistics in the list according to "split" (chunk was
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  // split or coalesce) and "birth" (chunk was added or removed).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  void       dictCensusUpdate(size_t size, bool split, bool birth);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // Return true if the dictionary is overpopulated (more chunks of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  // this size than desired) for size "size".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  bool       coalDictOverPopulated(size_t size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // Methods called at the beginning of a sweep to prepare the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // statistics for the sweep.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  void       beginSweepDictCensus(double coalSurplusPercent,
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
   259
                                  float inter_sweep_current,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
   260
                                  float inter_sweep_estimate,
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
   261
                                  float intra_sweep_estimate);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // Methods called after the end of a sweep to modify the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // statistics for the sweep.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  void       endSweepDictCensus(double splitSurplusPercent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  // Return the largest free chunk in the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  FreeChunk* findLargestDict() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  // Accessors for statistics
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  void       setTreeSurplus(double splitSurplusPercent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  void       setTreeHints(void);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  // Reset statistics for all the lists in the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  void       clearTreeCensus(void);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // Print the statistcis for all the lists in the tree.  Also may
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  // print out summaries.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  void       printDictCensus(void) const;
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 670
diff changeset
   275
  void       print_free_lists(outputStream* st) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // For debugging.  Returns the sum of the _returnedBytes for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  // all lists in the tree.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  size_t     sumDictReturnedBytes()     PRODUCT_RETURN0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // Sets the _returnedBytes for all the lists in the tree to zero.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  void       initializeDictReturnedBytes()      PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // For debugging.  Return the total number of chunks in the dictionary.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  size_t     totalCount()       PRODUCT_RETURN0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  void       reportStatistics() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  void       verify() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
};