psParallelCompact.hpp 50.4 KB
Newer Older
D
duke 已提交
1
/*
X
xdono 已提交
2
 * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
D
duke 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 *
 */

class ParallelScavengeHeap;
class PSAdaptiveSizePolicy;
class PSYoungGen;
class PSOldGen;
class PSPermGen;
class ParCompactionManager;
class ParallelTaskTerminator;
class PSParallelCompact;
class GCTaskManager;
class GCTaskQueue;
class PreGCValues;
class MoveAndUpdateClosure;
class RefProcTaskExecutor;

class SpaceInfo
{
 public:
  MutableSpace* space() const { return _space; }

  // Where the free space will start after the collection.  Valid only after the
  // summary phase completes.
  HeapWord* new_top() const { return _new_top; }

  // Allows new_top to be set.
  HeapWord** new_top_addr() { return &_new_top; }

  // Where the smallest allowable dense prefix ends (used only for perm gen).
  HeapWord* min_dense_prefix() const { return _min_dense_prefix; }

  // Where the dense prefix ends, or the compacted region begins.
  HeapWord* dense_prefix() const { return _dense_prefix; }

  // The start array for the (generation containing the) space, or NULL if there
  // is no start array.
  ObjectStartArray* start_array() const { return _start_array; }

  void set_space(MutableSpace* s)           { _space = s; }
  void set_new_top(HeapWord* addr)          { _new_top = addr; }
  void set_min_dense_prefix(HeapWord* addr) { _min_dense_prefix = addr; }
  void set_dense_prefix(HeapWord* addr)     { _dense_prefix = addr; }
  void set_start_array(ObjectStartArray* s) { _start_array = s; }

 private:
  MutableSpace*     _space;
  HeapWord*         _new_top;
  HeapWord*         _min_dense_prefix;
  HeapWord*         _dense_prefix;
  ObjectStartArray* _start_array;
};

class ParallelCompactData
{
public:
  // Sizes are in HeapWords, unless indicated otherwise.
79 80 81
  static const size_t Log2RegionSize;
  static const size_t RegionSize;
  static const size_t RegionSizeBytes;
D
duke 已提交
82

83 84 85 86 87 88
  // Mask for the bits in a size_t to get an offset within a region.
  static const size_t RegionSizeOffsetMask;
  // Mask for the bits in a pointer to get an offset within a region.
  static const size_t RegionAddrOffsetMask;
  // Mask for the bits in a pointer to get the address of the start of a region.
  static const size_t RegionAddrMask;
D
duke 已提交
89

90
  class RegionData
D
duke 已提交
91 92
  {
  public:
93
    // Destination address of the region.
D
duke 已提交
94 95
    HeapWord* destination() const { return _destination; }

96 97
    // The first region containing data destined for this region.
    size_t source_region() const { return _source_region; }
D
duke 已提交
98

99 100
    // The object (if any) starting in this region and ending in a different
    // region that could not be updated during the main (parallel) compaction
D
duke 已提交
101
    // phase.  This is different from _partial_obj_addr, which is an object that
102
    // extends onto a source region.  However, the two uses do not overlap in
D
duke 已提交
103 104 105
    // time, so the same field is used to save space.
    HeapWord* deferred_obj_addr() const { return _partial_obj_addr; }

106
    // The starting address of the partial object extending onto the region.
D
duke 已提交
107 108
    HeapWord* partial_obj_addr() const { return _partial_obj_addr; }

109
    // Size of the partial object extending onto the region (words).
D
duke 已提交
110 111
    size_t partial_obj_size() const { return _partial_obj_size; }

112 113 114 115
    // Size of live data that lies within this region due to objects that start
    // in this region (words).  This does not include the partial object
    // extending onto the region (if any), or the part of an object that extends
    // onto the next region (if any).
D
duke 已提交
116 117
    size_t live_obj_size() const { return _dc_and_los & los_mask; }

118
    // Total live data that lies within the region (words).
D
duke 已提交
119 120
    size_t data_size() const { return partial_obj_size() + live_obj_size(); }

121 122
    // The destination_count is the number of other regions to which data from
    // this region will be copied.  At the end of the summary phase, the valid
D
duke 已提交
123 124
    // values of destination_count are
    //
125 126 127 128 129
    // 0 - data from the region will be compacted completely into itself, or the
    //     region is empty.  The region can be claimed and then filled.
    // 1 - data from the region will be compacted into 1 other region; some
    //     data from the region may also be compacted into the region itself.
    // 2 - data from the region will be copied to 2 other regions.
D
duke 已提交
130
    //
131
    // During compaction as regions are emptied, the destination_count is
D
duke 已提交
132 133 134
    // decremented (atomically) and when it reaches 0, it can be claimed and
    // then filled.
    //
135 136
    // A region is claimed for processing by atomically changing the
    // destination_count to the claimed value (dc_claimed).  After a region has
D
duke 已提交
137 138 139 140 141
    // been filled, the destination_count should be set to the completed value
    // (dc_completed).
    inline uint destination_count() const;
    inline uint destination_count_raw() const;

142
    // The location of the java heap data that corresponds to this region.
D
duke 已提交
143 144
    inline HeapWord* data_location() const;

145
    // The highest address referenced by objects in this region.
D
duke 已提交
146 147
    inline HeapWord* highest_ref() const;

148
    // Whether this region is available to be claimed, has been claimed, or has
D
duke 已提交
149 150
    // been completed.
    //
151 152
    // Minor subtlety:  claimed() returns true if the region is marked
    // completed(), which is desirable since a region must be claimed before it
D
duke 已提交
153 154 155 156 157 158 159
    // can be completed.
    bool available() const { return _dc_and_los < dc_one; }
    bool claimed() const   { return _dc_and_los >= dc_claimed; }
    bool completed() const { return _dc_and_los >= dc_completed; }

    // These are not atomic.
    void set_destination(HeapWord* addr)       { _destination = addr; }
160
    void set_source_region(size_t region)      { _source_region = region; }
D
duke 已提交
161 162 163
    void set_deferred_obj_addr(HeapWord* addr) { _partial_obj_addr = addr; }
    void set_partial_obj_addr(HeapWord* addr)  { _partial_obj_addr = addr; }
    void set_partial_obj_size(size_t words)    {
164
      _partial_obj_size = (region_sz_t) words;
D
duke 已提交
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
    }

    inline void set_destination_count(uint count);
    inline void set_live_obj_size(size_t words);
    inline void set_data_location(HeapWord* addr);
    inline void set_completed();
    inline bool claim_unsafe();

    // These are atomic.
    inline void add_live_obj(size_t words);
    inline void set_highest_ref(HeapWord* addr);
    inline void decrement_destination_count();
    inline bool claim();

  private:
180 181
    // The type used to represent object sizes within a region.
    typedef uint region_sz_t;
D
duke 已提交
182 183 184 185

    // Constants for manipulating the _dc_and_los field, which holds both the
    // destination count and live obj size.  The live obj size lives at the
    // least significant end so no masking is necessary when adding.
186 187 188 189 190 191 192 193 194 195 196 197
    static const region_sz_t dc_shift;           // Shift amount.
    static const region_sz_t dc_mask;            // Mask for destination count.
    static const region_sz_t dc_one;             // 1, shifted appropriately.
    static const region_sz_t dc_claimed;         // Region has been claimed.
    static const region_sz_t dc_completed;       // Region has been completed.
    static const region_sz_t los_mask;           // Mask for live obj size.

    HeapWord*            _destination;
    size_t               _source_region;
    HeapWord*            _partial_obj_addr;
    region_sz_t          _partial_obj_size;
    region_sz_t volatile _dc_and_los;
D
duke 已提交
198 199 200
#ifdef ASSERT
    // These enable optimizations that are only partially implemented.  Use
    // debug builds to prevent the code fragments from breaking.
201 202
    HeapWord*            _data_location;
    HeapWord*            _highest_ref;
D
duke 已提交
203 204 205 206
#endif  // #ifdef ASSERT

#ifdef ASSERT
   public:
207
    uint            _pushed;   // 0 until region is pushed onto a worker's stack
D
duke 已提交
208 209 210 211 212 213 214 215
   private:
#endif
  };

public:
  ParallelCompactData();
  bool initialize(MemRegion covered_region);

216
  size_t region_count() const { return _region_count; }
D
duke 已提交
217

218 219 220
  // Convert region indices to/from RegionData pointers.
  inline RegionData* region(size_t region_idx) const;
  inline size_t     region(const RegionData* const region_ptr) const;
D
duke 已提交
221

222 223
  // Returns true if the given address is contained within the region
  bool region_contains(size_t region_index, HeapWord* addr);
D
duke 已提交
224 225 226 227

