1 /* 2 * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "gc_implementation/concurrentMarkSweep/cmsLockVerifier.hpp" 27 #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp" 28 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp" 29 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp" 30 #include "gc_implementation/shared/liveRange.hpp" 31 #include "gc_implementation/shared/spaceDecorator.hpp" 32 #include "gc_interface/collectedHeap.inline.hpp" 33 #include "memory/allocation.inline.hpp" 34 #include "memory/blockOffsetTable.inline.hpp" 35 #include "memory/resourceArea.hpp" 36 #include "memory/universe.inline.hpp" 37 #include "oops/oop.inline.hpp" 38 #include "runtime/globals.hpp" 39 #include "runtime/handles.inline.hpp" 40 #include "runtime/init.hpp" 41 #include "runtime/java.hpp" 42 #include "runtime/orderAccess.inline.hpp" 43 #include "runtime/vmThread.hpp" 44 #include "utilities/copy.hpp" 45 46 ///////////////////////////////////////////////////////////////////////// 47 //// CompactibleFreeListSpace 48 ///////////////////////////////////////////////////////////////////////// 49 50 // highest ranked free list lock rank 51 int CompactibleFreeListSpace::_lockRank = Mutex::leaf + 3; 52 53 // Defaults are 0 so things will break badly if incorrectly initialized. 54 size_t CompactibleFreeListSpace::IndexSetStart = 0; 55 size_t CompactibleFreeListSpace::IndexSetStride = 0; 56 57 size_t MinChunkSize = 0; 58 59 void CompactibleFreeListSpace::set_cms_values() { 60 // Set CMS global values 61 assert(MinChunkSize == 0, "already set"); 62 63 // MinChunkSize should be a multiple of MinObjAlignment and be large enough 64 // for chunks to contain a FreeChunk. 65 size_t min_chunk_size_in_bytes = align_size_up(sizeof(FreeChunk), MinObjAlignmentInBytes); 66 MinChunkSize = min_chunk_size_in_bytes / BytesPerWord; 67 68 assert(IndexSetStart == 0 && IndexSetStride == 0, "already set"); 69 IndexSetStart = MinChunkSize; 70 IndexSetStride = MinObjAlignment; 71 } 72 73 // Constructor 74 CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs, 75 MemRegion mr, bool use_adaptive_freelists, 76 FreeBlockDictionary<FreeChunk>::DictionaryChoice dictionaryChoice) : 77 _dictionaryChoice(dictionaryChoice), 78 _adaptive_freelists(use_adaptive_freelists), 79 _bt(bs, mr), 80 // free list locks are in the range of values taken by _lockRank 81 // This range currently is [_leaf+2, _leaf+3] 82 // Note: this requires that CFLspace c'tors 83 // are called serially in the order in which the locks are 84 // are acquired in the program text. This is true today. 85 _freelistLock(_lockRank--, "CompactibleFreeListSpace._lock", true), 86 _parDictionaryAllocLock(Mutex::leaf - 1, // == rank(ExpandHeap_lock) - 1 87 "CompactibleFreeListSpace._dict_par_lock", true), 88 _rescan_task_size(CardTableModRefBS::card_size_in_words * BitsPerWord * 89 CMSRescanMultiple), 90 _marking_task_size(CardTableModRefBS::card_size_in_words * BitsPerWord * 91 CMSConcMarkMultiple), 92 _collector(NULL) 93 { 94 assert(sizeof(FreeChunk) / BytesPerWord <= MinChunkSize, 95 "FreeChunk is larger than expected"); 96 _bt.set_space(this); 97 initialize(mr, SpaceDecorator::Clear, SpaceDecorator::Mangle); 98 // We have all of "mr", all of which we place in the dictionary 99 // as one big chunk. We'll need to decide here which of several 100 // possible alternative dictionary implementations to use. For 101 // now the choice is easy, since we have only one working 102 // implementation, namely, the simple binary tree (splaying 103 // temporarily disabled). 104 switch (dictionaryChoice) { 105 case FreeBlockDictionary<FreeChunk>::dictionaryBinaryTree: 106 _dictionary = new AFLBinaryTreeDictionary(mr); 107 break; 108 case FreeBlockDictionary<FreeChunk>::dictionarySplayTree: 109 case FreeBlockDictionary<FreeChunk>::dictionarySkipList: 110 default: 111 warning("dictionaryChoice: selected option not understood; using" 112 " default BinaryTreeDictionary implementation instead."); 113 } 114 assert(_dictionary != NULL, "CMS dictionary initialization"); 115 // The indexed free lists are initially all empty and are lazily 116 // filled in on demand. Initialize the array elements to NULL. 117 initializeIndexedFreeListArray(); 118 119 // Not using adaptive free lists assumes that allocation is first 120 // from the linAB's. Also a cms perm gen which can be compacted 121 // has to have the klass's klassKlass allocated at a lower 122 // address in the heap than the klass so that the klassKlass is 123 // moved to its new location before the klass is moved. 124 // Set the _refillSize for the linear allocation blocks 125 if (!use_adaptive_freelists) { 126 FreeChunk* fc = _dictionary->get_chunk(mr.word_size(), 127 FreeBlockDictionary<FreeChunk>::atLeast); 128 // The small linAB initially has all the space and will allocate 129 // a chunk of any size. 130 HeapWord* addr = (HeapWord*) fc; 131 _smallLinearAllocBlock.set(addr, fc->size() , 132 1024*SmallForLinearAlloc, fc->size()); 133 // Note that _unallocated_block is not updated here. 134 // Allocations from the linear allocation block should 135 // update it. 136 } else { 137 _smallLinearAllocBlock.set(0, 0, 1024*SmallForLinearAlloc, 138 SmallForLinearAlloc); 139 } 140 // CMSIndexedFreeListReplenish should be at least 1 141 CMSIndexedFreeListReplenish = MAX2((uintx)1, CMSIndexedFreeListReplenish); 142 _promoInfo.setSpace(this); 143 if (UseCMSBestFit) { 144 _fitStrategy = FreeBlockBestFitFirst; 145 } else { 146 _fitStrategy = FreeBlockStrategyNone; 147 } 148 check_free_list_consistency(); 149 150 // Initialize locks for parallel case. 151 152 if (CollectedHeap::use_parallel_gc_threads()) { 153 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 154 _indexedFreeListParLocks[i] = new Mutex(Mutex::leaf - 1, // == ExpandHeap_lock - 1 155 "a freelist par lock", 156 true); 157 DEBUG_ONLY( 158 _indexedFreeList[i].set_protecting_lock(_indexedFreeListParLocks[i]); 159 ) 160 } 161 _dictionary->set_par_lock(&_parDictionaryAllocLock); 162 } 163 } 164 165 // Like CompactibleSpace forward() but always calls cross_threshold() to 166 // update the block offset table. Removed initialize_threshold call because 167 // CFLS does not use a block offset array for contiguous spaces. 168 HeapWord* CompactibleFreeListSpace::forward(oop q, size_t size, 169 CompactPoint* cp, HeapWord* compact_top) { 170 // q is alive 171 // First check if we should switch compaction space 172 assert(this == cp->space, "'this' should be current compaction space."); 173 size_t compaction_max_size = pointer_delta(end(), compact_top); 174 assert(adjustObjectSize(size) == cp->space->adjust_object_size_v(size), 175 "virtual adjustObjectSize_v() method is not correct"); 176 size_t adjusted_size = adjustObjectSize(size); 177 assert(compaction_max_size >= MinChunkSize || compaction_max_size == 0, 178 "no small fragments allowed"); 179 assert(minimum_free_block_size() == MinChunkSize, 180 "for de-virtualized reference below"); 181 // Can't leave a nonzero size, residual fragment smaller than MinChunkSize 182 if (adjusted_size + MinChunkSize > compaction_max_size && 183 adjusted_size != compaction_max_size) { 184 do { 185 // switch to next compaction space 186 cp->space->set_compaction_top(compact_top); 187 cp->space = cp->space->next_compaction_space(); 188 if (cp->space == NULL) { 189 cp->gen = GenCollectedHeap::heap()->prev_gen(cp->gen); 190 assert(cp->gen != NULL, "compaction must succeed"); 191 cp->space = cp->gen->first_compaction_space(); 192 assert(cp->space != NULL, "generation must have a first compaction space"); 193 } 194 compact_top = cp->space->bottom(); 195 cp->space->set_compaction_top(compact_top); 196 // The correct adjusted_size may not be the same as that for this method 197 // (i.e., cp->space may no longer be "this" so adjust the size again. 198 // Use the virtual method which is not used above to save the virtual 199 // dispatch. 200 adjusted_size = cp->space->adjust_object_size_v(size); 201 compaction_max_size = pointer_delta(cp->space->end(), compact_top); 202 assert(cp->space->minimum_free_block_size() == 0, "just checking"); 203 } while (adjusted_size > compaction_max_size); 204 } 205 206 // store the forwarding pointer into the mark word 207 if ((HeapWord*)q != compact_top) { 208 q->forward_to(oop(compact_top)); 209 assert(q->is_gc_marked(), "encoding the pointer should preserve the mark"); 210 } else { 211 // if the object isn't moving we can just set the mark to the default 212 // mark and handle it specially later on. 213 q->init_mark(); 214 assert(q->forwardee() == NULL, "should be forwarded to NULL"); 215 } 216 217 compact_top += adjusted_size; 218 219 // we need to update the offset table so that the beginnings of objects can be 220 // found during scavenge. Note that we are updating the offset table based on 221 // where the object will be once the compaction phase finishes. 222 223 // Always call cross_threshold(). A contiguous space can only call it when 224 // the compaction_top exceeds the current threshold but not for an 225 // non-contiguous space. 226 cp->threshold = 227 cp->space->cross_threshold(compact_top - adjusted_size, compact_top); 228 return compact_top; 229 } 230 231 // A modified copy of OffsetTableContigSpace::cross_threshold() with _offsets -> _bt 232 // and use of single_block instead of alloc_block. The name here is not really 233 // appropriate - maybe a more general name could be invented for both the 234 // contiguous and noncontiguous spaces. 235 236 HeapWord* CompactibleFreeListSpace::cross_threshold(HeapWord* start, HeapWord* the_end) { 237 _bt.single_block(start, the_end); 238 return end(); 239 } 240 241 // Initialize them to NULL. 242 void CompactibleFreeListSpace::initializeIndexedFreeListArray() { 243 for (size_t i = 0; i < IndexSetSize; i++) { 244 // Note that on platforms where objects are double word aligned, 245 // the odd array elements are not used. It is convenient, however, 246 // to map directly from the object size to the array element. 247 _indexedFreeList[i].reset(IndexSetSize); 248 _indexedFreeList[i].set_size(i); 249 assert(_indexedFreeList[i].count() == 0, "reset check failed"); 250 assert(_indexedFreeList[i].head() == NULL, "reset check failed"); 251 assert(_indexedFreeList[i].tail() == NULL, "reset check failed"); 252 assert(_indexedFreeList[i].hint() == IndexSetSize, "reset check failed"); 253 } 254 } 255 256 void CompactibleFreeListSpace::resetIndexedFreeListArray() { 257 for (size_t i = 1; i < IndexSetSize; i++) { 258 assert(_indexedFreeList[i].size() == (size_t) i, 259 "Indexed free list sizes are incorrect"); 260 _indexedFreeList[i].reset(IndexSetSize); 261 assert(_indexedFreeList[i].count() == 0, "reset check failed"); 262 assert(_indexedFreeList[i].head() == NULL, "reset check failed"); 263 assert(_indexedFreeList[i].tail() == NULL, "reset check failed"); 264 assert(_indexedFreeList[i].hint() == IndexSetSize, "reset check failed"); 265 } 266 } 267 268 void CompactibleFreeListSpace::reset(MemRegion mr) { 269 resetIndexedFreeListArray(); 270 dictionary()->reset(); 271 if (BlockOffsetArrayUseUnallocatedBlock) { 272 assert(end() == mr.end(), "We are compacting to the bottom of CMS gen"); 273 // Everything's allocated until proven otherwise. 274 _bt.set_unallocated_block(end()); 275 } 276 if (!mr.is_empty()) { 277 assert(mr.word_size() >= MinChunkSize, "Chunk size is too small"); 278 _bt.single_block(mr.start(), mr.word_size()); 279 FreeChunk* fc = (FreeChunk*) mr.start(); 280 fc->set_size(mr.word_size()); 281 if (mr.word_size() >= IndexSetSize ) { 282 returnChunkToDictionary(fc); 283 } else { 284 _bt.verify_not_unallocated((HeapWord*)fc, fc->size()); 285 _indexedFreeList[mr.word_size()].return_chunk_at_head(fc); 286 } 287 coalBirth(mr.word_size()); 288 } 289 _promoInfo.reset(); 290 _smallLinearAllocBlock._ptr = NULL; 291 _smallLinearAllocBlock._word_size = 0; 292 } 293 294 void CompactibleFreeListSpace::reset_after_compaction() { 295 // Reset the space to the new reality - one free chunk. 296 MemRegion mr(compaction_top(), end()); 297 reset(mr); 298 // Now refill the linear allocation block(s) if possible. 299 if (_adaptive_freelists) { 300 refillLinearAllocBlocksIfNeeded(); 301 } else { 302 // Place as much of mr in the linAB as we can get, 303 // provided it was big enough to go into the dictionary. 304 FreeChunk* fc = dictionary()->find_largest_dict(); 305 if (fc != NULL) { 306 assert(fc->size() == mr.word_size(), 307 "Why was the chunk broken up?"); 308 removeChunkFromDictionary(fc); 309 HeapWord* addr = (HeapWord*) fc; 310 _smallLinearAllocBlock.set(addr, fc->size() , 311 1024*SmallForLinearAlloc, fc->size()); 312 // Note that _unallocated_block is not updated here. 313 } 314 } 315 } 316 317 // Walks the entire dictionary, returning a coterminal 318 // chunk, if it exists. Use with caution since it involves 319 // a potentially complete walk of a potentially large tree. 320 FreeChunk* CompactibleFreeListSpace::find_chunk_at_end() { 321 322 assert_lock_strong(&_freelistLock); 323 324 return dictionary()->find_chunk_ends_at(end()); 325 } 326 327 328 #ifndef PRODUCT 329 void CompactibleFreeListSpace::initializeIndexedFreeListArrayReturnedBytes() { 330 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 331 _indexedFreeList[i].allocation_stats()->set_returned_bytes(0); 332 } 333 } 334 335 size_t CompactibleFreeListSpace::sumIndexedFreeListArrayReturnedBytes() { 336 size_t sum = 0; 337 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 338 sum += _indexedFreeList[i].allocation_stats()->returned_bytes(); 339 } 340 return sum; 341 } 342 343 size_t CompactibleFreeListSpace::totalCountInIndexedFreeLists() const { 344 size_t count = 0; 345 for (size_t i = IndexSetStart; i < IndexSetSize; i++) { 346 debug_only( 347 ssize_t total_list_count = 0; 348 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 349 fc = fc->next()) { 350 total_list_count++; 351 } 352 assert(total_list_count == _indexedFreeList[i].count(), 353 "Count in list is incorrect"); 354 ) 355 count += _indexedFreeList[i].count(); 356 } 357 return count; 358 } 359 360 size_t CompactibleFreeListSpace::totalCount() { 361 size_t num = totalCountInIndexedFreeLists(); 362 num += dictionary()->total_count(); 363 if (_smallLinearAllocBlock._word_size != 0) { 364 num++; 365 } 366 return num; 367 } 368 #endif 369 370 bool CompactibleFreeListSpace::is_free_block(const HeapWord* p) const { 371 FreeChunk* fc = (FreeChunk*) p; 372 return fc->is_free(); 373 } 374 375 size_t CompactibleFreeListSpace::used() const { 376 return capacity() - free(); 377 } 378 379 size_t CompactibleFreeListSpace::free() const { 380 // "MT-safe, but not MT-precise"(TM), if you will: i.e. 381 // if you do this while the structures are in flux you 382 // may get an approximate answer only; for instance 383 // because there is concurrent allocation either 384 // directly by mutators or for promotion during a GC. 385 // It's "MT-safe", however, in the sense that you are guaranteed 386 // not to crash and burn, for instance, because of walking 387 // pointers that could disappear as you were walking them. 388 // The approximation is because the various components 389 // that are read below are not read atomically (and 390 // further the computation of totalSizeInIndexedFreeLists() 391 // is itself a non-atomic computation. The normal use of 392 // this is during a resize operation at the end of GC 393 // and at that time you are guaranteed to get the 394 // correct actual value. However, for instance, this is 395 // also read completely asynchronously by the "perf-sampler" 396 // that supports jvmstat, and you are apt to see the values 397 // flicker in such cases. 398 assert(_dictionary != NULL, "No _dictionary?"); 399 return (_dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())) + 400 totalSizeInIndexedFreeLists() + 401 _smallLinearAllocBlock._word_size) * HeapWordSize; 402 } 403 404 size_t CompactibleFreeListSpace::max_alloc_in_words() const { 405 assert(_dictionary != NULL, "No _dictionary?"); 406 assert_locked(); 407 size_t res = _dictionary->max_chunk_size(); 408 res = MAX2(res, MIN2(_smallLinearAllocBlock._word_size, 409 (size_t) SmallForLinearAlloc - 1)); 410 // XXX the following could potentially be pretty slow; 411 // should one, pessimistically for the rare cases when res 412 // calculated above is less than IndexSetSize, 413 // just return res calculated above? My reasoning was that 414 // those cases will be so rare that the extra time spent doesn't 415 // really matter.... 416 // Note: do not change the loop test i >= res + IndexSetStride 417 // to i > res below, because i is unsigned and res may be zero. 418 for (size_t i = IndexSetSize - 1; i >= res + IndexSetStride; 419 i -= IndexSetStride) { 420 if (_indexedFreeList[i].head() != NULL) { 421 assert(_indexedFreeList[i].count() != 0, "Inconsistent FreeList"); 422 return i; 423 } 424 } 425 return res; 426 } 427 428 void LinearAllocBlock::print_on(outputStream* st) const { 429 st->print_cr(" LinearAllocBlock: ptr = " PTR_FORMAT ", word_size = " SIZE_FORMAT 430 ", refillsize = " SIZE_FORMAT ", allocation_size_limit = " SIZE_FORMAT, 431 p2i(_ptr), _word_size, _refillSize, _allocation_size_limit); 432 } 433 434 void CompactibleFreeListSpace::print_on(outputStream* st) const { 435 st->print_cr("COMPACTIBLE FREELIST SPACE"); 436 st->print_cr(" Space:"); 437 Space::print_on(st); 438 439 st->print_cr("promoInfo:"); 440 _promoInfo.print_on(st); 441 442 st->print_cr("_smallLinearAllocBlock"); 443 _smallLinearAllocBlock.print_on(st); 444 445 // dump_memory_block(_smallLinearAllocBlock->_ptr, 128); 446 447 st->print_cr(" _fitStrategy = %s, _adaptive_freelists = %s", 448 _fitStrategy?"true":"false", _adaptive_freelists?"true":"false"); 449 } 450 451 void CompactibleFreeListSpace::print_indexed_free_lists(outputStream* st) 452 const { 453 reportIndexedFreeListStatistics(); 454 gclog_or_tty->print_cr("Layout of Indexed Freelists"); 455 gclog_or_tty->print_cr("---------------------------"); 456 AdaptiveFreeList<FreeChunk>::print_labels_on(st, "size"); 457 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 458 _indexedFreeList[i].print_on(gclog_or_tty); 459 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 460 fc = fc->next()) { 461 gclog_or_tty->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", 462 p2i(fc), p2i((HeapWord*)fc + i), 463 fc->cantCoalesce() ? "\t CC" : ""); 464 } 465 } 466 } 467 468 void CompactibleFreeListSpace::print_promo_info_blocks(outputStream* st) 469 const { 470 _promoInfo.print_on(st); 471 } 472 473 void CompactibleFreeListSpace::print_dictionary_free_lists(outputStream* st) 474 const { 475 _dictionary->report_statistics(); 476 st->print_cr("Layout of Freelists in Tree"); 477 st->print_cr("---------------------------"); 478 _dictionary->print_free_lists(st); 479 } 480 481 class BlkPrintingClosure: public BlkClosure { 482 const CMSCollector* _collector; 483 const CompactibleFreeListSpace* _sp; 484 const CMSBitMap* _live_bit_map; 485 const bool _post_remark; 486 outputStream* _st; 487 public: 488 BlkPrintingClosure(const CMSCollector* collector, 489 const CompactibleFreeListSpace* sp, 490 const CMSBitMap* live_bit_map, 491 outputStream* st): 492 _collector(collector), 493 _sp(sp), 494 _live_bit_map(live_bit_map), 495 _post_remark(collector->abstract_state() > CMSCollector::FinalMarking), 496 _st(st) { } 497 size_t do_blk(HeapWord* addr); 498 }; 499 500 size_t BlkPrintingClosure::do_blk(HeapWord* addr) { 501 size_t sz = _sp->block_size_no_stall(addr, _collector); 502 assert(sz != 0, "Should always be able to compute a size"); 503 if (_sp->block_is_obj(addr)) { 504 const bool dead = _post_remark && !_live_bit_map->isMarked(addr); 505 _st->print_cr(PTR_FORMAT ": %s object of size " SIZE_FORMAT "%s", 506 p2i(addr), 507 dead ? "dead" : "live", 508 sz, 509 (!dead && CMSPrintObjectsInDump) ? ":" : "."); 510 if (CMSPrintObjectsInDump && !dead) { 511 oop(addr)->print_on(_st); 512 _st->print_cr("--------------------------------------"); 513 } 514 } else { // free block 515 _st->print_cr(PTR_FORMAT ": free block of size " SIZE_FORMAT "%s", 516 p2i(addr), sz, CMSPrintChunksInDump ? ":" : "."); 517 if (CMSPrintChunksInDump) { 518 ((FreeChunk*)addr)->print_on(_st); 519 _st->print_cr("--------------------------------------"); 520 } 521 } 522 return sz; 523 } 524 525 void CompactibleFreeListSpace::dump_at_safepoint_with_locks(CMSCollector* c, 526 outputStream* st) { 527 st->print_cr("\n========================="); 528 st->print_cr("Block layout in CMS Heap:"); 529 st->print_cr("========================="); 530 BlkPrintingClosure bpcl(c, this, c->markBitMap(), st); 531 blk_iterate(&bpcl); 532 533 st->print_cr("\n======================================="); 534 st->print_cr("Order & Layout of Promotion Info Blocks"); 535 st->print_cr("======================================="); 536 print_promo_info_blocks(st); 537 538 st->print_cr("\n==========================="); 539 st->print_cr("Order of Indexed Free Lists"); 540 st->print_cr("========================="); 541 print_indexed_free_lists(st); 542 543 st->print_cr("\n================================="); 544 st->print_cr("Order of Free Lists in Dictionary"); 545 st->print_cr("================================="); 546 print_dictionary_free_lists(st); 547 } 548 549 550 void CompactibleFreeListSpace::reportFreeListStatistics() const { 551 assert_lock_strong(&_freelistLock); 552 assert(PrintFLSStatistics != 0, "Reporting error"); 553 _dictionary->report_statistics(); 554 if (PrintFLSStatistics > 1) { 555 reportIndexedFreeListStatistics(); 556 size_t total_size = totalSizeInIndexedFreeLists() + 557 _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())); 558 gclog_or_tty->print(" free=" SIZE_FORMAT " frag=%1.4f\n", total_size, flsFrag()); 559 } 560 } 561 562 void CompactibleFreeListSpace::reportIndexedFreeListStatistics() const { 563 assert_lock_strong(&_freelistLock); 564 gclog_or_tty->print("Statistics for IndexedFreeLists:\n" 565 "--------------------------------\n"); 566 size_t total_size = totalSizeInIndexedFreeLists(); 567 size_t free_blocks = numFreeBlocksInIndexedFreeLists(); 568 gclog_or_tty->print("Total Free Space: " SIZE_FORMAT "\n", total_size); 569 gclog_or_tty->print("Max Chunk Size: " SIZE_FORMAT "\n", maxChunkSizeInIndexedFreeLists()); 570 gclog_or_tty->print("Number of Blocks: " SIZE_FORMAT "\n", free_blocks); 571 if (free_blocks != 0) { 572 gclog_or_tty->print("Av. Block Size: " SIZE_FORMAT "\n", total_size/free_blocks); 573 } 574 } 575 576 size_t CompactibleFreeListSpace::numFreeBlocksInIndexedFreeLists() const { 577 size_t res = 0; 578 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 579 debug_only( 580 ssize_t recount = 0; 581 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 582 fc = fc->next()) { 583 recount += 1; 584 } 585 assert(recount == _indexedFreeList[i].count(), 586 "Incorrect count in list"); 587 ) 588 res += _indexedFreeList[i].count(); 589 } 590 return res; 591 } 592 593 size_t CompactibleFreeListSpace::maxChunkSizeInIndexedFreeLists() const { 594 for (size_t i = IndexSetSize - 1; i != 0; i -= IndexSetStride) { 595 if (_indexedFreeList[i].head() != NULL) { 596 assert(_indexedFreeList[i].count() != 0, "Inconsistent FreeList"); 597 return (size_t)i; 598 } 599 } 600 return 0; 601 } 602 603 void CompactibleFreeListSpace::set_end(HeapWord* value) { 604 HeapWord* prevEnd = end(); 605 assert(prevEnd != value, "unnecessary set_end call"); 606 assert(prevEnd == NULL || !BlockOffsetArrayUseUnallocatedBlock || value >= unallocated_block(), 607 "New end is below unallocated block"); 608 _end = value; 609 if (prevEnd != NULL) { 610 // Resize the underlying block offset table. 611 _bt.resize(pointer_delta(value, bottom())); 612 if (value <= prevEnd) { 613 assert(!BlockOffsetArrayUseUnallocatedBlock || value >= unallocated_block(), 614 "New end is below unallocated block"); 615 } else { 616 // Now, take this new chunk and add it to the free blocks. 617 // Note that the BOT has not yet been updated for this block. 618 size_t newFcSize = pointer_delta(value, prevEnd); 619 // XXX This is REALLY UGLY and should be fixed up. XXX 620 if (!_adaptive_freelists && _smallLinearAllocBlock._ptr == NULL) { 621 // Mark the boundary of the new block in BOT 622 _bt.mark_block(prevEnd, value); 623 // put it all in the linAB 624 if (ParallelGCThreads == 0) { 625 _smallLinearAllocBlock._ptr = prevEnd; 626 _smallLinearAllocBlock._word_size = newFcSize; 627 repairLinearAllocBlock(&_smallLinearAllocBlock); 628 } else { // ParallelGCThreads > 0 629 MutexLockerEx x(parDictionaryAllocLock(), 630 Mutex::_no_safepoint_check_flag); 631 _smallLinearAllocBlock._ptr = prevEnd; 632 _smallLinearAllocBlock._word_size = newFcSize; 633 repairLinearAllocBlock(&_smallLinearAllocBlock); 634 } 635 // Births of chunks put into a LinAB are not recorded. Births 636 // of chunks as they are allocated out of a LinAB are. 637 } else { 638 // Add the block to the free lists, if possible coalescing it 639 // with the last free block, and update the BOT and census data. 640 addChunkToFreeListsAtEndRecordingStats(prevEnd, newFcSize); 641 } 642 } 643 } 644 } 645 646 class FreeListSpace_DCTOC : public Filtering_DCTOC { 647 CompactibleFreeListSpace* _cfls; 648 CMSCollector* _collector; 649 protected: 650 // Override. 651 #define walk_mem_region_with_cl_DECL(ClosureType) \ 652 virtual void walk_mem_region_with_cl(MemRegion mr, \ 653 HeapWord* bottom, HeapWord* top, \ 654 ClosureType* cl); \ 655 void walk_mem_region_with_cl_par(MemRegion mr, \ 656 HeapWord* bottom, HeapWord* top, \ 657 ClosureType* cl); \ 658 void walk_mem_region_with_cl_nopar(MemRegion mr, \ 659 HeapWord* bottom, HeapWord* top, \ 660 ClosureType* cl) 661 walk_mem_region_with_cl_DECL(ExtendedOopClosure); 662 walk_mem_region_with_cl_DECL(FilteringClosure); 663 664 public: 665 FreeListSpace_DCTOC(CompactibleFreeListSpace* sp, 666 CMSCollector* collector, 667 ExtendedOopClosure* cl, 668 CardTableModRefBS::PrecisionStyle precision, 669 HeapWord* boundary) : 670 Filtering_DCTOC(sp, cl, precision, boundary), 671 _cfls(sp), _collector(collector) {} 672 }; 673 674 // We de-virtualize the block-related calls below, since we know that our 675 // space is a CompactibleFreeListSpace. 676 677 #define FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(ClosureType) \ 678 void FreeListSpace_DCTOC::walk_mem_region_with_cl(MemRegion mr, \ 679 HeapWord* bottom, \ 680 HeapWord* top, \ 681 ClosureType* cl) { \ 682 bool is_par = SharedHeap::heap()->n_par_threads() > 0; \ 683 if (is_par) { \ 684 assert(SharedHeap::heap()->n_par_threads() == \ 685 SharedHeap::heap()->workers()->active_workers(), "Mismatch"); \ 686 walk_mem_region_with_cl_par(mr, bottom, top, cl); \ 687 } else { \ 688 walk_mem_region_with_cl_nopar(mr, bottom, top, cl); \ 689 } \ 690 } \ 691 void FreeListSpace_DCTOC::walk_mem_region_with_cl_par(MemRegion mr, \ 692 HeapWord* bottom, \ 693 HeapWord* top, \ 694 ClosureType* cl) { \ 695 /* Skip parts that are before "mr", in case "block_start" sent us \ 696 back too far. */ \ 697 HeapWord* mr_start = mr.start(); \ 698 size_t bot_size = _cfls->CompactibleFreeListSpace::block_size(bottom); \ 699 HeapWord* next = bottom + bot_size; \ 700 while (next < mr_start) { \ 701 bottom = next; \ 702 bot_size = _cfls->CompactibleFreeListSpace::block_size(bottom); \ 703 next = bottom + bot_size; \ 704 } \ 705 \ 706 while (bottom < top) { \ 707 if (_cfls->CompactibleFreeListSpace::block_is_obj(bottom) && \ 708 !_cfls->CompactibleFreeListSpace::obj_allocated_since_save_marks( \ 709 oop(bottom)) && \ 710 !_collector->CMSCollector::is_dead_obj(oop(bottom))) { \ 711 size_t word_sz = oop(bottom)->oop_iterate(cl, mr); \ 712 bottom += _cfls->adjustObjectSize(word_sz); \ 713 } else { \ 714 bottom += _cfls->CompactibleFreeListSpace::block_size(bottom); \ 715 } \ 716 } \ 717 } \ 718 void FreeListSpace_DCTOC::walk_mem_region_with_cl_nopar(MemRegion mr, \ 719 HeapWord* bottom, \ 720 HeapWord* top, \ 721 ClosureType* cl) { \ 722 /* Skip parts that are before "mr", in case "block_start" sent us \ 723 back too far. */ \ 724 HeapWord* mr_start = mr.start(); \ 725 size_t bot_size = _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \ 726 HeapWord* next = bottom + bot_size; \ 727 while (next < mr_start) { \ 728 bottom = next; \ 729 bot_size = _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \ 730 next = bottom + bot_size; \ 731 } \ 732 \ 733 while (bottom < top) { \ 734 if (_cfls->CompactibleFreeListSpace::block_is_obj_nopar(bottom) && \ 735 !_cfls->CompactibleFreeListSpace::obj_allocated_since_save_marks( \ 736 oop(bottom)) && \ 737 !_collector->CMSCollector::is_dead_obj(oop(bottom))) { \ 738 size_t word_sz = oop(bottom)->oop_iterate(cl, mr); \ 739 bottom += _cfls->adjustObjectSize(word_sz); \ 740 } else { \ 741 bottom += _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \ 742 } \ 743 } \ 744 } 745 746 // (There are only two of these, rather than N, because the split is due 747 // only to the introduction of the FilteringClosure, a local part of the 748 // impl of this abstraction.) 749 FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(ExtendedOopClosure) 750 FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(FilteringClosure) 751 752 DirtyCardToOopClosure* 753 CompactibleFreeListSpace::new_dcto_cl(ExtendedOopClosure* cl, 754 CardTableModRefBS::PrecisionStyle precision, 755 HeapWord* boundary) { 756 return new FreeListSpace_DCTOC(this, _collector, cl, precision, boundary); 757 } 758 759 760 // Note on locking for the space iteration functions: 761 // since the collector's iteration activities are concurrent with 762 // allocation activities by mutators, absent a suitable mutual exclusion 763 // mechanism the iterators may go awry. For instance a block being iterated 764 // may suddenly be allocated or divided up and part of it allocated and 765 // so on. 766 767 // Apply the given closure to each block in the space. 768 void CompactibleFreeListSpace::blk_iterate_careful(BlkClosureCareful* cl) { 769 assert_lock_strong(freelistLock()); 770 HeapWord *cur, *limit; 771 for (cur = bottom(), limit = end(); cur < limit; 772 cur += cl->do_blk_careful(cur)); 773 } 774 775 // Apply the given closure to each block in the space. 776 void CompactibleFreeListSpace::blk_iterate(BlkClosure* cl) { 777 assert_lock_strong(freelistLock()); 778 HeapWord *cur, *limit; 779 for (cur = bottom(), limit = end(); cur < limit; 780 cur += cl->do_blk(cur)); 781 } 782 783 // Apply the given closure to each oop in the space. 784 void CompactibleFreeListSpace::oop_iterate(ExtendedOopClosure* cl) { 785 assert_lock_strong(freelistLock()); 786 HeapWord *cur, *limit; 787 size_t curSize; 788 for (cur = bottom(), limit = end(); cur < limit; 789 cur += curSize) { 790 curSize = block_size(cur); 791 if (block_is_obj(cur)) { 792 oop(cur)->oop_iterate(cl); 793 } 794 } 795 } 796 797 // NOTE: In the following methods, in order to safely be able to 798 // apply the closure to an object, we need to be sure that the 799 // object has been initialized. We are guaranteed that an object 800 // is initialized if we are holding the Heap_lock with the 801 // world stopped. 802 void CompactibleFreeListSpace::verify_objects_initialized() const { 803 if (is_init_completed()) { 804 assert_locked_or_safepoint(Heap_lock); 805 if (Universe::is_fully_initialized()) { 806 guarantee(SafepointSynchronize::is_at_safepoint(), 807 "Required for objects to be initialized"); 808 } 809 } // else make a concession at vm start-up 810 } 811 812 // Apply the given closure to each object in the space 813 void CompactibleFreeListSpace::object_iterate(ObjectClosure* blk) { 814 assert_lock_strong(freelistLock()); 815 NOT_PRODUCT(verify_objects_initialized()); 816 HeapWord *cur, *limit; 817 size_t curSize; 818 for (cur = bottom(), limit = end(); cur < limit; 819 cur += curSize) { 820 curSize = block_size(cur); 821 if (block_is_obj(cur)) { 822 blk->do_object(oop(cur)); 823 } 824 } 825 } 826 827 // Apply the given closure to each live object in the space 828 // The usage of CompactibleFreeListSpace 829 // by the ConcurrentMarkSweepGeneration for concurrent GC's allows 830 // objects in the space with references to objects that are no longer 831 // valid. For example, an object may reference another object 832 // that has already been sweep up (collected). This method uses 833 // obj_is_alive() to determine whether it is safe to apply the closure to 834 // an object. See obj_is_alive() for details on how liveness of an 835 // object is decided. 836 837 void CompactibleFreeListSpace::safe_object_iterate(ObjectClosure* blk) { 838 assert_lock_strong(freelistLock()); 839 NOT_PRODUCT(verify_objects_initialized()); 840 HeapWord *cur, *limit; 841 size_t curSize; 842 for (cur = bottom(), limit = end(); cur < limit; 843 cur += curSize) { 844 curSize = block_size(cur); 845 if (block_is_obj(cur) && obj_is_alive(cur)) { 846 blk->do_object(oop(cur)); 847 } 848 } 849 } 850 851 void CompactibleFreeListSpace::object_iterate_mem(MemRegion mr, 852 UpwardsObjectClosure* cl) { 853 assert_locked(freelistLock()); 854 NOT_PRODUCT(verify_objects_initialized()); 855 assert(!mr.is_empty(), "Should be non-empty"); 856 // We use MemRegion(bottom(), end()) rather than used_region() below 857 // because the two are not necessarily equal for some kinds of 858 // spaces, in particular, certain kinds of free list spaces. 859 // We could use the more complicated but more precise: 860 // MemRegion(used_region().start(), round_to(used_region().end(), CardSize)) 861 // but the slight imprecision seems acceptable in the assertion check. 862 assert(MemRegion(bottom(), end()).contains(mr), 863 "Should be within used space"); 864 HeapWord* prev = cl->previous(); // max address from last time 865 if (prev >= mr.end()) { // nothing to do 866 return; 867 } 868 // This assert will not work when we go from cms space to perm 869 // space, and use same closure. Easy fix deferred for later. XXX YSR 870 // assert(prev == NULL || contains(prev), "Should be within space"); 871 872 bool last_was_obj_array = false; 873 HeapWord *blk_start_addr, *region_start_addr; 874 if (prev > mr.start()) { 875 region_start_addr = prev; 876 blk_start_addr = prev; 877 // The previous invocation may have pushed "prev" beyond the 878 // last allocated block yet there may be still be blocks 879 // in this region due to a particular coalescing policy. 880 // Relax the assertion so that the case where the unallocated 881 // block is maintained and "prev" is beyond the unallocated 882 // block does not cause the assertion to fire. 883 assert((BlockOffsetArrayUseUnallocatedBlock && 884 (!is_in(prev))) || 885 (blk_start_addr == block_start(region_start_addr)), "invariant"); 886 } else { 887 region_start_addr = mr.start(); 888 blk_start_addr = block_start(region_start_addr); 889 } 890 HeapWord* region_end_addr = mr.end(); 891 MemRegion derived_mr(region_start_addr, region_end_addr); 892 while (blk_start_addr < region_end_addr) { 893 const size_t size = block_size(blk_start_addr); 894 if (block_is_obj(blk_start_addr)) { 895 last_was_obj_array = cl->do_object_bm(oop(blk_start_addr), derived_mr); 896 } else { 897 last_was_obj_array = false; 898 } 899 blk_start_addr += size; 900 } 901 if (!last_was_obj_array) { 902 assert((bottom() <= blk_start_addr) && (blk_start_addr <= end()), 903 "Should be within (closed) used space"); 904 assert(blk_start_addr > prev, "Invariant"); 905 cl->set_previous(blk_start_addr); // min address for next time 906 } 907 } 908 909 910 // Callers of this iterator beware: The closure application should 911 // be robust in the face of uninitialized objects and should (always) 912 // return a correct size so that the next addr + size below gives us a 913 // valid block boundary. [See for instance, 914 // ScanMarkedObjectsAgainCarefullyClosure::do_object_careful() 915 // in ConcurrentMarkSweepGeneration.cpp.] 916 HeapWord* 917 CompactibleFreeListSpace::object_iterate_careful_m(MemRegion mr, 918 ObjectClosureCareful* cl) { 919 assert_lock_strong(freelistLock()); 920 // Can't use used_region() below because it may not necessarily 921 // be the same as [bottom(),end()); although we could 922 // use [used_region().start(),round_to(used_region().end(),CardSize)), 923 // that appears too cumbersome, so we just do the simpler check 924 // in the assertion below. 925 assert(!mr.is_empty() && MemRegion(bottom(),end()).contains(mr), 926 "mr should be non-empty and within used space"); 927 HeapWord *addr, *end; 928 size_t size; 929 for (addr = block_start_careful(mr.start()), end = mr.end(); 930 addr < end; addr += size) { 931 FreeChunk* fc = (FreeChunk*)addr; 932 if (fc->is_free()) { 933 // Since we hold the free list lock, which protects direct 934 // allocation in this generation by mutators, a free object 935 // will remain free throughout this iteration code. 936 size = fc->size(); 937 } else { 938 // Note that the object need not necessarily be initialized, 939 // because (for instance) the free list lock does NOT protect 940 // object initialization. The closure application below must 941 // therefore be correct in the face of uninitialized objects. 942 size = cl->do_object_careful_m(oop(addr), mr); 943 if (size == 0) { 944 // An unparsable object found. Signal early termination. 945 return addr; 946 } 947 } 948 } 949 return NULL; 950 } 951 952 953 HeapWord* CompactibleFreeListSpace::block_start_const(const void* p) const { 954 NOT_PRODUCT(verify_objects_initialized()); 955 return _bt.block_start(p); 956 } 957 958 HeapWord* CompactibleFreeListSpace::block_start_careful(const void* p) const { 959 return _bt.block_start_careful(p); 960 } 961 962 size_t CompactibleFreeListSpace::block_size(const HeapWord* p) const { 963 NOT_PRODUCT(verify_objects_initialized()); 964 // This must be volatile, or else there is a danger that the compiler 965 // will compile the code below into a sometimes-infinite loop, by keeping 966 // the value read the first time in a register. 967 while (true) { 968 // We must do this until we get a consistent view of the object. 969 if (FreeChunk::indicatesFreeChunk(p)) { 970 volatile FreeChunk* fc = (volatile FreeChunk*)p; 971 size_t res = fc->size(); 972 973 // Bugfix for systems with weak memory model (PPC64/IA64). The 974 // block's free bit was set and we have read the size of the 975 // block. Acquire and check the free bit again. If the block is 976 // still free, the read size is correct. 977 OrderAccess::acquire(); 978 979 // If the object is still a free chunk, return the size, else it 980 // has been allocated so try again. 981 if (FreeChunk::indicatesFreeChunk(p)) { 982 assert(res != 0, "Block size should not be 0"); 983 return res; 984 } 985 } else { 986 // must read from what 'p' points to in each loop. 987 Klass* k = ((volatile oopDesc*)p)->klass_or_null(); 988 if (k != NULL) { 989 assert(k->is_klass(), "Should really be klass oop."); 990 oop o = (oop)p; 991 assert(o->is_oop(true /* ignore mark word */), "Should be an oop."); 992 993 // Bugfix for systems with weak memory model (PPC64/IA64). 994 // The object o may be an array. Acquire to make sure that the array 995 // size (third word) is consistent. 996 OrderAccess::acquire(); 997 998 size_t res = o->size_given_klass(k); 999 res = adjustObjectSize(res); 1000 assert(res != 0, "Block size should not be 0"); 1001 return res; 1002 } 1003 } 1004 } 1005 } 1006 1007 // TODO: Now that is_parsable is gone, we should combine these two functions. 1008 // A variant of the above that uses the Printezis bits for 1009 // unparsable but allocated objects. This avoids any possible 1010 // stalls waiting for mutators to initialize objects, and is 1011 // thus potentially faster than the variant above. However, 1012 // this variant may return a zero size for a block that is 1013 // under mutation and for which a consistent size cannot be 1014 // inferred without stalling; see CMSCollector::block_size_if_printezis_bits(). 1015 size_t CompactibleFreeListSpace::block_size_no_stall(HeapWord* p, 1016 const CMSCollector* c) 1017 const { 1018 assert(MemRegion(bottom(), end()).contains(p), "p not in space"); 1019 // This must be volatile, or else there is a danger that the compiler 1020 // will compile the code below into a sometimes-infinite loop, by keeping 1021 // the value read the first time in a register. 1022 DEBUG_ONLY(uint loops = 0;) 1023 while (true) { 1024 // We must do this until we get a consistent view of the object. 1025 if (FreeChunk::indicatesFreeChunk(p)) { 1026 volatile FreeChunk* fc = (volatile FreeChunk*)p; 1027 size_t res = fc->size(); 1028 1029 // Bugfix for systems with weak memory model (PPC64/IA64). The 1030 // free bit of the block was set and we have read the size of 1031 // the block. Acquire and check the free bit again. If the 1032 // block is still free, the read size is correct. 1033 OrderAccess::acquire(); 1034 1035 if (FreeChunk::indicatesFreeChunk(p)) { 1036 assert(res != 0, "Block size should not be 0"); 1037 assert(loops == 0, "Should be 0"); 1038 return res; 1039 } 1040 } else { 1041 // must read from what 'p' points to in each loop. 1042 Klass* k = ((volatile oopDesc*)p)->klass_or_null(); 1043 // We trust the size of any object that has a non-NULL 1044 // klass and (for those in the perm gen) is parsable 1045 // -- irrespective of its conc_safe-ty. 1046 if (k != NULL) { 1047 assert(k->is_klass(), "Should really be klass oop."); 1048 oop o = (oop)p; 1049 assert(o->is_oop(), "Should be an oop"); 1050 1051 // Bugfix for systems with weak memory model (PPC64/IA64). 1052 // The object o may be an array. Acquire to make sure that the array 1053 // size (third word) is consistent. 1054 OrderAccess::acquire(); 1055 1056 size_t res = o->size_given_klass(k); 1057 res = adjustObjectSize(res); 1058 assert(res != 0, "Block size should not be 0"); 1059 return res; 1060 } else { 1061 // May return 0 if P-bits not present. 1062 return c->block_size_if_printezis_bits(p); 1063 } 1064 } 1065 assert(loops == 0, "Can loop at most once"); 1066 DEBUG_ONLY(loops++;) 1067 } 1068 } 1069 1070 size_t CompactibleFreeListSpace::block_size_nopar(const HeapWord* p) const { 1071 NOT_PRODUCT(verify_objects_initialized()); 1072 assert(MemRegion(bottom(), end()).contains(p), "p not in space"); 1073 FreeChunk* fc = (FreeChunk*)p; 1074 if (fc->is_free()) { 1075 return fc->size(); 1076 } else { 1077 // Ignore mark word because this may be a recently promoted 1078 // object whose mark word is used to chain together grey 1079 // objects (the last one would have a null value). 1080 assert(oop(p)->is_oop(true), "Should be an oop"); 1081 return adjustObjectSize(oop(p)->size()); 1082 } 1083 } 1084 1085 // This implementation assumes that the property of "being an object" is 1086 // stable. But being a free chunk may not be (because of parallel 1087 // promotion.) 1088 bool CompactibleFreeListSpace::block_is_obj(const HeapWord* p) const { 1089 FreeChunk* fc = (FreeChunk*)p; 1090 assert(is_in_reserved(p), "Should be in space"); 1091 // When doing a mark-sweep-compact of the CMS generation, this 1092 // assertion may fail because prepare_for_compaction() uses 1093 // space that is garbage to maintain information on ranges of 1094 // live objects so that these live ranges can be moved as a whole. 1095 // Comment out this assertion until that problem can be solved 1096 // (i.e., that the block start calculation may look at objects 1097 // at address below "p" in finding the object that contains "p" 1098 // and those objects (if garbage) may have been modified to hold 1099 // live range information. 1100 // assert(CollectedHeap::use_parallel_gc_threads() || _bt.block_start(p) == p, 1101 // "Should be a block boundary"); 1102 if (FreeChunk::indicatesFreeChunk(p)) return false; 1103 Klass* k = oop(p)->klass_or_null(); 1104 if (k != NULL) { 1105 // Ignore mark word because it may have been used to 1106 // chain together promoted objects (the last one 1107 // would have a null value). 1108 assert(oop(p)->is_oop(true), "Should be an oop"); 1109 return true; 1110 } else { 1111 return false; // Was not an object at the start of collection. 1112 } 1113 } 1114 1115 // Check if the object is alive. This fact is checked either by consulting 1116 // the main marking bitmap in the sweeping phase or, if it's a permanent 1117 // generation and we're not in the sweeping phase, by checking the 1118 // perm_gen_verify_bit_map where we store the "deadness" information if 1119 // we did not sweep the perm gen in the most recent previous GC cycle. 1120 bool CompactibleFreeListSpace::obj_is_alive(const HeapWord* p) const { 1121 assert(SafepointSynchronize::is_at_safepoint() || !is_init_completed(), 1122 "Else races are possible"); 1123 assert(block_is_obj(p), "The address should point to an object"); 1124 1125 // If we're sweeping, we use object liveness information from the main bit map 1126 // for both perm gen and old gen. 1127 // We don't need to lock the bitmap (live_map or dead_map below), because 1128 // EITHER we are in the middle of the sweeping phase, and the 1129 // main marking bit map (live_map below) is locked, 1130 // OR we're in other phases and perm_gen_verify_bit_map (dead_map below) 1131 // is stable, because it's mutated only in the sweeping phase. 1132 // NOTE: This method is also used by jmap where, if class unloading is 1133 // off, the results can return "false" for legitimate perm objects, 1134 // when we are not in the midst of a sweeping phase, which can result 1135 // in jmap not reporting certain perm gen objects. This will be moot 1136 // if/when the perm gen goes away in the future. 1137 if (_collector->abstract_state() == CMSCollector::Sweeping) { 1138 CMSBitMap* live_map = _collector->markBitMap(); 1139 return live_map->par_isMarked((HeapWord*) p); 1140 } 1141 return true; 1142 } 1143 1144 bool CompactibleFreeListSpace::block_is_obj_nopar(const HeapWord* p) const { 1145 FreeChunk* fc = (FreeChunk*)p; 1146 assert(is_in_reserved(p), "Should be in space"); 1147 assert(_bt.block_start(p) == p, "Should be a block boundary"); 1148 if (!fc->is_free()) { 1149 // Ignore mark word because it may have been used to 1150 // chain together promoted objects (the last one 1151 // would have a null value). 1152 assert(oop(p)->is_oop(true), "Should be an oop"); 1153 return true; 1154 } 1155 return false; 1156 } 1157 1158 // "MT-safe but not guaranteed MT-precise" (TM); you may get an 1159 // approximate answer if you don't hold the freelistlock when you call this. 1160 size_t CompactibleFreeListSpace::totalSizeInIndexedFreeLists() const { 1161 size_t size = 0; 1162 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 1163 debug_only( 1164 // We may be calling here without the lock in which case we 1165 // won't do this modest sanity check. 1166 if (freelistLock()->owned_by_self()) { 1167 size_t total_list_size = 0; 1168 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 1169 fc = fc->next()) { 1170 total_list_size += i; 1171 } 1172 assert(total_list_size == i * _indexedFreeList[i].count(), 1173 "Count in list is incorrect"); 1174 } 1175 ) 1176 size += i * _indexedFreeList[i].count(); 1177 } 1178 return size; 1179 } 1180 1181 HeapWord* CompactibleFreeListSpace::par_allocate(size_t size) { 1182 MutexLockerEx x(freelistLock(), Mutex::_no_safepoint_check_flag); 1183 return allocate(size); 1184 } 1185 1186 HeapWord* 1187 CompactibleFreeListSpace::getChunkFromSmallLinearAllocBlockRemainder(size_t size) { 1188 return getChunkFromLinearAllocBlockRemainder(&_smallLinearAllocBlock, size); 1189 } 1190 1191 HeapWord* CompactibleFreeListSpace::allocate(size_t size) { 1192 assert_lock_strong(freelistLock()); 1193 HeapWord* res = NULL; 1194 assert(size == adjustObjectSize(size), 1195 "use adjustObjectSize() before calling into allocate()"); 1196 1197 if (_adaptive_freelists) { 1198 res = allocate_adaptive_freelists(size); 1199 } else { // non-adaptive free lists 1200 res = allocate_non_adaptive_freelists(size); 1201 } 1202 1203 if (res != NULL) { 1204 // check that res does lie in this space! 1205 assert(is_in_reserved(res), "Not in this space!"); 1206 assert(is_aligned((void*)res), "alignment check"); 1207 1208 FreeChunk* fc = (FreeChunk*)res; 1209 fc->markNotFree(); 1210 assert(!fc->is_free(), "shouldn't be marked free"); 1211 assert(oop(fc)->klass_or_null() == NULL, "should look uninitialized"); 1212 // Verify that the block offset table shows this to 1213 // be a single block, but not one which is unallocated. 1214 _bt.verify_single_block(res, size); 1215 _bt.verify_not_unallocated(res, size); 1216 // mangle a just allocated object with a distinct pattern. 1217 debug_only(fc->mangleAllocated(size)); 1218 } 1219 1220 return res; 1221 } 1222 1223 HeapWord* CompactibleFreeListSpace::allocate_non_adaptive_freelists(size_t size) { 1224 HeapWord* res = NULL; 1225 // try and use linear allocation for smaller blocks 1226 if (size < _smallLinearAllocBlock._allocation_size_limit) { 1227 // if successful, the following also adjusts block offset table 1228 res = getChunkFromSmallLinearAllocBlock(size); 1229 } 1230 // Else triage to indexed lists for smaller sizes 1231 if (res == NULL) { 1232 if (size < SmallForDictionary) { 1233 res = (HeapWord*) getChunkFromIndexedFreeList(size); 1234 } else { 1235 // else get it from the big dictionary; if even this doesn't 1236 // work we are out of luck. 1237 res = (HeapWord*)getChunkFromDictionaryExact(size); 1238 } 1239 } 1240 1241 return res; 1242 } 1243 1244 HeapWord* CompactibleFreeListSpace::allocate_adaptive_freelists(size_t size) { 1245 assert_lock_strong(freelistLock()); 1246 HeapWord* res = NULL; 1247 assert(size == adjustObjectSize(size), 1248 "use adjustObjectSize() before calling into allocate()"); 1249 1250 // Strategy 1251 // if small 1252 // exact size from small object indexed list if small 1253 // small or large linear allocation block (linAB) as appropriate 1254 // take from lists of greater sized chunks 1255 // else 1256 // dictionary 1257 // small or large linear allocation block if it has the space 1258 // Try allocating exact size from indexTable first 1259 if (size < IndexSetSize) { 1260 res = (HeapWord*) getChunkFromIndexedFreeList(size); 1261 if(res != NULL) { 1262 assert(res != (HeapWord*)_indexedFreeList[size].head(), 1263 "Not removed from free list"); 1264 // no block offset table adjustment is necessary on blocks in 1265 // the indexed lists. 1266 1267 // Try allocating from the small LinAB 1268 } else if (size < _smallLinearAllocBlock._allocation_size_limit && 1269 (res = getChunkFromSmallLinearAllocBlock(size)) != NULL) { 1270 // if successful, the above also adjusts block offset table 1271 // Note that this call will refill the LinAB to 1272 // satisfy the request. This is different that 1273 // evm. 1274 // Don't record chunk off a LinAB? smallSplitBirth(size); 1275 } else { 1276 // Raid the exact free lists larger than size, even if they are not 1277 // overpopulated. 1278 res = (HeapWord*) getChunkFromGreater(size); 1279 } 1280 } else { 1281 // Big objects get allocated directly from the dictionary. 1282 res = (HeapWord*) getChunkFromDictionaryExact(size); 1283 if (res == NULL) { 1284 // Try hard not to fail since an allocation failure will likely 1285 // trigger a synchronous GC. Try to get the space from the 1286 // allocation blocks. 1287 res = getChunkFromSmallLinearAllocBlockRemainder(size); 1288 } 1289 } 1290 1291 return res; 1292 } 1293 1294 // A worst-case estimate of the space required (in HeapWords) to expand the heap 1295 // when promoting obj. 1296 size_t CompactibleFreeListSpace::expansionSpaceRequired(size_t obj_size) const { 1297 // Depending on the object size, expansion may require refilling either a 1298 // bigLAB or a smallLAB plus refilling a PromotionInfo object. MinChunkSize 1299 // is added because the dictionary may over-allocate to avoid fragmentation. 1300 size_t space = obj_size; 1301 if (!_adaptive_freelists) { 1302 space = MAX2(space, _smallLinearAllocBlock._refillSize); 1303 } 1304 space += _promoInfo.refillSize() + 2 * MinChunkSize; 1305 return space; 1306 } 1307 1308 FreeChunk* CompactibleFreeListSpace::getChunkFromGreater(size_t numWords) { 1309 FreeChunk* ret; 1310 1311 assert(numWords >= MinChunkSize, "Size is less than minimum"); 1312 assert(linearAllocationWouldFail() || bestFitFirst(), 1313 "Should not be here"); 1314 1315 size_t i; 1316 size_t currSize = numWords + MinChunkSize; 1317 assert(currSize % MinObjAlignment == 0, "currSize should be aligned"); 1318 for (i = currSize; i < IndexSetSize; i += IndexSetStride) { 1319 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i]; 1320 if (fl->head()) { 1321 ret = getFromListGreater(fl, numWords); 1322 assert(ret == NULL || ret->is_free(), "Should be returning a free chunk"); 1323 return ret; 1324 } 1325 } 1326 1327 currSize = MAX2((size_t)SmallForDictionary, 1328 (size_t)(numWords + MinChunkSize)); 1329 1330 /* Try to get a chunk that satisfies request, while avoiding 1331 fragmentation that can't be handled. */ 1332 { 1333 ret = dictionary()->get_chunk(currSize); 1334 if (ret != NULL) { 1335 assert(ret->size() - numWords >= MinChunkSize, 1336 "Chunk is too small"); 1337 _bt.allocated((HeapWord*)ret, ret->size()); 1338 /* Carve returned chunk. */ 1339 (void) splitChunkAndReturnRemainder(ret, numWords); 1340 /* Label this as no longer a free chunk. */ 1341 assert(ret->is_free(), "This chunk should be free"); 1342 ret->link_prev(NULL); 1343 } 1344 assert(ret == NULL || ret->is_free(), "Should be returning a free chunk"); 1345 return ret; 1346 } 1347 ShouldNotReachHere(); 1348 } 1349 1350 bool CompactibleFreeListSpace::verifyChunkInIndexedFreeLists(FreeChunk* fc) const { 1351 assert(fc->size() < IndexSetSize, "Size of chunk is too large"); 1352 return _indexedFreeList[fc->size()].verify_chunk_in_free_list(fc); 1353 } 1354 1355 bool CompactibleFreeListSpace::verify_chunk_is_linear_alloc_block(FreeChunk* fc) const { 1356 assert((_smallLinearAllocBlock._ptr != (HeapWord*)fc) || 1357 (_smallLinearAllocBlock._word_size == fc->size()), 1358 "Linear allocation block shows incorrect size"); 1359 return ((_smallLinearAllocBlock._ptr == (HeapWord*)fc) && 1360 (_smallLinearAllocBlock._word_size == fc->size())); 1361 } 1362 1363 // Check if the purported free chunk is present either as a linear 1364 // allocation block, the size-indexed table of (smaller) free blocks, 1365 // or the larger free blocks kept in the binary tree dictionary. 1366 bool CompactibleFreeListSpace::verify_chunk_in_free_list(FreeChunk* fc) const { 1367 if (verify_chunk_is_linear_alloc_block(fc)) { 1368 return true; 1369 } else if (fc->size() < IndexSetSize) { 1370 return verifyChunkInIndexedFreeLists(fc); 1371 } else { 1372 return dictionary()->verify_chunk_in_free_list(fc); 1373 } 1374 } 1375 1376 #ifndef PRODUCT 1377 void CompactibleFreeListSpace::assert_locked() const { 1378 CMSLockVerifier::assert_locked(freelistLock(), parDictionaryAllocLock()); 1379 } 1380 1381 void CompactibleFreeListSpace::assert_locked(const Mutex* lock) const { 1382 CMSLockVerifier::assert_locked(lock); 1383 } 1384 #endif 1385 1386 FreeChunk* CompactibleFreeListSpace::allocateScratch(size_t size) { 1387 // In the parallel case, the main thread holds the free list lock 1388 // on behalf the parallel threads. 1389 FreeChunk* fc; 1390 { 1391 // If GC is parallel, this might be called by several threads. 1392 // This should be rare enough that the locking overhead won't affect 1393 // the sequential code. 1394 MutexLockerEx x(parDictionaryAllocLock(), 1395 Mutex::_no_safepoint_check_flag); 1396 fc = getChunkFromDictionary(size); 1397 } 1398 if (fc != NULL) { 1399 fc->dontCoalesce(); 1400 assert(fc->is_free(), "Should be free, but not coalescable"); 1401 // Verify that the block offset table shows this to 1402 // be a single block, but not one which is unallocated. 1403 _bt.verify_single_block((HeapWord*)fc, fc->size()); 1404 _bt.verify_not_unallocated((HeapWord*)fc, fc->size()); 1405 } 1406 return fc; 1407 } 1408 1409 oop CompactibleFreeListSpace::promote(oop obj, size_t obj_size) { 1410 assert(obj_size == (size_t)obj->size(), "bad obj_size passed in"); 1411 assert_locked(); 1412 1413 // if we are tracking promotions, then first ensure space for 1414 // promotion (including spooling space for saving header if necessary). 1415 // then allocate and copy, then track promoted info if needed. 1416 // When tracking (see PromotionInfo::track()), the mark word may 1417 // be displaced and in this case restoration of the mark word 1418 // occurs in the (oop_since_save_marks_)iterate phase. 1419 if (_promoInfo.tracking() && !_promoInfo.ensure_spooling_space()) { 1420 return NULL; 1421 } 1422 // Call the allocate(size_t, bool) form directly to avoid the 1423 // additional call through the allocate(size_t) form. Having 1424 // the compile inline the call is problematic because allocate(size_t) 1425 // is a virtual method. 1426 HeapWord* res = allocate(adjustObjectSize(obj_size)); 1427 if (res != NULL) { 1428 Copy::aligned_disjoint_words((HeapWord*)obj, res, obj_size); 1429 // if we should be tracking promotions, do so. 1430 if (_promoInfo.tracking()) { 1431 _promoInfo.track((PromotedObject*)res); 1432 } 1433 } 1434 return oop(res); 1435 } 1436 1437 HeapWord* 1438 CompactibleFreeListSpace::getChunkFromSmallLinearAllocBlock(size_t size) { 1439 assert_locked(); 1440 assert(size >= MinChunkSize, "minimum chunk size"); 1441 assert(size < _smallLinearAllocBlock._allocation_size_limit, 1442 "maximum from smallLinearAllocBlock"); 1443 return getChunkFromLinearAllocBlock(&_smallLinearAllocBlock, size); 1444 } 1445 1446 HeapWord* 1447 CompactibleFreeListSpace::getChunkFromLinearAllocBlock(LinearAllocBlock *blk, 1448 size_t size) { 1449 assert_locked(); 1450 assert(size >= MinChunkSize, "too small"); 1451 HeapWord* res = NULL; 1452 // Try to do linear allocation from blk, making sure that 1453 if (blk->_word_size == 0) { 1454 // We have probably been unable to fill this either in the prologue or 1455 // when it was exhausted at the last linear allocation. Bail out until 1456 // next time. 1457 assert(blk->_ptr == NULL, "consistency check"); 1458 return NULL; 1459 } 1460 assert(blk->_word_size != 0 && blk->_ptr != NULL, "consistency check"); 1461 res = getChunkFromLinearAllocBlockRemainder(blk, size); 1462 if (res != NULL) return res; 1463 1464 // about to exhaust this linear allocation block 1465 if (blk->_word_size == size) { // exactly satisfied 1466 res = blk->_ptr; 1467 _bt.allocated(res, blk->_word_size); 1468 } else if (size + MinChunkSize <= blk->_refillSize) { 1469 size_t sz = blk->_word_size; 1470 // Update _unallocated_block if the size is such that chunk would be 1471 // returned to the indexed free list. All other chunks in the indexed 1472 // free lists are allocated from the dictionary so that _unallocated_block 1473 // has already been adjusted for them. Do it here so that the cost 1474 // for all chunks added back to the indexed free lists. 1475 if (sz < SmallForDictionary) { 1476 _bt.allocated(blk->_ptr, sz); 1477 } 1478 // Return the chunk that isn't big enough, and then refill below. 1479 addChunkToFreeLists(blk->_ptr, sz); 1480 split_birth(sz); 1481 // Don't keep statistics on adding back chunk from a LinAB. 1482 } else { 1483 // A refilled block would not satisfy the request. 1484 return NULL; 1485 } 1486 1487 blk->_ptr = NULL; blk->_word_size = 0; 1488 refillLinearAllocBlock(blk); 1489 assert(blk->_ptr == NULL || blk->_word_size >= size + MinChunkSize, 1490 "block was replenished"); 1491 if (res != NULL) { 1492 split_birth(size); 1493 repairLinearAllocBlock(blk); 1494 } else if (blk->_ptr != NULL) { 1495 res = blk->_ptr; 1496 size_t blk_size = blk->_word_size; 1497 blk->_word_size -= size; 1498 blk->_ptr += size; 1499 split_birth(size); 1500 repairLinearAllocBlock(blk); 1501 // Update BOT last so that other (parallel) GC threads see a consistent 1502 // view of the BOT and free blocks. 1503 // Above must occur before BOT is updated below. 1504 OrderAccess::storestore(); 1505 _bt.split_block(res, blk_size, size); // adjust block offset table 1506 } 1507 return res; 1508 } 1509 1510 HeapWord* CompactibleFreeListSpace::getChunkFromLinearAllocBlockRemainder( 1511 LinearAllocBlock* blk, 1512 size_t size) { 1513 assert_locked(); 1514 assert(size >= MinChunkSize, "too small"); 1515 1516 HeapWord* res = NULL; 1517 // This is the common case. Keep it simple. 1518 if (blk->_word_size >= size + MinChunkSize) { 1519 assert(blk->_ptr != NULL, "consistency check"); 1520 res = blk->_ptr; 1521 // Note that the BOT is up-to-date for the linAB before allocation. It 1522 // indicates the start of the linAB. The split_block() updates the 1523 // BOT for the linAB after the allocation (indicates the start of the 1524 // next chunk to be allocated). 1525 size_t blk_size = blk->_word_size; 1526 blk->_word_size -= size; 1527 blk->_ptr += size; 1528 split_birth(size); 1529 repairLinearAllocBlock(blk); 1530 // Update BOT last so that other (parallel) GC threads see a consistent 1531 // view of the BOT and free blocks. 1532 // Above must occur before BOT is updated below. 1533 OrderAccess::storestore(); 1534 _bt.split_block(res, blk_size, size); // adjust block offset table 1535 _bt.allocated(res, size); 1536 } 1537 return res; 1538 } 1539 1540 FreeChunk* 1541 CompactibleFreeListSpace::getChunkFromIndexedFreeList(size_t size) { 1542 assert_locked(); 1543 assert(size < SmallForDictionary, "just checking"); 1544 FreeChunk* res; 1545 res = _indexedFreeList[size].get_chunk_at_head(); 1546 if (res == NULL) { 1547 res = getChunkFromIndexedFreeListHelper(size); 1548 } 1549 _bt.verify_not_unallocated((HeapWord*) res, size); 1550 assert(res == NULL || res->size() == size, "Incorrect block size"); 1551 return res; 1552 } 1553 1554 FreeChunk* 1555 CompactibleFreeListSpace::getChunkFromIndexedFreeListHelper(size_t size, 1556 bool replenish) { 1557 assert_locked(); 1558 FreeChunk* fc = NULL; 1559 if (size < SmallForDictionary) { 1560 assert(_indexedFreeList[size].head() == NULL || 1561 _indexedFreeList[size].surplus() <= 0, 1562 "List for this size should be empty or under populated"); 1563 // Try best fit in exact lists before replenishing the list 1564 if (!bestFitFirst() || (fc = bestFitSmall(size)) == NULL) { 1565 // Replenish list. 1566 // 1567 // Things tried that failed. 1568 // Tried allocating out of the two LinAB's first before 1569 // replenishing lists. 1570 // Tried small linAB of size 256 (size in indexed list) 1571 // and replenishing indexed lists from the small linAB. 1572 // 1573 FreeChunk* newFc = NULL; 1574 const size_t replenish_size = CMSIndexedFreeListReplenish * size; 1575 if (replenish_size < SmallForDictionary) { 1576 // Do not replenish from an underpopulated size. 1577 if (_indexedFreeList[replenish_size].surplus() > 0 && 1578 _indexedFreeList[replenish_size].head() != NULL) { 1579 newFc = _indexedFreeList[replenish_size].get_chunk_at_head(); 1580 } else if (bestFitFirst()) { 1581 newFc = bestFitSmall(replenish_size); 1582 } 1583 } 1584 if (newFc == NULL && replenish_size > size) { 1585 assert(CMSIndexedFreeListReplenish > 1, "ctl pt invariant"); 1586 newFc = getChunkFromIndexedFreeListHelper(replenish_size, false); 1587 } 1588 // Note: The stats update re split-death of block obtained above 1589 // will be recorded below precisely when we know we are going to 1590 // be actually splitting it into more than one pieces below. 1591 if (newFc != NULL) { 1592 if (replenish || CMSReplenishIntermediate) { 1593 // Replenish this list and return one block to caller. 1594 size_t i; 1595 FreeChunk *curFc, *nextFc; 1596 size_t num_blk = newFc->size() / size; 1597 assert(num_blk >= 1, "Smaller than requested?"); 1598 assert(newFc->size() % size == 0, "Should be integral multiple of request"); 1599 if (num_blk > 1) { 1600 // we are sure we will be splitting the block just obtained 1601 // into multiple pieces; record the split-death of the original 1602 splitDeath(replenish_size); 1603 } 1604 // carve up and link blocks 0, ..., num_blk - 2 1605 // The last chunk is not added to the lists but is returned as the 1606 // free chunk. 1607 for (curFc = newFc, nextFc = (FreeChunk*)((HeapWord*)curFc + size), 1608 i = 0; 1609 i < (num_blk - 1); 1610 curFc = nextFc, nextFc = (FreeChunk*)((HeapWord*)nextFc + size), 1611 i++) { 1612 curFc->set_size(size); 1613 // Don't record this as a return in order to try and 1614 // determine the "returns" from a GC. 1615 _bt.verify_not_unallocated((HeapWord*) fc, size); 1616 _indexedFreeList[size].return_chunk_at_tail(curFc, false); 1617 _bt.mark_block((HeapWord*)curFc, size); 1618 split_birth(size); 1619 // Don't record the initial population of the indexed list 1620 // as a split birth. 1621 } 1622 1623 // check that the arithmetic was OK above 1624 assert((HeapWord*)nextFc == (HeapWord*)newFc + num_blk*size, 1625 "inconsistency in carving newFc"); 1626 curFc->set_size(size); 1627 _bt.mark_block((HeapWord*)curFc, size); 1628 split_birth(size); 1629 fc = curFc; 1630 } else { 1631 // Return entire block to caller 1632 fc = newFc; 1633 } 1634 } 1635 } 1636 } else { 1637 // Get a free chunk from the free chunk dictionary to be returned to 1638 // replenish the indexed free list. 1639 fc = getChunkFromDictionaryExact(size); 1640 } 1641 // assert(fc == NULL || fc->is_free(), "Should be returning a free chunk"); 1642 return fc; 1643 } 1644 1645 FreeChunk* 1646 CompactibleFreeListSpace::getChunkFromDictionary(size_t size) { 1647 assert_locked(); 1648 FreeChunk* fc = _dictionary->get_chunk(size, 1649 FreeBlockDictionary<FreeChunk>::atLeast); 1650 if (fc == NULL) { 1651 return NULL; 1652 } 1653 _bt.allocated((HeapWord*)fc, fc->size()); 1654 if (fc->size() >= size + MinChunkSize) { 1655 fc = splitChunkAndReturnRemainder(fc, size); 1656 } 1657 assert(fc->size() >= size, "chunk too small"); 1658 assert(fc->size() < size + MinChunkSize, "chunk too big"); 1659 _bt.verify_single_block((HeapWord*)fc, fc->size()); 1660 return fc; 1661 } 1662 1663 FreeChunk* 1664 CompactibleFreeListSpace::getChunkFromDictionaryExact(size_t size) { 1665 assert_locked(); 1666 FreeChunk* fc = _dictionary->get_chunk(size, 1667 FreeBlockDictionary<FreeChunk>::atLeast); 1668 if (fc == NULL) { 1669 return fc; 1670 } 1671 _bt.allocated((HeapWord*)fc, fc->size()); 1672 if (fc->size() == size) { 1673 _bt.verify_single_block((HeapWord*)fc, size); 1674 return fc; 1675 } 1676 assert(fc->size() > size, "get_chunk() guarantee"); 1677 if (fc->size() < size + MinChunkSize) { 1678 // Return the chunk to the dictionary and go get a bigger one. 1679 returnChunkToDictionary(fc); 1680 fc = _dictionary->get_chunk(size + MinChunkSize, 1681 FreeBlockDictionary<FreeChunk>::atLeast); 1682 if (fc == NULL) { 1683 return NULL; 1684 } 1685 _bt.allocated((HeapWord*)fc, fc->size()); 1686 } 1687 assert(fc->size() >= size + MinChunkSize, "tautology"); 1688 fc = splitChunkAndReturnRemainder(fc, size); 1689 assert(fc->size() == size, "chunk is wrong size"); 1690 _bt.verify_single_block((HeapWord*)fc, size); 1691 return fc; 1692 } 1693 1694 void 1695 CompactibleFreeListSpace::returnChunkToDictionary(FreeChunk* chunk) { 1696 assert_locked(); 1697 1698 size_t size = chunk->size(); 1699 _bt.verify_single_block((HeapWord*)chunk, size); 1700 // adjust _unallocated_block downward, as necessary 1701 _bt.freed((HeapWord*)chunk, size); 1702 _dictionary->return_chunk(chunk); 1703 #ifndef PRODUCT 1704 if (CMSCollector::abstract_state() != CMSCollector::Sweeping) { 1705 TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >* tc = TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::as_TreeChunk(chunk); 1706 TreeList<FreeChunk, AdaptiveFreeList<FreeChunk> >* tl = tc->list(); 1707 tl->verify_stats(); 1708 } 1709 #endif // PRODUCT 1710 } 1711 1712 void 1713 CompactibleFreeListSpace::returnChunkToFreeList(FreeChunk* fc) { 1714 assert_locked(); 1715 size_t size = fc->size(); 1716 _bt.verify_single_block((HeapWord*) fc, size); 1717 _bt.verify_not_unallocated((HeapWord*) fc, size); 1718 if (_adaptive_freelists) { 1719 _indexedFreeList[size].return_chunk_at_tail(fc); 1720 } else { 1721 _indexedFreeList[size].return_chunk_at_head(fc); 1722 } 1723 #ifndef PRODUCT 1724 if (CMSCollector::abstract_state() != CMSCollector::Sweeping) { 1725 _indexedFreeList[size].verify_stats(); 1726 } 1727 #endif // PRODUCT 1728 } 1729 1730 // Add chunk to end of last block -- if it's the largest 1731 // block -- and update BOT and census data. We would 1732 // of course have preferred to coalesce it with the 1733 // last block, but it's currently less expensive to find the 1734 // largest block than it is to find the last. 1735 void 1736 CompactibleFreeListSpace::addChunkToFreeListsAtEndRecordingStats( 1737 HeapWord* chunk, size_t size) { 1738 // check that the chunk does lie in this space! 1739 assert(chunk != NULL && is_in_reserved(chunk), "Not in this space!"); 1740 // One of the parallel gc task threads may be here 1741 // whilst others are allocating. 1742 Mutex* lock = NULL; 1743 if (ParallelGCThreads != 0) { 1744 lock = &_parDictionaryAllocLock; 1745 } 1746 FreeChunk* ec; 1747 { 1748 MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag); 1749 ec = dictionary()->find_largest_dict(); // get largest block 1750 if (ec != NULL && ec->end() == (uintptr_t*) chunk) { 1751 // It's a coterminal block - we can coalesce. 1752 size_t old_size = ec->size(); 1753 coalDeath(old_size); 1754 removeChunkFromDictionary(ec); 1755 size += old_size; 1756 } else { 1757 ec = (FreeChunk*)chunk; 1758 } 1759 } 1760 ec->set_size(size); 1761 debug_only(ec->mangleFreed(size)); 1762 if (size < SmallForDictionary && ParallelGCThreads != 0) { 1763 lock = _indexedFreeListParLocks[size]; 1764 } 1765 MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag); 1766 addChunkAndRepairOffsetTable((HeapWord*)ec, size, true); 1767 // record the birth under the lock since the recording involves 1768 // manipulation of the list on which the chunk lives and 1769 // if the chunk is allocated and is the last on the list, 1770 // the list can go away. 1771 coalBirth(size); 1772 } 1773 1774 void 1775 CompactibleFreeListSpace::addChunkToFreeLists(HeapWord* chunk, 1776 size_t size) { 1777 // check that the chunk does lie in this space! 1778 assert(chunk != NULL && is_in_reserved(chunk), "Not in this space!"); 1779 assert_locked(); 1780 _bt.verify_single_block(chunk, size); 1781 1782 FreeChunk* fc = (FreeChunk*) chunk; 1783 fc->set_size(size); 1784 debug_only(fc->mangleFreed(size)); 1785 if (size < SmallForDictionary) { 1786 returnChunkToFreeList(fc); 1787 } else { 1788 returnChunkToDictionary(fc); 1789 } 1790 } 1791 1792 void 1793 CompactibleFreeListSpace::addChunkAndRepairOffsetTable(HeapWord* chunk, 1794 size_t size, bool coalesced) { 1795 assert_locked(); 1796 assert(chunk != NULL, "null chunk"); 1797 if (coalesced) { 1798 // repair BOT 1799 _bt.single_block(chunk, size); 1800 } 1801 addChunkToFreeLists(chunk, size); 1802 } 1803 1804 // We _must_ find the purported chunk on our free lists; 1805 // we assert if we don't. 1806 void 1807 CompactibleFreeListSpace::removeFreeChunkFromFreeLists(FreeChunk* fc) { 1808 size_t size = fc->size(); 1809 assert_locked(); 1810 debug_only(verifyFreeLists()); 1811 if (size < SmallForDictionary) { 1812 removeChunkFromIndexedFreeList(fc); 1813 } else { 1814 removeChunkFromDictionary(fc); 1815 } 1816 _bt.verify_single_block((HeapWord*)fc, size); 1817 debug_only(verifyFreeLists()); 1818 } 1819 1820 void 1821 CompactibleFreeListSpace::removeChunkFromDictionary(FreeChunk* fc) { 1822 size_t size = fc->size(); 1823 assert_locked(); 1824 assert(fc != NULL, "null chunk"); 1825 _bt.verify_single_block((HeapWord*)fc, size); 1826 _dictionary->remove_chunk(fc); 1827 // adjust _unallocated_block upward, as necessary 1828 _bt.allocated((HeapWord*)fc, size); 1829 } 1830 1831 void 1832 CompactibleFreeListSpace::removeChunkFromIndexedFreeList(FreeChunk* fc) { 1833 assert_locked(); 1834 size_t size = fc->size(); 1835 _bt.verify_single_block((HeapWord*)fc, size); 1836 NOT_PRODUCT( 1837 if (FLSVerifyIndexTable) { 1838 verifyIndexedFreeList(size); 1839 } 1840 ) 1841 _indexedFreeList[size].remove_chunk(fc); 1842 NOT_PRODUCT( 1843 if (FLSVerifyIndexTable) { 1844 verifyIndexedFreeList(size); 1845 } 1846 ) 1847 } 1848 1849 FreeChunk* CompactibleFreeListSpace::bestFitSmall(size_t numWords) { 1850 /* A hint is the next larger size that has a surplus. 1851 Start search at a size large enough to guarantee that 1852 the excess is >= MIN_CHUNK. */ 1853 size_t start = align_object_size(numWords + MinChunkSize); 1854 if (start < IndexSetSize) { 1855 AdaptiveFreeList<FreeChunk>* it = _indexedFreeList; 1856 size_t hint = _indexedFreeList[start].hint(); 1857 while (hint < IndexSetSize) { 1858 assert(hint % MinObjAlignment == 0, "hint should be aligned"); 1859 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[hint]; 1860 if (fl->surplus() > 0 && fl->head() != NULL) { 1861 // Found a list with surplus, reset original hint 1862 // and split out a free chunk which is returned. 1863 _indexedFreeList[start].set_hint(hint); 1864 FreeChunk* res = getFromListGreater(fl, numWords); 1865 assert(res == NULL || res->is_free(), 1866 "Should be returning a free chunk"); 1867 return res; 1868 } 1869 hint = fl->hint(); /* keep looking */ 1870 } 1871 /* None found. */ 1872 it[start].set_hint(IndexSetSize); 1873 } 1874 return NULL; 1875 } 1876 1877 /* Requires fl->size >= numWords + MinChunkSize */ 1878 FreeChunk* CompactibleFreeListSpace::getFromListGreater(AdaptiveFreeList<FreeChunk>* fl, 1879 size_t numWords) { 1880 FreeChunk *curr = fl->head(); 1881 size_t oldNumWords = curr->size(); 1882 assert(numWords >= MinChunkSize, "Word size is too small"); 1883 assert(curr != NULL, "List is empty"); 1884 assert(oldNumWords >= numWords + MinChunkSize, 1885 "Size of chunks in the list is too small"); 1886 1887 fl->remove_chunk(curr); 1888 // recorded indirectly by splitChunkAndReturnRemainder - 1889 // smallSplit(oldNumWords, numWords); 1890 FreeChunk* new_chunk = splitChunkAndReturnRemainder(curr, numWords); 1891 // Does anything have to be done for the remainder in terms of 1892 // fixing the card table? 1893 assert(new_chunk == NULL || new_chunk->is_free(), 1894 "Should be returning a free chunk"); 1895 return new_chunk; 1896 } 1897 1898 FreeChunk* 1899 CompactibleFreeListSpace::splitChunkAndReturnRemainder(FreeChunk* chunk, 1900 size_t new_size) { 1901 assert_locked(); 1902 size_t size = chunk->size(); 1903 assert(size > new_size, "Split from a smaller block?"); 1904 assert(is_aligned(chunk), "alignment problem"); 1905 assert(size == adjustObjectSize(size), "alignment problem"); 1906 size_t rem_size = size - new_size; 1907 assert(rem_size == adjustObjectSize(rem_size), "alignment problem"); 1908 assert(rem_size >= MinChunkSize, "Free chunk smaller than minimum"); 1909 FreeChunk* ffc = (FreeChunk*)((HeapWord*)chunk + new_size); 1910 assert(is_aligned(ffc), "alignment problem"); 1911 ffc->set_size(rem_size); 1912 ffc->link_next(NULL); 1913 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 1914 // Above must occur before BOT is updated below. 1915 // adjust block offset table 1916 OrderAccess::storestore(); 1917 assert(chunk->is_free() && ffc->is_free(), "Error"); 1918 _bt.split_block((HeapWord*)chunk, chunk->size(), new_size); 1919 if (rem_size < SmallForDictionary) { 1920 bool is_par = (SharedHeap::heap()->n_par_threads() > 0); 1921 if (is_par) _indexedFreeListParLocks[rem_size]->lock(); 1922 assert(!is_par || 1923 (SharedHeap::heap()->n_par_threads() == 1924 SharedHeap::heap()->workers()->active_workers()), "Mismatch"); 1925 returnChunkToFreeList(ffc); 1926 split(size, rem_size); 1927 if (is_par) _indexedFreeListParLocks[rem_size]->unlock(); 1928 } else { 1929 returnChunkToDictionary(ffc); 1930 split(size ,rem_size); 1931 } 1932 chunk->set_size(new_size); 1933 return chunk; 1934 } 1935 1936 void 1937 CompactibleFreeListSpace::sweep_completed() { 1938 // Now that space is probably plentiful, refill linear 1939 // allocation blocks as needed. 1940 refillLinearAllocBlocksIfNeeded(); 1941 } 1942 1943 void 1944 CompactibleFreeListSpace::gc_prologue() { 1945 assert_locked(); 1946 if (PrintFLSStatistics != 0) { 1947 gclog_or_tty->print("Before GC:\n"); 1948 reportFreeListStatistics(); 1949 } 1950 refillLinearAllocBlocksIfNeeded(); 1951 } 1952 1953 void 1954 CompactibleFreeListSpace::gc_epilogue() { 1955 assert_locked(); 1956 if (PrintGCDetails && Verbose && !_adaptive_freelists) { 1957 if (_smallLinearAllocBlock._word_size == 0) 1958 warning("CompactibleFreeListSpace(epilogue):: Linear allocation failure"); 1959 } 1960 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); 1961 _promoInfo.stopTrackingPromotions(); 1962 repairLinearAllocationBlocks(); 1963 // Print Space's stats 1964 if (PrintFLSStatistics != 0) { 1965 gclog_or_tty->print("After GC:\n"); 1966 reportFreeListStatistics(); 1967 } 1968 } 1969 1970 // Iteration support, mostly delegated from a CMS generation 1971 1972 void CompactibleFreeListSpace::save_marks() { 1973 assert(Thread::current()->is_VM_thread(), 1974 "Global variable should only be set when single-threaded"); 1975 // Mark the "end" of the used space at the time of this call; 1976 // note, however, that promoted objects from this point 1977 // on are tracked in the _promoInfo below. 1978 set_saved_mark_word(unallocated_block()); 1979 #ifdef ASSERT 1980 // Check the sanity of save_marks() etc. 1981 MemRegion ur = used_region(); 1982 MemRegion urasm = used_region_at_save_marks(); 1983 assert(ur.contains(urasm), 1984 err_msg(" Error at save_marks(): [" PTR_FORMAT "," PTR_FORMAT ")" 1985 " should contain [" PTR_FORMAT "," PTR_FORMAT ")", 1986 p2i(ur.start()), p2i(ur.end()), p2i(urasm.start()), p2i(urasm.end()))); 1987 #endif 1988 // inform allocator that promotions should be tracked. 1989 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); 1990 _promoInfo.startTrackingPromotions(); 1991 } 1992 1993 bool CompactibleFreeListSpace::no_allocs_since_save_marks() { 1994 assert(_promoInfo.tracking(), "No preceding save_marks?"); 1995 assert(SharedHeap::heap()->n_par_threads() == 0, 1996 "Shouldn't be called if using parallel gc."); 1997 return _promoInfo.noPromotions(); 1998 } 1999 2000 #define CFLS_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \ 2001 \ 2002 void CompactibleFreeListSpace:: \ 2003 oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk) { \ 2004 assert(SharedHeap::heap()->n_par_threads() == 0, \ 2005 "Shouldn't be called (yet) during parallel part of gc."); \ 2006 _promoInfo.promoted_oops_iterate##nv_suffix(blk); \ 2007 /* \ 2008 * This also restores any displaced headers and removes the elements from \ 2009 * the iteration set as they are processed, so that we have a clean slate \ 2010 * at the end of the iteration. Note, thus, that if new objects are \ 2011 * promoted as a result of the iteration they are iterated over as well. \ 2012 */ \ 2013 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); \ 2014 } 2015 2016 ALL_SINCE_SAVE_MARKS_CLOSURES(CFLS_OOP_SINCE_SAVE_MARKS_DEFN) 2017 2018 bool CompactibleFreeListSpace::linearAllocationWouldFail() const { 2019 return _smallLinearAllocBlock._word_size == 0; 2020 } 2021 2022 void CompactibleFreeListSpace::repairLinearAllocationBlocks() { 2023 // Fix up linear allocation blocks to look like free blocks 2024 repairLinearAllocBlock(&_smallLinearAllocBlock); 2025 } 2026 2027 void CompactibleFreeListSpace::repairLinearAllocBlock(LinearAllocBlock* blk) { 2028 assert_locked(); 2029 if (blk->_ptr != NULL) { 2030 assert(blk->_word_size != 0 && blk->_word_size >= MinChunkSize, 2031 "Minimum block size requirement"); 2032 FreeChunk* fc = (FreeChunk*)(blk->_ptr); 2033 fc->set_size(blk->_word_size); 2034 fc->link_prev(NULL); // mark as free 2035 fc->dontCoalesce(); 2036 assert(fc->is_free(), "just marked it free"); 2037 assert(fc->cantCoalesce(), "just marked it uncoalescable"); 2038 } 2039 } 2040 2041 void CompactibleFreeListSpace::refillLinearAllocBlocksIfNeeded() { 2042 assert_locked(); 2043 if (_smallLinearAllocBlock._ptr == NULL) { 2044 assert(_smallLinearAllocBlock._word_size == 0, 2045 "Size of linAB should be zero if the ptr is NULL"); 2046 // Reset the linAB refill and allocation size limit. 2047 _smallLinearAllocBlock.set(0, 0, 1024*SmallForLinearAlloc, SmallForLinearAlloc); 2048 } 2049 refillLinearAllocBlockIfNeeded(&_smallLinearAllocBlock); 2050 } 2051 2052 void 2053 CompactibleFreeListSpace::refillLinearAllocBlockIfNeeded(LinearAllocBlock* blk) { 2054 assert_locked(); 2055 assert((blk->_ptr == NULL && blk->_word_size == 0) || 2056 (blk->_ptr != NULL && blk->_word_size >= MinChunkSize), 2057 "blk invariant"); 2058 if (blk->_ptr == NULL) { 2059 refillLinearAllocBlock(blk); 2060 } 2061 if (PrintMiscellaneous && Verbose) { 2062 if (blk->_word_size == 0) { 2063 warning("CompactibleFreeListSpace(prologue):: Linear allocation failure"); 2064 } 2065 } 2066 } 2067 2068 void 2069 CompactibleFreeListSpace::refillLinearAllocBlock(LinearAllocBlock* blk) { 2070 assert_locked(); 2071 assert(blk->_word_size == 0 && blk->_ptr == NULL, 2072 "linear allocation block should be empty"); 2073 FreeChunk* fc; 2074 if (blk->_refillSize < SmallForDictionary && 2075 (fc = getChunkFromIndexedFreeList(blk->_refillSize)) != NULL) { 2076 // A linAB's strategy might be to use small sizes to reduce 2077 // fragmentation but still get the benefits of allocation from a 2078 // linAB. 2079 } else { 2080 fc = getChunkFromDictionary(blk->_refillSize); 2081 } 2082 if (fc != NULL) { 2083 blk->_ptr = (HeapWord*)fc; 2084 blk->_word_size = fc->size(); 2085 fc->dontCoalesce(); // to prevent sweeper from sweeping us up 2086 } 2087 } 2088 2089 // Support for concurrent collection policy decisions. 2090 bool CompactibleFreeListSpace::should_concurrent_collect() const { 2091 // In the future we might want to add in fragmentation stats -- 2092 // including erosion of the "mountain" into this decision as well. 2093 return !adaptive_freelists() && linearAllocationWouldFail(); 2094 } 2095 2096 // Support for compaction 2097 2098 void CompactibleFreeListSpace::prepare_for_compaction(CompactPoint* cp) { 2099 SCAN_AND_FORWARD(cp,end,block_is_obj,block_size); 2100 // Prepare_for_compaction() uses the space between live objects 2101 // so that later phase can skip dead space quickly. So verification 2102 // of the free lists doesn't work after. 2103 } 2104 2105 #define obj_size(q) adjustObjectSize(oop(q)->size()) 2106 #define adjust_obj_size(s) adjustObjectSize(s) 2107 2108 void CompactibleFreeListSpace::adjust_pointers() { 2109 // In other versions of adjust_pointers(), a bail out 2110 // based on the amount of live data in the generation 2111 // (i.e., if 0, bail out) may be used. 2112 // Cannot test used() == 0 here because the free lists have already 2113 // been mangled by the compaction. 2114 2115 SCAN_AND_ADJUST_POINTERS(adjust_obj_size); 2116 // See note about verification in prepare_for_compaction(). 2117 } 2118 2119 void CompactibleFreeListSpace::compact() { 2120 SCAN_AND_COMPACT(obj_size); 2121 } 2122 2123 // Fragmentation metric = 1 - [sum of (fbs**2) / (sum of fbs)**2] 2124 // where fbs is free block sizes 2125 double CompactibleFreeListSpace::flsFrag() const { 2126 size_t itabFree = totalSizeInIndexedFreeLists(); 2127 double frag = 0.0; 2128 size_t i; 2129 2130 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2131 double sz = i; 2132 frag += _indexedFreeList[i].count() * (sz * sz); 2133 } 2134 2135 double totFree = itabFree + 2136 _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())); 2137 if (totFree > 0) { 2138 frag = ((frag + _dictionary->sum_of_squared_block_sizes()) / 2139 (totFree * totFree)); 2140 frag = (double)1.0 - frag; 2141 } else { 2142 assert(frag == 0.0, "Follows from totFree == 0"); 2143 } 2144 return frag; 2145 } 2146 2147 void CompactibleFreeListSpace::beginSweepFLCensus( 2148 float inter_sweep_current, 2149 float inter_sweep_estimate, 2150 float intra_sweep_estimate) { 2151 assert_locked(); 2152 size_t i; 2153 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2154 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i]; 2155 if (PrintFLSStatistics > 1) { 2156 gclog_or_tty->print("size[" SIZE_FORMAT "] : ", i); 2157 } 2158 fl->compute_desired(inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate); 2159 fl->set_coal_desired((ssize_t)((double)fl->desired() * CMSSmallCoalSurplusPercent)); 2160 fl->set_before_sweep(fl->count()); 2161 fl->set_bfr_surp(fl->surplus()); 2162 } 2163 _dictionary->begin_sweep_dict_census(CMSLargeCoalSurplusPercent, 2164 inter_sweep_current, 2165 inter_sweep_estimate, 2166 intra_sweep_estimate); 2167 } 2168 2169 void CompactibleFreeListSpace::setFLSurplus() { 2170 assert_locked(); 2171 size_t i; 2172 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2173 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2174 fl->set_surplus(fl->count() - 2175 (ssize_t)((double)fl->desired() * CMSSmallSplitSurplusPercent)); 2176 } 2177 } 2178 2179 void CompactibleFreeListSpace::setFLHints() { 2180 assert_locked(); 2181 size_t i; 2182 size_t h = IndexSetSize; 2183 for (i = IndexSetSize - 1; i != 0; i -= IndexSetStride) { 2184 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2185 fl->set_hint(h); 2186 if (fl->surplus() > 0) { 2187 h = i; 2188 } 2189 } 2190 } 2191 2192 void CompactibleFreeListSpace::clearFLCensus() { 2193 assert_locked(); 2194 size_t i; 2195 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2196 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2197 fl->set_prev_sweep(fl->count()); 2198 fl->set_coal_births(0); 2199 fl->set_coal_deaths(0); 2200 fl->set_split_births(0); 2201 fl->set_split_deaths(0); 2202 } 2203 } 2204 2205 void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) { 2206 if (PrintFLSStatistics > 0) { 2207 HeapWord* largestAddr = (HeapWord*) dictionary()->find_largest_dict(); 2208 gclog_or_tty->print_cr("CMS: Large block " PTR_FORMAT, 2209 p2i(largestAddr)); 2210 } 2211 setFLSurplus(); 2212 setFLHints(); 2213 if (PrintGC && PrintFLSCensus > 0) { 2214 printFLCensus(sweep_count); 2215 } 2216 clearFLCensus(); 2217 assert_locked(); 2218 _dictionary->end_sweep_dict_census(CMSLargeSplitSurplusPercent); 2219 } 2220 2221 bool CompactibleFreeListSpace::coalOverPopulated(size_t size) { 2222 if (size < SmallForDictionary) { 2223 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2224 return (fl->coal_desired() < 0) || 2225 ((int)fl->count() > fl->coal_desired()); 2226 } else { 2227 return dictionary()->coal_dict_over_populated(size); 2228 } 2229 } 2230 2231 void CompactibleFreeListSpace::smallCoalBirth(size_t size) { 2232 assert(size < SmallForDictionary, "Size too large for indexed list"); 2233 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2234 fl->increment_coal_births(); 2235 fl->increment_surplus(); 2236 } 2237 2238 void CompactibleFreeListSpace::smallCoalDeath(size_t size) { 2239 assert(size < SmallForDictionary, "Size too large for indexed list"); 2240 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2241 fl->increment_coal_deaths(); 2242 fl->decrement_surplus(); 2243 } 2244 2245 void CompactibleFreeListSpace::coalBirth(size_t size) { 2246 if (size < SmallForDictionary) { 2247 smallCoalBirth(size); 2248 } else { 2249 dictionary()->dict_census_update(size, 2250 false /* split */, 2251 true /* birth */); 2252 } 2253 } 2254 2255 void CompactibleFreeListSpace::coalDeath(size_t size) { 2256 if(size < SmallForDictionary) { 2257 smallCoalDeath(size); 2258 } else { 2259 dictionary()->dict_census_update(size, 2260 false /* split */, 2261 false /* birth */); 2262 } 2263 } 2264 2265 void CompactibleFreeListSpace::smallSplitBirth(size_t size) { 2266 assert(size < SmallForDictionary, "Size too large for indexed list"); 2267 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2268 fl->increment_split_births(); 2269 fl->increment_surplus(); 2270 } 2271 2272 void CompactibleFreeListSpace::smallSplitDeath(size_t size) { 2273 assert(size < SmallForDictionary, "Size too large for indexed list"); 2274 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2275 fl->increment_split_deaths(); 2276 fl->decrement_surplus(); 2277 } 2278 2279 void CompactibleFreeListSpace::split_birth(size_t size) { 2280 if (size < SmallForDictionary) { 2281 smallSplitBirth(size); 2282 } else { 2283 dictionary()->dict_census_update(size, 2284 true /* split */, 2285 true /* birth */); 2286 } 2287 } 2288 2289 void CompactibleFreeListSpace::splitDeath(size_t size) { 2290 if (size < SmallForDictionary) { 2291 smallSplitDeath(size); 2292 } else { 2293 dictionary()->dict_census_update(size, 2294 true /* split */, 2295 false /* birth */); 2296 } 2297 } 2298 2299 void CompactibleFreeListSpace::split(size_t from, size_t to1) { 2300 size_t to2 = from - to1; 2301 splitDeath(from); 2302 split_birth(to1); 2303 split_birth(to2); 2304 } 2305 2306 void CompactibleFreeListSpace::print() const { 2307 print_on(tty); 2308 } 2309 2310 void CompactibleFreeListSpace::prepare_for_verify() { 2311 assert_locked(); 2312 repairLinearAllocationBlocks(); 2313 // Verify that the SpoolBlocks look like free blocks of 2314 // appropriate sizes... To be done ... 2315 } 2316 2317 class VerifyAllBlksClosure: public BlkClosure { 2318 private: 2319 const CompactibleFreeListSpace* _sp; 2320 const MemRegion _span; 2321 HeapWord* _last_addr; 2322 size_t _last_size; 2323 bool _last_was_obj; 2324 bool _last_was_live; 2325 2326 public: 2327 VerifyAllBlksClosure(const CompactibleFreeListSpace* sp, 2328 MemRegion span) : _sp(sp), _span(span), 2329 _last_addr(NULL), _last_size(0), 2330 _last_was_obj(false), _last_was_live(false) { } 2331 2332 virtual size_t do_blk(HeapWord* addr) { 2333 size_t res; 2334 bool was_obj = false; 2335 bool was_live = false; 2336 if (_sp->block_is_obj(addr)) { 2337 was_obj = true; 2338 oop p = oop(addr); 2339 guarantee(p->is_oop(), "Should be an oop"); 2340 res = _sp->adjustObjectSize(p->size()); 2341 if (_sp->obj_is_alive(addr)) { 2342 was_live = true; 2343 p->verify(); 2344 } 2345 } else { 2346 FreeChunk* fc = (FreeChunk*)addr; 2347 res = fc->size(); 2348 if (FLSVerifyLists && !fc->cantCoalesce()) { 2349 guarantee(_sp->verify_chunk_in_free_list(fc), 2350 "Chunk should be on a free list"); 2351 } 2352 } 2353 if (res == 0) { 2354 gclog_or_tty->print_cr("Livelock: no rank reduction!"); 2355 gclog_or_tty->print_cr( 2356 " Current: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n" 2357 " Previous: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n", 2358 p2i(addr), res, was_obj ?"true":"false", was_live ?"true":"false", 2359 p2i(_last_addr), _last_size, _last_was_obj?"true":"false", _last_was_live?"true":"false"); 2360 _sp->print_on(gclog_or_tty); 2361 guarantee(false, "Seppuku!"); 2362 } 2363 _last_addr = addr; 2364 _last_size = res; 2365 _last_was_obj = was_obj; 2366 _last_was_live = was_live; 2367 return res; 2368 } 2369 }; 2370 2371 class VerifyAllOopsClosure: public OopClosure { 2372 private: 2373 const CMSCollector* _collector; 2374 const CompactibleFreeListSpace* _sp; 2375 const MemRegion _span; 2376 const bool _past_remark; 2377 const CMSBitMap* _bit_map; 2378 2379 protected: 2380 void do_oop(void* p, oop obj) { 2381 if (_span.contains(obj)) { // the interior oop points into CMS heap 2382 if (!_span.contains(p)) { // reference from outside CMS heap 2383 // Should be a valid object; the first disjunct below allows 2384 // us to sidestep an assertion in block_is_obj() that insists 2385 // that p be in _sp. Note that several generations (and spaces) 2386 // are spanned by _span (CMS heap) above. 2387 guarantee(!_sp->is_in_reserved(obj) || 2388 _sp->block_is_obj((HeapWord*)obj), 2389 "Should be an object"); 2390 guarantee(obj->is_oop(), "Should be an oop"); 2391 obj->verify(); 2392 if (_past_remark) { 2393 // Remark has been completed, the object should be marked 2394 _bit_map->isMarked((HeapWord*)obj); 2395 } 2396 } else { // reference within CMS heap 2397 if (_past_remark) { 2398 // Remark has been completed -- so the referent should have 2399 // been marked, if referring object is. 2400 if (_bit_map->isMarked(_collector->block_start(p))) { 2401 guarantee(_bit_map->isMarked((HeapWord*)obj), "Marking error?"); 2402 } 2403 } 2404 } 2405 } else if (_sp->is_in_reserved(p)) { 2406 // the reference is from FLS, and points out of FLS 2407 guarantee(obj->is_oop(), "Should be an oop"); 2408 obj->verify(); 2409 } 2410 } 2411 2412 template <class T> void do_oop_work(T* p) { 2413 T heap_oop = oopDesc::load_heap_oop(p); 2414 if (!oopDesc::is_null(heap_oop)) { 2415 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); 2416 do_oop(p, obj); 2417 } 2418 } 2419 2420 public: 2421 VerifyAllOopsClosure(const CMSCollector* collector, 2422 const CompactibleFreeListSpace* sp, MemRegion span, 2423 bool past_remark, CMSBitMap* bit_map) : 2424 _collector(collector), _sp(sp), _span(span), 2425 _past_remark(past_remark), _bit_map(bit_map) { } 2426 2427 virtual void do_oop(oop* p) { VerifyAllOopsClosure::do_oop_work(p); } 2428 virtual void do_oop(narrowOop* p) { VerifyAllOopsClosure::do_oop_work(p); } 2429 }; 2430 2431 void CompactibleFreeListSpace::verify() const { 2432 assert_lock_strong(&_freelistLock); 2433 verify_objects_initialized(); 2434 MemRegion span = _collector->_span; 2435 bool past_remark = (_collector->abstract_state() == 2436 CMSCollector::Sweeping); 2437 2438 ResourceMark rm; 2439 HandleMark hm; 2440 2441 // Check integrity of CFL data structures 2442 _promoInfo.verify(); 2443 _dictionary->verify(); 2444 if (FLSVerifyIndexTable) { 2445 verifyIndexedFreeLists(); 2446 } 2447 // Check integrity of all objects and free blocks in space 2448 { 2449 VerifyAllBlksClosure cl(this, span); 2450 ((CompactibleFreeListSpace*)this)->blk_iterate(&cl); // cast off const 2451 } 2452 // Check that all references in the heap to FLS 2453 // are to valid objects in FLS or that references in 2454 // FLS are to valid objects elsewhere in the heap 2455 if (FLSVerifyAllHeapReferences) 2456 { 2457 VerifyAllOopsClosure cl(_collector, this, span, past_remark, 2458 _collector->markBitMap()); 2459 CollectedHeap* ch = Universe::heap(); 2460 2461 // Iterate over all oops in the heap. Uses the _no_header version 2462 // since we are not interested in following the klass pointers. 2463 ch->oop_iterate_no_header(&cl); 2464 } 2465 2466 if (VerifyObjectStartArray) { 2467 // Verify the block offset table 2468 _bt.verify(); 2469 } 2470 } 2471 2472 #ifndef PRODUCT 2473 void CompactibleFreeListSpace::verifyFreeLists() const { 2474 if (FLSVerifyLists) { 2475 _dictionary->verify(); 2476 verifyIndexedFreeLists(); 2477 } else { 2478 if (FLSVerifyDictionary) { 2479 _dictionary->verify(); 2480 } 2481 if (FLSVerifyIndexTable) { 2482 verifyIndexedFreeLists(); 2483 } 2484 } 2485 } 2486 #endif 2487 2488 void CompactibleFreeListSpace::verifyIndexedFreeLists() const { 2489 size_t i = 0; 2490 for (; i < IndexSetStart; i++) { 2491 guarantee(_indexedFreeList[i].head() == NULL, "should be NULL"); 2492 } 2493 for (; i < IndexSetSize; i++) { 2494 verifyIndexedFreeList(i); 2495 } 2496 } 2497 2498 void CompactibleFreeListSpace::verifyIndexedFreeList(size_t size) const { 2499 FreeChunk* fc = _indexedFreeList[size].head(); 2500 FreeChunk* tail = _indexedFreeList[size].tail(); 2501 size_t num = _indexedFreeList[size].count(); 2502 size_t n = 0; 2503 guarantee(((size >= IndexSetStart) && (size % IndexSetStride == 0)) || fc == NULL, 2504 "Slot should have been empty"); 2505 for (; fc != NULL; fc = fc->next(), n++) { 2506 guarantee(fc->size() == size, "Size inconsistency"); 2507 guarantee(fc->is_free(), "!free?"); 2508 guarantee(fc->next() == NULL || fc->next()->prev() == fc, "Broken list"); 2509 guarantee((fc->next() == NULL) == (fc == tail), "Incorrect tail"); 2510 } 2511 guarantee(n == num, "Incorrect count"); 2512 } 2513 2514 #ifndef PRODUCT 2515 void CompactibleFreeListSpace::check_free_list_consistency() const { 2516 assert((TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size() <= IndexSetSize), 2517 "Some sizes can't be allocated without recourse to" 2518 " linear allocation buffers"); 2519 assert((TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size()*HeapWordSize == sizeof(TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >)), 2520 "else MIN_TREE_CHUNK_SIZE is wrong"); 2521 assert(IndexSetStart != 0, "IndexSetStart not initialized"); 2522 assert(IndexSetStride != 0, "IndexSetStride not initialized"); 2523 } 2524 #endif 2525 2526 void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const { 2527 assert_lock_strong(&_freelistLock); 2528 AdaptiveFreeList<FreeChunk> total; 2529 gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count); 2530 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size"); 2531 size_t total_free = 0; 2532 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2533 const AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2534 total_free += fl->count() * fl->size(); 2535 if (i % (40*IndexSetStride) == 0) { 2536 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size"); 2537 } 2538 fl->print_on(gclog_or_tty); 2539 total.set_bfr_surp( total.bfr_surp() + fl->bfr_surp() ); 2540 total.set_surplus( total.surplus() + fl->surplus() ); 2541 total.set_desired( total.desired() + fl->desired() ); 2542 total.set_prev_sweep( total.prev_sweep() + fl->prev_sweep() ); 2543 total.set_before_sweep(total.before_sweep() + fl->before_sweep()); 2544 total.set_count( total.count() + fl->count() ); 2545 total.set_coal_births( total.coal_births() + fl->coal_births() ); 2546 total.set_coal_deaths( total.coal_deaths() + fl->coal_deaths() ); 2547 total.set_split_births(total.split_births() + fl->split_births()); 2548 total.set_split_deaths(total.split_deaths() + fl->split_deaths()); 2549 } 2550 total.print_on(gclog_or_tty, "TOTAL"); 2551 gclog_or_tty->print_cr("Total free in indexed lists " 2552 SIZE_FORMAT " words", total_free); 2553 gclog_or_tty->print("growth: %8.5f deficit: %8.5f\n", 2554 (double)(total.split_births()+total.coal_births()-total.split_deaths()-total.coal_deaths())/ 2555 (total.prev_sweep() != 0 ? (double)total.prev_sweep() : 1.0), 2556 (double)(total.desired() - total.count())/(total.desired() != 0 ? (double)total.desired() : 1.0)); 2557 _dictionary->print_dict_census(); 2558 } 2559 2560 /////////////////////////////////////////////////////////////////////////// 2561 // CFLS_LAB 2562 /////////////////////////////////////////////////////////////////////////// 2563 2564 #define VECTOR_257(x) \ 2565 /* 1 2 3 4 5 6 7 8 9 1x 11 12 13 14 15 16 17 18 19 2x 21 22 23 24 25 26 27 28 29 3x 31 32 */ \ 2566 { x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2567 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2568 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2569 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2570 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2571 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2572 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2573 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2574 x } 2575 2576 // Initialize with default setting of CMSParPromoteBlocksToClaim, _not_ 2577 // OldPLABSize, whose static default is different; if overridden at the 2578 // command-line, this will get reinitialized via a call to 2579 // modify_initialization() below. 2580 AdaptiveWeightedAverage CFLS_LAB::_blocks_to_claim[] = 2581 VECTOR_257(AdaptiveWeightedAverage(OldPLABWeight, (float)CMSParPromoteBlocksToClaim)); 2582 size_t CFLS_LAB::_global_num_blocks[] = VECTOR_257(0); 2583 uint CFLS_LAB::_global_num_workers[] = VECTOR_257(0); 2584 2585 CFLS_LAB::CFLS_LAB(CompactibleFreeListSpace* cfls) : 2586 _cfls(cfls) 2587 { 2588 assert(CompactibleFreeListSpace::IndexSetSize == 257, "Modify VECTOR_257() macro above"); 2589 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2590 i < CompactibleFreeListSpace::IndexSetSize; 2591 i += CompactibleFreeListSpace::IndexSetStride) { 2592 _indexedFreeList[i].set_size(i); 2593 _num_blocks[i] = 0; 2594 } 2595 } 2596 2597 static bool _CFLS_LAB_modified = false; 2598 2599 void CFLS_LAB::modify_initialization(size_t n, unsigned wt) { 2600 assert(!_CFLS_LAB_modified, "Call only once"); 2601 _CFLS_LAB_modified = true; 2602 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2603 i < CompactibleFreeListSpace::IndexSetSize; 2604 i += CompactibleFreeListSpace::IndexSetStride) { 2605 _blocks_to_claim[i].modify(n, wt, true /* force */); 2606 } 2607 } 2608 2609 HeapWord* CFLS_LAB::alloc(size_t word_sz) { 2610 FreeChunk* res; 2611 assert(word_sz == _cfls->adjustObjectSize(word_sz), "Error"); 2612 if (word_sz >= CompactibleFreeListSpace::IndexSetSize) { 2613 // This locking manages sync with other large object allocations. 2614 MutexLockerEx x(_cfls->parDictionaryAllocLock(), 2615 Mutex::_no_safepoint_check_flag); 2616 res = _cfls->getChunkFromDictionaryExact(word_sz); 2617 if (res == NULL) return NULL; 2618 } else { 2619 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[word_sz]; 2620 if (fl->count() == 0) { 2621 // Attempt to refill this local free list. 2622 get_from_global_pool(word_sz, fl); 2623 // If it didn't work, give up. 2624 if (fl->count() == 0) return NULL; 2625 } 2626 res = fl->get_chunk_at_head(); 2627 assert(res != NULL, "Why was count non-zero?"); 2628 } 2629 res->markNotFree(); 2630 assert(!res->is_free(), "shouldn't be marked free"); 2631 assert(oop(res)->klass_or_null() == NULL, "should look uninitialized"); 2632 // mangle a just allocated object with a distinct pattern. 2633 debug_only(res->mangleAllocated(word_sz)); 2634 return (HeapWord*)res; 2635 } 2636 2637 // Get a chunk of blocks of the right size and update related 2638 // book-keeping stats 2639 void CFLS_LAB::get_from_global_pool(size_t word_sz, AdaptiveFreeList<FreeChunk>* fl) { 2640 // Get the #blocks we want to claim 2641 size_t n_blks = (size_t)_blocks_to_claim[word_sz].average(); 2642 assert(n_blks > 0, "Error"); 2643 assert(ResizePLAB || n_blks == OldPLABSize, "Error"); 2644 // In some cases, when the application has a phase change, 2645 // there may be a sudden and sharp shift in the object survival 2646 // profile, and updating the counts at the end of a scavenge 2647 // may not be quick enough, giving rise to large scavenge pauses 2648 // during these phase changes. It is beneficial to detect such 2649 // changes on-the-fly during a scavenge and avoid such a phase-change 2650 // pothole. The following code is a heuristic attempt to do that. 2651 // It is protected by a product flag until we have gained 2652 // enough experience with this heuristic and fine-tuned its behavior. 2653 // WARNING: This might increase fragmentation if we overreact to 2654 // small spikes, so some kind of historical smoothing based on 2655 // previous experience with the greater reactivity might be useful. 2656 // Lacking sufficient experience, CMSOldPLABResizeQuicker is disabled by 2657 // default. 2658 if (ResizeOldPLAB && CMSOldPLABResizeQuicker) { 2659 size_t multiple = _num_blocks[word_sz]/(CMSOldPLABToleranceFactor*CMSOldPLABNumRefills*n_blks); 2660 n_blks += CMSOldPLABReactivityFactor*multiple*n_blks; 2661 n_blks = MIN2(n_blks, CMSOldPLABMax); 2662 } 2663 assert(n_blks > 0, "Error"); 2664 _cfls->par_get_chunk_of_blocks(word_sz, n_blks, fl); 2665 // Update stats table entry for this block size 2666 _num_blocks[word_sz] += fl->count(); 2667 } 2668 2669 void CFLS_LAB::compute_desired_plab_size() { 2670 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2671 i < CompactibleFreeListSpace::IndexSetSize; 2672 i += CompactibleFreeListSpace::IndexSetStride) { 2673 assert((_global_num_workers[i] == 0) == (_global_num_blocks[i] == 0), 2674 "Counter inconsistency"); 2675 if (_global_num_workers[i] > 0) { 2676 // Need to smooth wrt historical average 2677 if (ResizeOldPLAB) { 2678 _blocks_to_claim[i].sample( 2679 MAX2((size_t)CMSOldPLABMin, 2680 MIN2((size_t)CMSOldPLABMax, 2681 _global_num_blocks[i]/(_global_num_workers[i]*CMSOldPLABNumRefills)))); 2682 } 2683 // Reset counters for next round 2684 _global_num_workers[i] = 0; 2685 _global_num_blocks[i] = 0; 2686 if (PrintOldPLAB) { 2687 gclog_or_tty->print_cr("[" SIZE_FORMAT "]: " SIZE_FORMAT, 2688 i, (size_t)_blocks_to_claim[i].average()); 2689 } 2690 } 2691 } 2692 } 2693 2694 // If this is changed in the future to allow parallel 2695 // access, one would need to take the FL locks and, 2696 // depending on how it is used, stagger access from 2697 // parallel threads to reduce contention. 2698 void CFLS_LAB::retire(int tid) { 2699 // We run this single threaded with the world stopped; 2700 // so no need for locks and such. 2701 NOT_PRODUCT(Thread* t = Thread::current();) 2702 assert(Thread::current()->is_VM_thread(), "Error"); 2703 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2704 i < CompactibleFreeListSpace::IndexSetSize; 2705 i += CompactibleFreeListSpace::IndexSetStride) { 2706 assert(_num_blocks[i] >= (size_t)_indexedFreeList[i].count(), 2707 "Can't retire more than what we obtained"); 2708 if (_num_blocks[i] > 0) { 2709 size_t num_retire = _indexedFreeList[i].count(); 2710 assert(_num_blocks[i] > num_retire, "Should have used at least one"); 2711 { 2712 // MutexLockerEx x(_cfls->_indexedFreeListParLocks[i], 2713 // Mutex::_no_safepoint_check_flag); 2714 2715 // Update globals stats for num_blocks used 2716 _global_num_blocks[i] += (_num_blocks[i] - num_retire); 2717 _global_num_workers[i]++; 2718 assert(_global_num_workers[i] <= ParallelGCThreads, "Too big"); 2719 if (num_retire > 0) { 2720 _cfls->_indexedFreeList[i].prepend(&_indexedFreeList[i]); 2721 // Reset this list. 2722 _indexedFreeList[i] = AdaptiveFreeList<FreeChunk>(); 2723 _indexedFreeList[i].set_size(i); 2724 } 2725 } 2726 if (PrintOldPLAB) { 2727 gclog_or_tty->print_cr("%d[" SIZE_FORMAT "]: " SIZE_FORMAT "/" SIZE_FORMAT "/" SIZE_FORMAT, 2728 tid, i, num_retire, _num_blocks[i], (size_t)_blocks_to_claim[i].average()); 2729 } 2730 // Reset stats for next round 2731 _num_blocks[i] = 0; 2732 } 2733 } 2734 } 2735 2736 void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl) { 2737 assert(fl->count() == 0, "Precondition."); 2738 assert(word_sz < CompactibleFreeListSpace::IndexSetSize, 2739 "Precondition"); 2740 2741 // We'll try all multiples of word_sz in the indexed set, starting with 2742 // word_sz itself and, if CMSSplitIndexedFreeListBlocks, try larger multiples, 2743 // then try getting a big chunk and splitting it. 2744 { 2745 bool found; 2746 int k; 2747 size_t cur_sz; 2748 for (k = 1, cur_sz = k * word_sz, found = false; 2749 (cur_sz < CompactibleFreeListSpace::IndexSetSize) && 2750 (CMSSplitIndexedFreeListBlocks || k <= 1); 2751 k++, cur_sz = k * word_sz) { 2752 AdaptiveFreeList<FreeChunk> fl_for_cur_sz; // Empty. 2753 fl_for_cur_sz.set_size(cur_sz); 2754 { 2755 MutexLockerEx x(_indexedFreeListParLocks[cur_sz], 2756 Mutex::_no_safepoint_check_flag); 2757 AdaptiveFreeList<FreeChunk>* gfl = &_indexedFreeList[cur_sz]; 2758 if (gfl->count() != 0) { 2759 // nn is the number of chunks of size cur_sz that 2760 // we'd need to split k-ways each, in order to create 2761 // "n" chunks of size word_sz each. 2762 const size_t nn = MAX2(n/k, (size_t)1); 2763 gfl->getFirstNChunksFromList(nn, &fl_for_cur_sz); 2764 found = true; 2765 if (k > 1) { 2766 // Update split death stats for the cur_sz-size blocks list: 2767 // we increment the split death count by the number of blocks 2768 // we just took from the cur_sz-size blocks list and which 2769 // we will be splitting below. 2770 ssize_t deaths = gfl->split_deaths() + 2771 fl_for_cur_sz.count(); 2772 gfl->set_split_deaths(deaths); 2773 } 2774 } 2775 } 2776 // Now transfer fl_for_cur_sz to fl. Common case, we hope, is k = 1. 2777 if (found) { 2778 if (k == 1) { 2779 fl->prepend(&fl_for_cur_sz); 2780 } else { 2781 // Divide each block on fl_for_cur_sz up k ways. 2782 FreeChunk* fc; 2783 while ((fc = fl_for_cur_sz.get_chunk_at_head()) != NULL) { 2784 // Must do this in reverse order, so that anybody attempting to 2785 // access the main chunk sees it as a single free block until we 2786 // change it. 2787 size_t fc_size = fc->size(); 2788 assert(fc->is_free(), "Error"); 2789 for (int i = k-1; i >= 0; i--) { 2790 FreeChunk* ffc = (FreeChunk*)((HeapWord*)fc + i * word_sz); 2791 assert((i != 0) || 2792 ((fc == ffc) && ffc->is_free() && 2793 (ffc->size() == k*word_sz) && (fc_size == word_sz)), 2794 "Counting error"); 2795 ffc->set_size(word_sz); 2796 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 2797 ffc->link_next(NULL); 2798 // Above must occur before BOT is updated below. 2799 OrderAccess::storestore(); 2800 // splitting from the right, fc_size == i * word_sz 2801 _bt.mark_block((HeapWord*)ffc, word_sz, true /* reducing */); 2802 fc_size -= word_sz; 2803 assert(fc_size == i*word_sz, "Error"); 2804 _bt.verify_not_unallocated((HeapWord*)ffc, word_sz); 2805 _bt.verify_single_block((HeapWord*)fc, fc_size); 2806 _bt.verify_single_block((HeapWord*)ffc, word_sz); 2807 // Push this on "fl". 2808 fl->return_chunk_at_head(ffc); 2809 } 2810 // TRAP 2811 assert(fl->tail()->next() == NULL, "List invariant."); 2812 } 2813 } 2814 // Update birth stats for this block size. 2815 size_t num = fl->count(); 2816 MutexLockerEx x(_indexedFreeListParLocks[word_sz], 2817 Mutex::_no_safepoint_check_flag); 2818 ssize_t births = _indexedFreeList[word_sz].split_births() + num; 2819 _indexedFreeList[word_sz].set_split_births(births); 2820 return; 2821 } 2822 } 2823 } 2824 // Otherwise, we'll split a block from the dictionary. 2825 FreeChunk* fc = NULL; 2826 FreeChunk* rem_fc = NULL; 2827 size_t rem; 2828 { 2829 MutexLockerEx x(parDictionaryAllocLock(), 2830 Mutex::_no_safepoint_check_flag); 2831 while (n > 0) { 2832 fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()), 2833 FreeBlockDictionary<FreeChunk>::atLeast); 2834 if (fc != NULL) { 2835 _bt.allocated((HeapWord*)fc, fc->size(), true /* reducing */); // update _unallocated_blk 2836 dictionary()->dict_census_update(fc->size(), 2837 true /*split*/, 2838 false /*birth*/); 2839 break; 2840 } else { 2841 n--; 2842 } 2843 } 2844 if (fc == NULL) return; 2845 // Otherwise, split up that block. 2846 assert((ssize_t)n >= 1, "Control point invariant"); 2847 assert(fc->is_free(), "Error: should be a free block"); 2848 _bt.verify_single_block((HeapWord*)fc, fc->size()); 2849 const size_t nn = fc->size() / word_sz; 2850 n = MIN2(nn, n); 2851 assert((ssize_t)n >= 1, "Control point invariant"); 2852 rem = fc->size() - n * word_sz; 2853 // If there is a remainder, and it's too small, allocate one fewer. 2854 if (rem > 0 && rem < MinChunkSize) { 2855 n--; rem += word_sz; 2856 } 2857 // Note that at this point we may have n == 0. 2858 assert((ssize_t)n >= 0, "Control point invariant"); 2859 2860 // If n is 0, the chunk fc that was found is not large 2861 // enough to leave a viable remainder. We are unable to 2862 // allocate even one block. Return fc to the 2863 // dictionary and return, leaving "fl" empty. 2864 if (n == 0) { 2865 returnChunkToDictionary(fc); 2866 assert(fl->count() == 0, "We never allocated any blocks"); 2867 return; 2868 } 2869 2870 // First return the remainder, if any. 2871 // Note that we hold the lock until we decide if we're going to give 2872 // back the remainder to the dictionary, since a concurrent allocation 2873 // may otherwise see the heap as empty. (We're willing to take that 2874 // hit if the block is a small block.) 2875 if (rem > 0) { 2876 size_t prefix_size = n * word_sz; 2877 rem_fc = (FreeChunk*)((HeapWord*)fc + prefix_size); 2878 rem_fc->set_size(rem); 2879 rem_fc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 2880 rem_fc->link_next(NULL); 2881 // Above must occur before BOT is updated below. 2882 assert((ssize_t)n > 0 && prefix_size > 0 && rem_fc > fc, "Error"); 2883 OrderAccess::storestore(); 2884 _bt.split_block((HeapWord*)fc, fc->size(), prefix_size); 2885 assert(fc->is_free(), "Error"); 2886 fc->set_size(prefix_size); 2887 if (rem >= IndexSetSize) { 2888 returnChunkToDictionary(rem_fc); 2889 dictionary()->dict_census_update(rem, true /*split*/, true /*birth*/); 2890 rem_fc = NULL; 2891 } 2892 // Otherwise, return it to the small list below. 2893 } 2894 } 2895 if (rem_fc != NULL) { 2896 MutexLockerEx x(_indexedFreeListParLocks[rem], 2897 Mutex::_no_safepoint_check_flag); 2898 _bt.verify_not_unallocated((HeapWord*)rem_fc, rem_fc->size()); 2899 _indexedFreeList[rem].return_chunk_at_head(rem_fc); 2900 smallSplitBirth(rem); 2901 } 2902 assert((ssize_t)n > 0 && fc != NULL, "Consistency"); 2903 // Now do the splitting up. 2904 // Must do this in reverse order, so that anybody attempting to 2905 // access the main chunk sees it as a single free block until we 2906 // change it. 2907 size_t fc_size = n * word_sz; 2908 // All but first chunk in this loop 2909 for (ssize_t i = n-1; i > 0; i--) { 2910 FreeChunk* ffc = (FreeChunk*)((HeapWord*)fc + i * word_sz); 2911 ffc->set_size(word_sz); 2912 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 2913 ffc->link_next(NULL); 2914 // Above must occur before BOT is updated below. 2915 OrderAccess::storestore(); 2916 // splitting from the right, fc_size == (n - i + 1) * wordsize 2917 _bt.mark_block((HeapWord*)ffc, word_sz, true /* reducing */); 2918 fc_size -= word_sz; 2919 _bt.verify_not_unallocated((HeapWord*)ffc, ffc->size()); 2920 _bt.verify_single_block((HeapWord*)ffc, ffc->size()); 2921 _bt.verify_single_block((HeapWord*)fc, fc_size); 2922 // Push this on "fl". 2923 fl->return_chunk_at_head(ffc); 2924 } 2925 // First chunk 2926 assert(fc->is_free() && fc->size() == n*word_sz, "Error: should still be a free block"); 2927 // The blocks above should show their new sizes before the first block below 2928 fc->set_size(word_sz); 2929 fc->link_prev(NULL); // idempotent wrt free-ness, see assert above 2930 fc->link_next(NULL); 2931 _bt.verify_not_unallocated((HeapWord*)fc, fc->size()); 2932 _bt.verify_single_block((HeapWord*)fc, fc->size()); 2933 fl->return_chunk_at_head(fc); 2934 2935 assert((ssize_t)n > 0 && (ssize_t)n == fl->count(), "Incorrect number of blocks"); 2936 { 2937 // Update the stats for this block size. 2938 MutexLockerEx x(_indexedFreeListParLocks[word_sz], 2939 Mutex::_no_safepoint_check_flag); 2940 const ssize_t births = _indexedFreeList[word_sz].split_births() + n; 2941 _indexedFreeList[word_sz].set_split_births(births); 2942 // ssize_t new_surplus = _indexedFreeList[word_sz].surplus() + n; 2943 // _indexedFreeList[word_sz].set_surplus(new_surplus); 2944 } 2945 2946 // TRAP 2947 assert(fl->tail()->next() == NULL, "List invariant."); 2948 } 2949 2950 // Set up the space's par_seq_tasks structure for work claiming 2951 // for parallel rescan. See CMSParRemarkTask where this is currently used. 2952 // XXX Need to suitably abstract and generalize this and the next 2953 // method into one. 2954 void 2955 CompactibleFreeListSpace:: 2956 initialize_sequential_subtasks_for_rescan(int n_threads) { 2957 // The "size" of each task is fixed according to rescan_task_size. 2958 assert(n_threads > 0, "Unexpected n_threads argument"); 2959 const size_t task_size = rescan_task_size(); 2960 size_t n_tasks = (used_region().word_size() + task_size - 1)/task_size; 2961 assert((n_tasks == 0) == used_region().is_empty(), "n_tasks incorrect"); 2962 assert(n_tasks == 0 || 2963 ((used_region().start() + (n_tasks - 1)*task_size < used_region().end()) && 2964 (used_region().start() + n_tasks*task_size >= used_region().end())), 2965 "n_tasks calculation incorrect"); 2966 SequentialSubTasksDone* pst = conc_par_seq_tasks(); 2967 assert(!pst->valid(), "Clobbering existing data?"); 2968 // Sets the condition for completion of the subtask (how many threads 2969 // need to finish in order to be done). 2970 pst->set_n_threads(n_threads); 2971 pst->set_n_tasks((int)n_tasks); 2972 } 2973 2974 // Set up the space's par_seq_tasks structure for work claiming 2975 // for parallel concurrent marking. See CMSConcMarkTask where this is currently used. 2976 void 2977 CompactibleFreeListSpace:: 2978 initialize_sequential_subtasks_for_marking(int n_threads, 2979 HeapWord* low) { 2980 // The "size" of each task is fixed according to rescan_task_size. 2981 assert(n_threads > 0, "Unexpected n_threads argument"); 2982 const size_t task_size = marking_task_size(); 2983 assert(task_size > CardTableModRefBS::card_size_in_words && 2984 (task_size % CardTableModRefBS::card_size_in_words == 0), 2985 "Otherwise arithmetic below would be incorrect"); 2986 MemRegion span = _gen->reserved(); 2987 if (low != NULL) { 2988 if (span.contains(low)) { 2989 // Align low down to a card boundary so that 2990 // we can use block_offset_careful() on span boundaries. 2991 HeapWord* aligned_low = (HeapWord*)align_size_down((uintptr_t)low, 2992 CardTableModRefBS::card_size); 2993 // Clip span prefix at aligned_low 2994 span = span.intersection(MemRegion(aligned_low, span.end())); 2995 } else if (low > span.end()) { 2996 span = MemRegion(low, low); // Null region 2997 } // else use entire span 2998 } 2999 assert(span.is_empty() || 3000 ((uintptr_t)span.start() % CardTableModRefBS::card_size == 0), 3001 "span should start at a card boundary"); 3002 size_t n_tasks = (span.word_size() + task_size - 1)/task_size; 3003 assert((n_tasks == 0) == span.is_empty(), "Inconsistency"); 3004 assert(n_tasks == 0 || 3005 ((span.start() + (n_tasks - 1)*task_size < span.end()) && 3006 (span.start() + n_tasks*task_size >= span.end())), 3007 "n_tasks calculation incorrect"); 3008 SequentialSubTasksDone* pst = conc_par_seq_tasks(); 3009 assert(!pst->valid(), "Clobbering existing data?"); 3010 // Sets the condition for completion of the subtask (how many threads 3011 // need to finish in order to be done). 3012 pst->set_n_threads(n_threads); 3013 pst->set_n_tasks((int)n_tasks); 3014 }