hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp
author stefank
Tue, 23 Nov 2010 13:22:55 -0800
changeset 7397 5b173b4ca846
parent 6258 68f252c6e825
child 9984 5fe4dafb3739
permissions -rw-r--r--
6989984: Use standard include model for Hospot Summary: Replaced MakeDeps and the includeDB files with more standardized solutions. Reviewed-by: coleenp, kvn, kamg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     1
/*
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
     2
 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     4
 *
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     7
 * published by the Free Software Foundation.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     8
 *
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    13
 * accompanied this code).
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    14
 *
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4574
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4574
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: 4574
diff changeset
    21
 * questions.
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    22
 *
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    23
 */
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_FREECHUNK_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_FREECHUNK_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    28
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    29
#include "memory/memRegion.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    30
#include "oops/markOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    31
#include "runtime/mutex.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    32
#include "utilities/debug.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    33
#include "utilities/globalDefinitions.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    34
#include "utilities/ostream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
    35
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    36
//
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    37
// Free block maintenance for Concurrent Mark Sweep Generation
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    38
//
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    39
// The main data structure for free blocks are
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    40
// . an indexed array of small free blocks, and
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    41
// . a dictionary of large free blocks
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    42
//
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    43
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    44
// No virtuals in FreeChunk (don't want any vtables).
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    45
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    46
// A FreeChunk is merely a chunk that can be in a doubly linked list
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    47
// and has a size field. NOTE: FreeChunks are distinguished from allocated
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    48
// objects in two ways (by the sweeper), depending on whether the VM is 32 or
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    49
// 64 bits.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    50
// In 32 bits or 64 bits without CompressedOops, the second word (prev) has the
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    51
// LSB set to indicate a free chunk; allocated objects' klass() pointers
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    52
// don't have their LSB set. The corresponding bit in the CMSBitMap is
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    53
// set when the chunk is allocated. There are also blocks that "look free"
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    54
// but are not part of the free list and should not be coalesced into larger
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    55
// free blocks. These free blocks have their two LSB's set.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    56
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    57
class FreeChunk VALUE_OBJ_CLASS_SPEC {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    58
  friend class VMStructs;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    59
  // For 64 bit compressed oops, the markOop encodes both the size and the
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    60
  // indication that this is a FreeChunk and not an object.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    61
  volatile size_t   _size;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    62
  FreeChunk* _prev;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    63
  FreeChunk* _next;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    64
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    65
  markOop mark()     const volatile { return (markOop)_size; }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    66
  void set_mark(markOop m)          { _size = (size_t)m; }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    67
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    68
 public:
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    69
  NOT_PRODUCT(static const size_t header_size();)
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    70
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    71
  // Returns "true" if the address indicates that the block represents
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    72
  // a free chunk.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    73
  static bool indicatesFreeChunk(const HeapWord* addr) {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    74
    // Force volatile read from addr because value might change between
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    75
    // calls.  We really want the read of _mark and _prev from this pointer
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    76
    // to be volatile but making the fields volatile causes all sorts of
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    77
    // compilation errors.
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    78
    return ((volatile FreeChunk*)addr)->isFree();
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    79
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    80
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    81
  bool isFree() const volatile {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    82
    LP64_ONLY(if (UseCompressedOops) return mark()->is_cms_free_chunk(); else)
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    83
    return (((intptr_t)_prev) & 0x1) == 0x1;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    84
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    85
  bool cantCoalesce() const {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    86
    assert(isFree(), "can't get coalesce bit on not free");
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    87
    return (((intptr_t)_prev) & 0x2) == 0x2;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    88
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    89
  void dontCoalesce() {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    90
    // the block should be free
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    91
    assert(isFree(), "Should look like a free block");
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    92
    _prev = (FreeChunk*)(((intptr_t)_prev) | 0x2);
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    93
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    94
  FreeChunk* prev() const {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    95
    return (FreeChunk*)(((intptr_t)_prev) & ~(0x3));
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    96
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    97
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
    98
  debug_only(void* prev_addr() const { return (void*)&_prev; })
971
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 613
diff changeset
    99
  debug_only(void* next_addr() const { return (void*)&_next; })
f0b20be4165d 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 613
diff changeset
   100
  debug_only(void* size_addr() const { return (void*)&_size; })
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   101
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   102
  size_t size() const volatile {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   103
    LP64_ONLY(if (UseCompressedOops) return mark()->get_size(); else )
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   104
    return _size;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   105
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   106
  void setSize(size_t sz) {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   107
    LP64_ONLY(if (UseCompressedOops) set_mark(markOopDesc::set_size_and_free(sz)); else )
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   108
    _size = sz;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   109
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   110
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   111
  FreeChunk* next()   const { return _next; }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   112
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   113
  void linkAfter(FreeChunk* ptr) {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   114
    linkNext(ptr);
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   115
    if (ptr != NULL) ptr->linkPrev(this);
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   116
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   117
  void linkAfterNonNull(FreeChunk* ptr) {
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   118
    assert(ptr != NULL, "precondition violation");
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   119
    linkNext(ptr);
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   120
    ptr->linkPrev(this);
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   121
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   122
  void linkNext(FreeChunk* ptr) { _next = ptr; }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   123
  void linkPrev(FreeChunk* ptr) {
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   124
    LP64_ONLY(if (UseCompressedOops) _prev = ptr; else)
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   125
    _prev = (FreeChunk*)((intptr_t)ptr | 0x1);
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   126
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   127
  void clearPrev()              { _prev = NULL; }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   128
  void clearNext()              { _next = NULL; }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   129
  void markNotFree() {
6258
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   130
    // Set _prev (klass) to null before (if) clearing the mark word below
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   131
    _prev = NULL;
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   132
#ifdef _LP64
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   133
    if (UseCompressedOops) {
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   134
      OrderAccess::storestore();
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   135
      set_mark(markOopDesc::prototype());
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   136
    }
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   137
#endif
68f252c6e825 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 5702
diff changeset
   138
    assert(!isFree(), "Error");
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   139
  }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   140
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   141
  // Return the address past the end of this chunk
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   142
  HeapWord* end() const { return ((HeapWord*) this) + size(); }
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   143
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   144
  // debugging
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   145
  void verify()             const PRODUCT_RETURN;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   146
  void verifyList()         const PRODUCT_RETURN;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   147
  void mangleAllocated(size_t size) PRODUCT_RETURN;
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   148
  void mangleFreed(size_t size)     PRODUCT_RETURN;
4574
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 977
diff changeset
   149
b2d5b0975515 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 977
diff changeset
   150
  void print_on(outputStream* st);
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   151
};
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   152
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 4574
diff changeset
   153
extern size_t MinChunkSize;
613
2aa2b913106c 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
   154
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
   155
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6258
diff changeset
   156
#endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_FREECHUNK_HPP