  void add_obj(HeapWord* addr, size_t len);
  void add_obj(oop p, size_t len) { add_obj((HeapWord*)p, len); }

228 229 230
  // Fill in the regions covering [beg, end) so that no data moves; i.e., the
  // destination of region n is simply the start of region n.  The argument beg
  // must be region-aligned; end need not be.
D
duke 已提交
231 232 233 234 235 236 237
  void summarize_dense_prefix(HeapWord* beg, HeapWord* end);

  bool summarize(HeapWord* target_beg, HeapWord* target_end,
                 HeapWord* source_beg, HeapWord* source_end,
                 HeapWord** target_next, HeapWord** source_next = 0);

  void clear();
238
  void clear_range(size_t beg_region, size_t end_region);
D
duke 已提交
239
  void clear_range(HeapWord* beg, HeapWord* end) {
240
    clear_range(addr_to_region_idx(beg), addr_to_region_idx(end));
D
duke 已提交
241 242
  }

243
  // Return the number of words between addr and the start of the region
D
duke 已提交
244
  // containing addr.
245
  inline size_t     region_offset(const HeapWord* addr) const;
D
duke 已提交
246

247 248 249 250 251 252
  // Convert addresses to/from a region index or region pointer.
  inline size_t     addr_to_region_idx(const HeapWord* addr) const;
  inline RegionData* addr_to_region_ptr(const HeapWord* addr) const;
  inline HeapWord*  region_to_addr(size_t region) const;
  inline HeapWord*  region_to_addr(size_t region, size_t offset) const;
  inline HeapWord*  region_to_addr(const RegionData* region) const;
D
duke 已提交
253

254 255 256
  inline HeapWord*  region_align_down(HeapWord* addr) const;
  inline HeapWord*  region_align_up(HeapWord* addr) const;
  inline bool       is_region_aligned(HeapWord* addr) const;
D
duke 已提交
257 258

  // Return the address one past the end of the partial object.
259
  HeapWord* partial_obj_end(size_t region_idx) const;
D
duke 已提交
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277

  // Return the new location of the object p after the
  // the compaction.
  HeapWord* calc_new_pointer(HeapWord* addr);

  HeapWord* calc_new_pointer(oop p) {
    return calc_new_pointer((HeapWord*) p);
  }

  // Return the updated address for the given klass
  klassOop calc_new_klass(klassOop);

#ifdef  ASSERT
  void verify_clear(const PSVirtualSpace* vspace);
  void verify_clear();
#endif  // #ifdef ASSERT

private:
278
  bool initialize_region_data(size_t region_size);
D
duke 已提交
279 280 281 282 283 284 285 286
  PSVirtualSpace* create_vspace(size_t count, size_t element_size);

private:
  HeapWord*       _region_start;
#ifdef  ASSERT
  HeapWord*       _region_end;
#endif  // #ifdef ASSERT

287 288 289
  PSVirtualSpace* _region_vspace;
  RegionData*     _region_data;
  size_t          _region_count;
D
duke 已提交
290 291 292
};

inline uint
293
ParallelCompactData::RegionData::destination_count_raw() const
D
duke 已提交
294 295 296 297 298
{
  return _dc_and_los & dc_mask;
}

inline uint
299
ParallelCompactData::RegionData::destination_count() const
D
duke 已提交
300 301 302 303 304
{
  return destination_count_raw() >> dc_shift;
}

inline void
305
ParallelCompactData::RegionData::set_destination_count(uint count)
D
duke 已提交
306 307
{
  assert(count <= (dc_completed >> dc_shift), "count too large");
308
  const region_sz_t live_sz = (region_sz_t) live_obj_size();
D
duke 已提交
309 310 311
  _dc_and_los = (count << dc_shift) | live_sz;
}

312
inline void ParallelCompactData::RegionData::set_live_obj_size(size_t words)
D
duke 已提交
313 314
{
  assert(words <= los_mask, "would overflow");
315
  _dc_and_los = destination_count_raw() | (region_sz_t)words;
D
duke 已提交
316 317
}

318
inline void ParallelCompactData::RegionData::decrement_destination_count()
D
duke 已提交
319 320 321 322 323 324
{
  assert(_dc_and_los < dc_claimed, "already claimed");
  assert(_dc_and_los >= dc_one, "count would go negative");
  Atomic::add((int)dc_mask, (volatile int*)&_dc_and_los);
}

325
inline HeapWord* ParallelCompactData::RegionData::data_location() const
D
duke 已提交
326 327 328 329 330
{
  DEBUG_ONLY(return _data_location;)
  NOT_DEBUG(return NULL;)
}

331
inline HeapWord* ParallelCompactData::RegionData::highest_ref() const
D
duke 已提交
332 333 334 335 336
{
  DEBUG_ONLY(return _highest_ref;)
  NOT_DEBUG(return NULL;)
}

337
inline void ParallelCompactData::RegionData::set_data_location(HeapWord* addr)
D
duke 已提交
338 339 340 341
{
  DEBUG_ONLY(_data_location = addr;)
}

342
inline void ParallelCompactData::RegionData::set_completed()
D
duke 已提交
343 344
{
  assert(claimed(), "must be claimed first");
345
  _dc_and_los = dc_completed | (region_sz_t) live_obj_size();
D
duke 已提交
346 347
}

348
// MT-unsafe claiming of a region.  Should only be used during single threaded
D
duke 已提交
349
// execution.
350
inline bool ParallelCompactData::RegionData::claim_unsafe()
D
duke 已提交
351 352 353 354 355 356 357 358
{
  if (available()) {
    _dc_and_los |= dc_claimed;
    return true;
  }
  return false;
}

359
inline void ParallelCompactData::RegionData::add_live_obj(size_t words)
D
duke 已提交
360 361 362 363 364
{
  assert(words <= (size_t)los_mask - live_obj_size(), "overflow");
  Atomic::add((int) words, (volatile int*) &_dc_and_los);
}

365
inline void ParallelCompactData::RegionData::set_highest_ref(HeapWord* addr)
D
duke 已提交
366 367 368 369 370 371 372 373 374
{
#ifdef ASSERT
  HeapWord* tmp = _highest_ref;
  while (addr > tmp) {
    tmp = (HeapWord*)Atomic::cmpxchg_ptr(addr, &_highest_ref, tmp);
  }
#endif  // #ifdef ASSERT
}

375
inline bool ParallelCompactData::RegionData::claim()
D
duke 已提交
376 377 378 379 380 381 382
{
  const int los = (int) live_obj_size();
  const int old = Atomic::cmpxchg(dc_claimed | los,
                                  (volatile int*) &_dc_and_los, los);
  return old == los;
}

383 384
inline ParallelCompactData::RegionData*
ParallelCompactData::region(size_t region_idx) const
D
duke 已提交
385
{
386 387
  assert(region_idx <= region_count(), "bad arg");
  return _region_data + region_idx;
D
duke 已提交
388 389 390
}

inline size_t
391
ParallelCompactData::region(const RegionData* const region_ptr) const
D
duke 已提交
392
{
393 394 395
  assert(region_ptr >= _region_data, "bad arg");
  assert(region_ptr <= _region_data + region_count(), "bad arg");
  return pointer_delta(region_ptr, _region_data, sizeof(RegionData));
D
duke 已提交
396 397 398
}

inline size_t
399
ParallelCompactData::region_offset(const HeapWord* addr) const
D
duke 已提交
400 401 402
{
  assert(addr >= _region_start, "bad addr");
  assert(addr <= _region_end, "bad addr");
403
  return (size_t(addr) & RegionAddrOffsetMask) >> LogHeapWordSize;
D
duke 已提交
404 405 406
}

inline size_t
407
ParallelCompactData::addr_to_region_idx(const HeapWord* addr) const
D
duke 已提交
408 409 410
{
  assert(addr >= _region_start, "bad addr");
  assert(addr <= _region_end, "bad addr");
411
  return pointer_delta(addr, _region_start) >> Log2RegionSize;
D
duke 已提交
412 413
}

414 415
inline ParallelCompactData::RegionData*
ParallelCompactData::addr_to_region_ptr(const HeapWord* addr) const
D
duke 已提交
416
{
417
  return region(addr_to_region_idx(addr));
D
duke 已提交
418 419 420
}

inline HeapWord*
421
ParallelCompactData::region_to_addr(size_t region) const
D
duke 已提交
422
{
423 424
  assert(region <= _region_count, "region out of range");
  return _region_start + (region << Log2RegionSize);
D
duke 已提交
425 426 427
}

inline HeapWord*
428
ParallelCompactData::region_to_addr(const RegionData* region) const
D
duke 已提交
429
{
430 431
  return region_to_addr(pointer_delta(region, _region_data,
                                      sizeof(RegionData)));
D
duke 已提交
432 433 434
}

inline HeapWord*
435
ParallelCompactData::region_to_addr(size_t region, size_t offset) const
D
duke 已提交
436
{
437 438 439
  assert(region <= _region_count, "region out of range");
  assert(offset < RegionSize, "offset too big");  // This may be too strict.
  return region_to_addr(region) + offset;
D
duke 已提交
440 441 442
}

inline HeapWord*
443
ParallelCompactData::region_align_down(HeapWord* addr) const
D
duke 已提交
444 445
{
  assert(addr >= _region_start, "bad addr");
446 447
  assert(addr < _region_end + RegionSize, "bad addr");
  return (HeapWord*)(size_t(addr) & RegionAddrMask);
D
duke 已提交
448 449 450
}

inline HeapWord*
451
ParallelCompactData::region_align_up(HeapWord* addr) const
D
duke 已提交
452 453 454
{
  assert(addr >= _region_start, "bad addr");
  assert(addr <= _region_end, "bad addr");
455
  return region_align_down(addr + RegionSizeOffsetMask);
D
duke 已提交
456 457 458
}

inline bool
459
ParallelCompactData::is_region_aligned(HeapWord* addr) const
D
duke 已提交
460
{
461
  return region_offset(addr) == 0;
D
duke 已提交
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
}

// Abstract closure for use with ParMarkBitMap::iterate(), which will invoke the
// do_addr() method.
//
// The closure is initialized with the number of heap words to process
// (words_remaining()), and becomes 'full' when it reaches 0.  The do_addr()
// methods in subclasses should update the total as words are processed.  Since
// only one subclass actually uses this mechanism to terminate iteration, the
// default initial value is > 0.  The implementation is here and not in the
// single subclass that uses it to avoid making is_full() virtual, and thus
// adding a virtual call per live object.

class ParMarkBitMapClosure: public StackObj {
 public:
  typedef ParMarkBitMap::idx_t idx_t;
  typedef ParMarkBitMap::IterationStatus IterationStatus;

 public:
  inline ParMarkBitMapClosure(ParMarkBitMap* mbm, ParCompactionManager* cm,
                              size_t words = max_uintx);

  inline ParCompactionManager* compaction_manager() const;
  inline ParMarkBitMap*        bitmap() const;
  inline size_t                words_remaining() const;
  inline bool                  is_full() const;
  inline HeapWord*             source() const;

  inline void                  set_source(HeapWord* addr);

  virtual IterationStatus do_addr(HeapWord* addr, size_t words) = 0;

 protected:
  inline void decrement_words_remaining(size_t words);

 private:
  ParMarkBitMap* const        _bitmap;
  ParCompactionManager* const _compaction_manager;
  DEBUG_ONLY(const size_t     _initial_words_remaining;) // Useful in debugger.
  size_t                      _words_remaining; // Words left to copy.

 protected:
  HeapWord*                   _source;          // Next addr that would be read.
};

inline
ParMarkBitMapClosure::ParMarkBitMapClosure(ParMarkBitMap* bitmap,
                                           ParCompactionManager* cm,
                                           size_t words):
  _bitmap(bitmap), _compaction_manager(cm)
#ifdef  ASSERT
  , _initial_words_remaining(words)
#endif
{
  _words_remaining = words;
  _source = NULL;
}

inline ParCompactionManager* ParMarkBitMapClosure::compaction_manager() const {
  return _compaction_manager;
}

inline ParMarkBitMap* ParMarkBitMapClosure::bitmap() const {
  return _bitmap;
}

inline size_t ParMarkBitMapClosure::words_remaining() const {
  return _words_remaining;
}

inline bool ParMarkBitMapClosure::is_full() const {
  return words_remaining() == 0;
}

inline HeapWord* ParMarkBitMapClosure::source() const {
  return _source;
}

inline void ParMarkBitMapClosure::set_source(HeapWord* addr) {
  _source = addr;
}

inline void ParMarkBitMapClosure::decrement_words_remaining(size_t words) {
  assert(_words_remaining >= words, "processed too many words");
  _words_remaining -= words;
}

549 550 551 552 553 554 555 556 557
// The UseParallelOldGC collector is a stop-the-world garbage collector that
// does parts of the collection using parallel threads.  The collection includes
// the tenured generation and the young generation.  The permanent generation is
// collected at the same time as the other two generations but the permanent
// generation is collect by a single GC thread.  The permanent generation is
// collected serially because of the requirement that during the processing of a
// klass AAA, any objects reference by AAA must already have been processed.
// This requirement is enforced by a left (lower address) to right (higher
// address) sliding compaction.
558 559 560 561 562 563 564 565 566 567 568 569 570 571
//
// There are four phases of the collection.
//
//      - marking phase
//      - summary phase
//      - compacting phase
//      - clean up phase
//
// Roughly speaking these phases correspond, respectively, to
//      - mark all the live objects
//      - calculate the destination of each object at the end of the collection
//      - move the objects to their destination
//      - update some references and reinitialize some variables
//
572 573 574 575 576
// These three phases are invoked in PSParallelCompact::invoke_no_policy().  The
// marking phase is implemented in PSParallelCompact::marking_phase() and does a
// complete marking of the heap.  The summary phase is implemented in
// PSParallelCompact::summary_phase().  The move and update phase is implemented
// in PSParallelCompact::compact().
577
//
578 579 580 581
// A space that is being collected is divided into regions and with each region
// is associated an object of type ParallelCompactData.  Each region is of a
// fixed size and typically will contain more than 1 object and may have parts
// of objects at the front and back of the region.
582
//
583
// region            -----+---------------------+----------
584 585
// objects covered   [ AAA  )[ BBB )[ CCC   )[ DDD     )
//
586 587 588 589 590 591 592 593 594 595
// The marking phase does a complete marking of all live objects in the heap.
// The marking also compiles the size of the data for all live objects covered
// by the region.  This size includes the part of any live object spanning onto
// the region (part of AAA if it is live) from the front, all live objects
// contained in the region (BBB and/or CCC if they are live), and the part of
// any live objects covered by the region that extends off the region (part of
// DDD if it is live).  The marking phase uses multiple GC threads and marking
// is done in a bit array of type ParMarkBitMap.  The marking of the bit map is
// done atomically as is the accumulation of the size of the live objects
// covered by a region.
596
//
597 598 599 600
// The summary phase calculates the total live data to the left of each region
// XXX.  Based on that total and the bottom of the space, it can calculate the
// starting location of the live data in XXX.  The summary phase calculates for
// each region XXX quantites such as
601
//
602 603 604 605
//      - the amount of live data at the beginning of a region from an object
//        entering the region.
//      - the location of the first live data on the region
//      - a count of the number of regions receiving live data from XXX.
606 607
//
// See ParallelCompactData for precise details.  The summary phase also
608 609 610 611
// calculates the dense prefix for the compaction.  The dense prefix is a
// portion at the beginning of the space that is not moved.  The objects in the
// dense prefix do need to have their object references updated.  See method
// summarize_dense_prefix().
612 613 614
//
// The summary phase is done using 1 GC thread.
//
615 616
// The compaction phase moves objects to their new location and updates all
// references in the object.
617
//
618 619 620 621 622 623 624
// A current exception is that objects that cross a region boundary are moved
// but do not have their references updated.  References are not updated because
// it cannot easily be determined if the klass pointer KKK for the object AAA
// has been updated.  KKK likely resides in a region to the left of the region
// containing AAA.  These AAA's have there references updated at the end in a
// clean up phase.  See the method PSParallelCompact::update_deferred_objects().
// An alternate strategy is being investigated for this deferral of updating.
625
//
626 627 628 629 630 631 632 633 634 635
// Compaction is done on a region basis.  A region that is ready to be filled is
// put on a ready list and GC threads take region off the list and fill them.  A
// region is ready to be filled if it empty of live objects.  Such a region may
// have been initially empty (only contained dead objects) or may have had all
// its live objects copied out already.  A region that compacts into itself is
// also ready for filling.  The ready list is initially filled with empty
// regions and regions compacting into themselves.  There is always at least 1
// region that can be put on the ready list.  The regions are atomically added
// and removed from the ready list.

D
duke 已提交
636 637 638 639
class PSParallelCompact : AllStatic {
 public:
  // Convenient access to type names.
  typedef ParMarkBitMap::idx_t idx_t;
640
  typedef ParallelCompactData::RegionData RegionData;
D
duke 已提交
641 642 643 644 645 646 647

  typedef enum {
    perm_space_id, old_space_id, eden_space_id,
    from_space_id, to_space_id, last_space_id
  } SpaceId;

 public:
648
  // Inline closure decls
D
duke 已提交
649 650 651
  //
  class IsAliveClosure: public BoolObjectClosure {
   public:
652 653
    virtual void do_object(oop p);
    virtual bool do_object_b(oop p);
D
duke 已提交
654 655 656
  };

  class KeepAliveClosure: public OopClosure {
657
   private:
D
duke 已提交
658
    ParCompactionManager* _compaction_manager;
659 660
   protected:
    template <class T> inline void do_oop_work(T* p);
D
duke 已提交
661
   public:
662 663 664
    KeepAliveClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
    virtual void do_oop(oop* p);
    virtual void do_oop(narrowOop* p);
D
duke 已提交
665 666
  };

667 668 669
  // Current unused
  class FollowRootClosure: public OopsInGenClosure {
   private:
D
duke 已提交
670 671
    ParCompactionManager* _compaction_manager;
   public:
672 673 674
    FollowRootClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
    virtual void do_oop(oop* p);
    virtual void do_oop(narrowOop* p);
D
duke 已提交
675 676 677 678
    virtual const bool do_nmethods() const { return true; }
  };

  class FollowStackClosure: public VoidClosure {
679
   private:
D
duke 已提交
680 681
    ParCompactionManager* _compaction_manager;
   public:
682 683
    FollowStackClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
    virtual void do_void();
D
duke 已提交
684 685 686
  };

  class AdjustPointerClosure: public OopsInGenClosure {
687
   private:
D
duke 已提交
688 689
    bool _is_root;
   public:
690 691 692
    AdjustPointerClosure(bool is_root) : _is_root(is_root) { }
    virtual void do_oop(oop* p);
    virtual void do_oop(narrowOop* p);
D
duke 已提交
693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757
  };

  // Closure for verifying update of pointers.  Does not
  // have any side effects.
  class VerifyUpdateClosure: public ParMarkBitMapClosure {
    const MutableSpace* _space; // Is this ever used?

   public:
    VerifyUpdateClosure(ParCompactionManager* cm, const MutableSpace* sp) :
      ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm), _space(sp)
    { }

    virtual IterationStatus do_addr(HeapWord* addr, size_t words);

    const MutableSpace* space() { return _space; }
  };

  // Closure for updating objects altered for debug checking
  class ResetObjectsClosure: public ParMarkBitMapClosure {
   public:
    ResetObjectsClosure(ParCompactionManager* cm):
      ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm)
    { }

    virtual IterationStatus do_addr(HeapWord* addr, size_t words);
  };

  friend class KeepAliveClosure;
  friend class FollowStackClosure;
  friend class AdjustPointerClosure;
  friend class FollowRootClosure;
  friend class instanceKlassKlass;
  friend class RefProcTaskProxy;

 private:
  static elapsedTimer         _accumulated_time;
  static unsigned int         _total_invocations;
  static unsigned int         _maximum_compaction_gc_num;
  static jlong                _time_of_last_gc;   // ms
  static CollectorCounters*   _counters;
  static ParMarkBitMap        _mark_bitmap;
  static ParallelCompactData  _summary_data;
  static IsAliveClosure       _is_alive_closure;
  static SpaceInfo            _space_info[last_space_id];
  static bool                 _print_phases;
  static AdjustPointerClosure _adjust_root_pointer_closure;
  static AdjustPointerClosure _adjust_pointer_closure;

  // Reference processing (used in ...follow_contents)
  static ReferenceProcessor*  _ref_processor;

  // Updated location of intArrayKlassObj.
  static klassOop _updated_int_array_klass_obj;

  // Values computed at initialization and used by dead_wood_limiter().
  static double _dwl_mean;
  static double _dwl_std_dev;
  static double _dwl_first_term;
  static double _dwl_adjustment;
#ifdef  ASSERT
  static bool   _dwl_initialized;
#endif  // #ifdef ASSERT

 private:
  // Closure accessors
758
  static OopClosure* adjust_pointer_closure()      { return (OopClosure*)&_adjust_pointer_closure; }
D
duke 已提交
759
  static OopClosure* adjust_root_pointer_closure() { return (OopClosure*)&_adjust_root_pointer_closure; }
760
  static BoolObjectClosure* is_alive_closure()     { return (BoolObjectClosure*)&_is_alive_closure; }
D
duke 已提交
761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778

  static void initialize_space_info();

  // Return true if details about individual phases should be printed.
  static inline bool print_phases();

  // Clear the marking bitmap and summary data that cover the specified space.
  static void clear_data_covering_space(SpaceId id);

  static void pre_compact(PreGCValues* pre_gc_values);
  static void post_compact();

  // Mark live objects
  static void marking_phase(ParCompactionManager* cm,
                            bool maximum_heap_compaction);
  static void follow_stack(ParCompactionManager* cm);
  static void follow_weak_klass_links(ParCompactionManager* cm);

779
  template <class T> static inline void adjust_pointer(T* p, bool is_root);
D
duke 已提交
780 781
  static void adjust_root_pointer(oop* p) { adjust_pointer(p, true); }

782 783
  template <class T>
  static inline void follow_root(ParCompactionManager* cm, T* p);
D
duke 已提交
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802

  // Compute the dense prefix for the designated space.  This is an experimental
  // implementation currently not used in production.
  static HeapWord* compute_dense_prefix_via_density(const SpaceId id,
                                                    bool maximum_compaction);

  // Methods used to compute the dense prefix.

  // Compute the value of the normal distribution at x = density.  The mean and
  // standard deviation are values saved by initialize_dead_wood_limiter().
  static inline double normal_distribution(double density);

  // Initialize the static vars used by dead_wood_limiter().
  static void initialize_dead_wood_limiter();

  // Return the percentage of space that can be treated as "dead wood" (i.e.,
  // not reclaimed).
  static double dead_wood_limiter(double density, size_t min_percent);

803
  // Find the first (left-most) region in the range [beg, end) that has at least
D
duke 已提交
804
  // dead_words of dead space to the left.  The argument beg must be the first
805 806 807 808
  // region in the space that is not completely live.
  static RegionData* dead_wood_limit_region(const RegionData* beg,
                                            const RegionData* end,
                                            size_t dead_words);
D
duke 已提交
809

810
  // Return a pointer to the first region in the range [beg, end) that is not
D
duke 已提交
811
  // completely full.
812 813
  static RegionData* first_dead_space_region(const RegionData* beg,
                                             const RegionData* end);
D
duke 已提交
814 815 816

  // Return a value indicating the benefit or 'yield' if the compacted region
  // were to start (or equivalently if the dense prefix were to end) at the
817
  // candidate region.  Higher values are better.
D
duke 已提交
818 819 820 821
  //
  // The value is based on the amount of space reclaimed vs. the costs of (a)
  // updating references in the dense prefix plus (b) copying objects and
  // updating references in the compacted region.
822
  static inline double reclaimed_ratio(const RegionData* const candidate,
D
duke 已提交
823 824 825 826 827 828 829 830
                                       HeapWord* const bottom,
                                       HeapWord* const top,
                                       HeapWord* const new_top);

  // Compute the dense prefix for the designated space.
  static HeapWord* compute_dense_prefix(const SpaceId id,
                                        bool maximum_compaction);

831 832 833
  // Return true if dead space crosses onto the specified Region; bit must be
  // the bit index corresponding to the first word of the Region.
  static inline bool dead_space_crosses_boundary(const RegionData* region,
D
duke 已提交
834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
                                                 idx_t bit);

  // Summary phase utility routine to fill dead space (if any) at the dense
  // prefix boundary.  Should only be called if the the dense prefix is
  // non-empty.
  static void fill_dense_prefix_end(SpaceId id);

  static void summarize_spaces_quick();
  static void summarize_space(SpaceId id, bool maximum_compaction);
  static void summary_phase(ParCompactionManager* cm, bool maximum_compaction);

  // The space that is compacted after space_id.
  static SpaceId next_compaction_space_id(SpaceId space_id);

  // Adjust addresses in roots.  Does not adjust addresses in heap.
  static void adjust_roots();

  // Serial code executed in preparation for the compaction phase.
  static void compact_prologue();

  // Move objects to new locations.
  static void compact_perm(ParCompactionManager* cm);
  static void compact();

858 859 860
  // Add available regions to the stack and draining tasks to the task queue.
  static void enqueue_region_draining_tasks(GCTaskQueue* q,
                                            uint parallel_gc_threads);
D
duke 已提交
861 862 863 864 865

  // Add dense prefix update tasks to the task queue.
  static void enqueue_dense_prefix_tasks(GCTaskQueue* q,
                                         uint parallel_gc_threads);

866 867
  // Add region stealing tasks to the task queue.
  static void enqueue_region_stealing_tasks(
D
duke 已提交
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
                                       GCTaskQueue* q,
                                       ParallelTaskTerminator* terminator_ptr,
                                       uint parallel_gc_threads);

  // For debugging only - compacts the old gen serially
  static void compact_serial(ParCompactionManager* cm);

  // If objects are left in eden after a collection, try to move the boundary
  // and absorb them into the old gen.  Returns true if eden was emptied.
  static bool absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
                                         PSYoungGen* young_gen,
                                         PSOldGen* old_gen);

  // Reset time since last full gc
  static void reset_millis_since_last_gc();

 protected:
#ifdef VALIDATE_MARK_SWEEP
886
  static GrowableArray<void*>*           _root_refs_stack;
D
duke 已提交
887 888 889 890 891
  static GrowableArray<oop> *            _live_oops;
  static GrowableArray<oop> *            _live_oops_moved_to;
  static GrowableArray<size_t>*          _live_oops_size;
  static size_t                          _live_oops_index;
  static size_t                          _live_oops_index_at_perm;
892 893
  static GrowableArray<void*>*           _other_refs_stack;
  static GrowableArray<void*>*           _adjusted_pointers;
D
duke 已提交
894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913
  static bool                            _pointer_tracking;
  static bool                            _root_tracking;

  // The following arrays are saved since the time of the last GC and
  // assist in tracking down problems where someone has done an errant
  // store into the heap, usually to an oop that wasn't properly
  // handleized across a GC. If we crash or otherwise fail before the
  // next GC, we can query these arrays to find out the object we had
  // intended to do the store to (assuming it is still alive) and the
  // offset within that object. Covered under RecordMarkSweepCompaction.
  static GrowableArray<HeapWord*> *      _cur_gc_live_oops;
  static GrowableArray<HeapWord*> *      _cur_gc_live_oops_moved_to;
  static GrowableArray<size_t>*          _cur_gc_live_oops_size;
  static GrowableArray<HeapWord*> *      _last_gc_live_oops;
  static GrowableArray<HeapWord*> *      _last_gc_live_oops_moved_to;
  static GrowableArray<size_t>*          _last_gc_live_oops_size;
#endif

 public:
  class MarkAndPushClosure: public OopClosure {
914
   private:
D
duke 已提交
915 916
    ParCompactionManager* _compaction_manager;
   public:
917 918 919
    MarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
    virtual void do_oop(oop* p);
    virtual void do_oop(narrowOop* p);
D
duke 已提交
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
    virtual const bool do_nmethods() const { return true; }
  };

  PSParallelCompact();

  // Convenient accessor for Universe::heap().
  static ParallelScavengeHeap* gc_heap() {
    return (ParallelScavengeHeap*)Universe::heap();
  }

  static void invoke(bool maximum_heap_compaction);
  static void invoke_no_policy(bool maximum_heap_compaction);

  static void post_initialize();
  // Perform initialization for PSParallelCompact that requires
  // allocations.  This should be called during the VM initialization
  // at a pointer where it would be appropriate to return a JNI_ENOMEM
  // in the event of a failure.
  static bool initialize();

  // Public accessors
  static elapsedTimer* accumulated_time() { return &_accumulated_time; }
  static unsigned int total_invocations() { return _total_invocations; }
  static CollectorCounters* counters()    { return _counters; }

  // Used to add tasks
  static GCTaskManager* const gc_task_manager();
  static klassOop updated_int_array_klass_obj() {
    return _updated_int_array_klass_obj;
  }

  // Marking support
  static inline bool mark_obj(oop obj);
953 954 955
  // Check mark and maybe push on marking stack
  template <class T> static inline void mark_and_push(ParCompactionManager* cm,
                                                      T* p);
D
duke 已提交
956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973

  // Compaction support.
  // Return true if p is in the range [beg_addr, end_addr).
  static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr);
  static inline bool is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr);

  // Convenience wrappers for per-space data kept in _space_info.
  static inline MutableSpace*     space(SpaceId space_id);
  static inline HeapWord*         new_top(SpaceId space_id);
  static inline HeapWord*         dense_prefix(SpaceId space_id);
  static inline ObjectStartArray* start_array(SpaceId space_id);

  // Return true if the klass should be updated.
  static inline bool should_update_klass(klassOop k);

  // Move and update the live objects in the specified space.
  static void move_and_update(ParCompactionManager* cm, SpaceId space_id);

974
  // Process the end of the given region range in the dense prefix.
D
duke 已提交
975
  // This includes saving any object not updated.
976 977 978 979 980 981 982 983 984
  static void dense_prefix_regions_epilogue(ParCompactionManager* cm,
                                            size_t region_start_index,
                                            size_t region_end_index,
                                            idx_t exiting_object_offset,
                                            idx_t region_offset_start,
                                            idx_t region_offset_end);

  // Update a region in the dense prefix.  For each live object
  // in the region, update it's interior references.  For each
D
duke 已提交
985
  // dead object, fill it with deadwood. Dead space at the end
986 987
  // of a region range will be filled to the start of the next
  // live object regardless of the region_index_end.  None of the
D
duke 已提交
988 989 990 991 992
  // objects in the dense prefix move and dead space is dead
  // (holds only dead objects that don't need any processing), so
  // dead space can be filled in any order.
  static void update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
                                                  SpaceId space_id,
993 994
                                                  size_t region_index_start,
                                                  size_t region_index_end);
D
duke 已提交
995 996 997 998 999

  // Return the address of the count + 1st live word in the range [beg, end).
  static HeapWord* skip_live_words(HeapWord* beg, HeapWord* end, size_t count);

  // Return the address of the word to be copied to dest_addr, which must be
1000
  // aligned to a region boundary.
D
duke 已提交
1001
  static HeapWord* first_src_addr(HeapWord* const dest_addr,
1002
                                  size_t src_region_idx);
D
duke 已提交
1003

1004 1005
  // Determine the next source region, set closure.source() to the start of the
  // new region return the region index.  Parameter end_addr is the address one
D
duke 已提交
1006 1007 1008
  // beyond the end of source range just processed.  If necessary, switch to a
  // new source space and set src_space_id (in-out parameter) and src_space_top
  // (out parameter) accordingly.
1009 1010 1011 1012
  static size_t next_src_region(MoveAndUpdateClosure& closure,
                                SpaceId& src_space_id,
                                HeapWord*& src_space_top,
                                HeapWord* end_addr);
D
duke 已提交
1013

1014 1015
  // Decrement the destination count for each non-empty source region in the
  // range [beg_region, region(region_align_up(end_addr))).
D
duke 已提交
1016
  static void decrement_destination_counts(ParCompactionManager* cm,
1017
                                           size_t beg_region,
D
duke 已提交
1018 1019
                                           HeapWord* end_addr);

1020 1021 1022 1023
  // Fill a region, copying objects from one or more source regions.
  static void fill_region(ParCompactionManager* cm, size_t region_idx);
  static void fill_and_update_region(ParCompactionManager* cm, size_t region) {
    fill_region(cm, region);
D
duke 已提交
1024 1025 1026 1027 1028 1029
  }

  // Update the deferred objects in the space.
  static void update_deferred_objects(ParCompactionManager* cm, SpaceId id);

  // Mark pointer and follow contents.
1030 1031
  template <class T>
  static inline void mark_and_follow(ParCompactionManager* cm, T* p);
D
duke 已提交
1032 1033 1034 1035

  static ParMarkBitMap* mark_bitmap() { return &_mark_bitmap; }
  static ParallelCompactData& summary_data() { return _summary_data; }

1036 1037 1038 1039 1040
  static inline void adjust_pointer(oop* p)       { adjust_pointer(p, false); }
  static inline void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); }

  template <class T>
  static inline void adjust_pointer(T* p,
D
duke 已提交
1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
                                    HeapWord* beg_addr,
                                    HeapWord* end_addr);

  // Reference Processing
  static ReferenceProcessor* const ref_processor() { return _ref_processor; }

  // Return the SpaceId for the given address.
  static SpaceId space_id(HeapWord* addr);

  // Time since last full gc (in milliseconds).
  static jlong millis_since_last_gc();

#ifdef VALIDATE_MARK_SWEEP
1054 1055
  static void track_adjusted_pointer(void* p, bool isroot);
  static void check_adjust_pointer(void* p);
D
duke 已提交
1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
  static void track_interior_pointers(oop obj);
  static void check_interior_pointers();

  static void reset_live_oop_tracking(bool at_perm);
  static void register_live_oop(oop p, size_t size);
  static void validate_live_oop(oop p, size_t size);
  static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top);
  static void compaction_complete();

  // Querying operation of RecordMarkSweepCompaction results.
  // Finds and prints the current base oop and offset for a word
  // within an oop that was live during the last GC. Helpful for
  // tracking down heap stomps.
  static void print_new_location_of_heap_address(HeapWord* q);
#endif  // #ifdef VALIDATE_MARK_SWEEP

  // Call backs for class unloading
  // Update subklass/sibling/implementor links at end of marking.
  static void revisit_weak_klass_link(ParCompactionManager* cm, Klass* k);

#ifndef PRODUCT
  // Debugging support.
  static const char* space_names[last_space_id];
1079
  static void print_region_ranges();
D
duke 已提交
1080 1081 1082 1083 1084 1085 1086
  static void print_dense_prefix_stats(const char* const algorithm,
                                       const SpaceId id,
                                       const bool maximum_compaction,
                                       HeapWord* const addr);
#endif  // #ifndef PRODUCT

#ifdef  ASSERT
1087
  // Verify that all the regions have been emptied.
D
duke 已提交
1088 1089 1090 1091
  static void verify_complete(SpaceId space_id);
#endif  // #ifdef ASSERT
};

1092
inline bool PSParallelCompact::mark_obj(oop obj) {
D
duke 已提交
1093 1094 1095 1096 1097 1098 1099 1100 1101
  const int obj_size = obj->size();
  if (mark_bitmap()->mark_obj(obj, obj_size)) {
    _summary_data.add_obj(obj, obj_size);
    return true;
  } else {
    return false;
  }
}

1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
template <class T>
inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) {
  assert(!Universe::heap()->is_in_reserved(p),
         "roots shouldn't be things within the heap");
#ifdef VALIDATE_MARK_SWEEP
  if (ValidateMarkSweep) {
    guarantee(!_root_refs_stack->contains(p), "should only be in here once");
    _root_refs_stack->push(p);
  }
#endif
  T heap_oop = oopDesc::load_heap_oop(p);
  if (!oopDesc::is_null(heap_oop)) {
    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    if (mark_bitmap()->is_unmarked(obj)) {
      if (mark_obj(obj)) {
        obj->follow_contents(cm);
      }
    }
  }
  follow_stack(cm);
}

template <class T>
inline void PSParallelCompact::mark_and_follow(ParCompactionManager* cm,
                                               T* p) {
  T heap_oop = oopDesc::load_heap_oop(p);
  if (!oopDesc::is_null(heap_oop)) {
    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    if (mark_bitmap()->is_unmarked(obj)) {
      if (mark_obj(obj)) {
        obj->follow_contents(cm);
      }
    }
  }
}

template <class T>
inline void PSParallelCompact::mark_and_push(ParCompactionManager* cm, T* p) {
  T heap_oop = oopDesc::load_heap_oop(p);
  if (!oopDesc::is_null(heap_oop)) {
    oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
    if (mark_bitmap()->is_unmarked(obj)) {
      if (mark_obj(obj)) {
        // This thread marked the object and owns the subsequent processing of it.
        cm->save_for_scanning(obj);
      }
    }
  }
}

template <class T>
inline void PSParallelCompact::adjust_pointer(T* p, bool isroot) {
  T heap_oop = oopDesc::load_heap_oop(p);
  if (!oopDesc::is_null(heap_oop)) {
    oop obj     = oopDesc::decode_heap_oop_not_null(heap_oop);
    oop new_obj = (oop)summary_data().calc_new_pointer(obj);
    assert(new_obj != NULL ||                     // is forwarding ptr?
           obj->is_shared(),                      // never forwarded?
           "should be forwarded");
    // Just always do the update unconditionally?
    if (new_obj != NULL) {
      assert(Universe::heap()->is_in_reserved(new_obj),
             "should be in object space");
      oopDesc::encode_store_heap_oop_not_null(p, new_obj);
    }
  }
  VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, isroot));
}

template <class T>
inline void PSParallelCompact::KeepAliveClosure::do_oop_work(T* p) {
#ifdef VALIDATE_MARK_SWEEP
  if (ValidateMarkSweep) {
    if (!Universe::heap()->is_in_reserved(p)) {
      _root_refs_stack->push(p);
    } else {
      _other_refs_stack->push(p);
    }
  }
#endif
  mark_and_push(_compaction_manager, p);
}

inline bool PSParallelCompact::print_phases() {
D
duke 已提交
1186 1187 1188
  return _print_phases;
}

1189
inline double PSParallelCompact::normal_distribution(double density) {
D
duke 已提交
1190 1191 1192 1193 1194 1195
  assert(_dwl_initialized, "uninitialized");
  const double squared_term = (density - _dwl_mean) / _dwl_std_dev;
  return _dwl_first_term * exp(-0.5 * squared_term * squared_term);
}

inline bool
1196
PSParallelCompact::dead_space_crosses_boundary(const RegionData* region,
D
duke 已提交
1197 1198
                                               idx_t bit)
{
1199 1200
  assert(bit > 0, "cannot call this for the first bit/region");
  assert(_summary_data.region_to_addr(region) == _mark_bitmap.bit_to_addr(bit),
D
duke 已提交
1201 1202 1203
         "sanity check");

  // Dead space crosses the boundary if (1) a partial object does not extend
1204 1205 1206
  // onto the region, (2) an object does not start at the beginning of the
  // region, and (3) an object does not end at the end of the prior region.
  return region->partial_obj_size() == 0 &&
D
duke 已提交
1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244
    !_mark_bitmap.is_obj_beg(bit) &&
    !_mark_bitmap.is_obj_end(bit - 1);
}

inline bool
PSParallelCompact::is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr) {
  return p >= beg_addr && p < end_addr;
}

inline bool
PSParallelCompact::is_in(oop* p, HeapWord* beg_addr, HeapWord* end_addr) {
  return is_in((HeapWord*)p, beg_addr, end_addr);
}

inline MutableSpace* PSParallelCompact::space(SpaceId id) {
  assert(id < last_space_id, "id out of range");
  return _space_info[id].space();
}

inline HeapWord* PSParallelCompact::new_top(SpaceId id) {
  assert(id < last_space_id, "id out of range");
  return _space_info[id].new_top();
}

inline HeapWord* PSParallelCompact::dense_prefix(SpaceId id) {
  assert(id < last_space_id, "id out of range");
  return _space_info[id].dense_prefix();
}

inline ObjectStartArray* PSParallelCompact::start_array(SpaceId id) {
  assert(id < last_space_id, "id out of range");
  return _space_info[id].start_array();
}

inline bool PSParallelCompact::should_update_klass(klassOop k) {
  return ((HeapWord*) k) >= dense_prefix(perm_space_id);
}

1245 1246
template <class T>
inline void PSParallelCompact::adjust_pointer(T* p,
D
duke 已提交
1247 1248
                                              HeapWord* beg_addr,
                                              HeapWord* end_addr) {
1249
  if (is_in((HeapWord*)p, beg_addr, end_addr)) {
D
duke 已提交
1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
    adjust_pointer(p);
  }
}

class MoveAndUpdateClosure: public ParMarkBitMapClosure {
 public:
  inline MoveAndUpdateClosure(ParMarkBitMap* bitmap, ParCompactionManager* cm,
                              ObjectStartArray* start_array,
                              HeapWord* destination, size_t words);

  // Accessors.
  HeapWord* destination() const         { return _destination; }

  // If the object will fit (size <= words_remaining()), copy it to the current
  // destination, update the interior oops and the start array and return either
  // full (if the closure is full) or incomplete.  If the object will not fit,
  // return would_overflow.
  virtual IterationStatus do_addr(HeapWord* addr, size_t size);

  // Copy enough words to fill this closure, starting at source().  Interior
  // oops and the start array are not updated.  Return full.
  IterationStatus copy_until_full();

  // Copy enough words to fill this closure or to the end of an object,
  // whichever is smaller, starting at source().  Interior oops and the start
  // array are not updated.
  void copy_partial_obj();

 protected:
  // Update variables to indicate that word_count words were processed.
  inline void update_state(size_t word_count);

 protected:
  ObjectStartArray* const _start_array;
  HeapWord*               _destination;         // Next addr to be written.
};

inline
MoveAndUpdateClosure::MoveAndUpdateClosure(ParMarkBitMap* bitmap,
                                           ParCompactionManager* cm,
                                           ObjectStartArray* start_array,
                                           HeapWord* destination,
                                           size_t words) :
  ParMarkBitMapClosure(bitmap, cm, words), _start_array(start_array)
{
  _destination = destination;
}

inline void MoveAndUpdateClosure::update_state(size_t words)
{
  decrement_words_remaining(words);
  _source += words;
  _destination += words;
}

class UpdateOnlyClosure: public ParMarkBitMapClosure {
 private:
  const PSParallelCompact::SpaceId _space_id;
  ObjectStartArray* const          _start_array;

 public:
  UpdateOnlyClosure(ParMarkBitMap* mbm,
                    ParCompactionManager* cm,
                    PSParallelCompact::SpaceId space_id);

  // Update the object.
  virtual IterationStatus do_addr(HeapWord* addr, size_t words);

  inline void do_addr(HeapWord* addr);
};

1321 1322
inline void UpdateOnlyClosure::do_addr(HeapWord* addr)
{
D
duke 已提交
1323 1324 1325 1326 1327
  _start_array->allocate_block(addr);
  oop(addr)->update_contents(compaction_manager());
}

class FillClosure: public ParMarkBitMapClosure {
1328 1329
 public:
  FillClosure(ParCompactionManager* cm, PSParallelCompact::SpaceId space_id) :
D
duke 已提交
1330 1331
    ParMarkBitMapClosure(PSParallelCompact::mark_bitmap(), cm),
    _space_id(space_id),
1332
    _start_array(PSParallelCompact::start_array(space_id)) {
D
duke 已提交
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
    assert(_space_id == PSParallelCompact::perm_space_id ||
           _space_id == PSParallelCompact::old_space_id,
           "cannot use FillClosure in the young gen");
    assert(bitmap() != NULL, "need a bitmap");
    assert(_start_array != NULL, "need a start array");
  }

  void fill_region(HeapWord* addr, size_t size) {
    MemRegion region(addr, size);
    SharedHeap::fill_region_with_object(region);
    _start_array->allocate_block(addr);
  }

  virtual IterationStatus do_addr(HeapWord* addr, size_t size) {
    fill_region(addr, size);
    return ParMarkBitMap::incomplete;
  }

private:
  const PSParallelCompact::SpaceId _space_id;
  ObjectStartArray* const          _start_array;
};