< prev index next >

src/share/vm/gc/cms/parNewGeneration.cpp

Print this page
rev 8853 : imported patch mikael-erik-suggestions
rev 8867 : [mq]: bengt-refactoring


 231     Space*            const sp   = to_space();
 232     if (word_sz * 100 <
 233         ParallelGCBufferWastePct * plab->word_sz()) {
 234       // Is small enough; abandon this buffer and start a new one.
 235       plab->retire();
 236       size_t buf_size = plab->word_sz();
 237       HeapWord* buf_space = sp->par_allocate(buf_size);
 238       if (buf_space == NULL) {
 239         const size_t min_bytes =
 240           PLAB::min_size() << LogHeapWordSize;
 241         size_t free_bytes = sp->free();
 242         while(buf_space == NULL && free_bytes >= min_bytes) {
 243           buf_size = free_bytes >> LogHeapWordSize;
 244           assert(buf_size == (size_t)align_object_size(buf_size),
 245                  "Invariant");
 246           buf_space  = sp->par_allocate(buf_size);
 247           free_bytes = sp->free();
 248         }
 249       }
 250       if (buf_space != NULL) {
 251         plab->set_word_size(buf_size);
 252         plab->set_buf(buf_space);
 253         record_survivor_plab(buf_space, buf_size);
 254         obj = plab->allocate_aligned(word_sz, SurvivorAlignmentInBytes);
 255         // Note that we cannot compare buf_size < word_sz below
 256         // because of AlignmentReserve (see PLAB::allocate()).
 257         assert(obj != NULL || plab->words_remaining() < word_sz,
 258                "Else should have been able to allocate");
 259         // It's conceivable that we may be able to use the
 260         // buffer we just grabbed for subsequent small requests
 261         // even if not for this one.
 262       } else {
 263         // We're used up.
 264         _to_space_full = true;
 265       }
 266 
 267     } else {
 268       // Too large; allocate the object individually.
 269       obj = sp->par_allocate(word_sz);
 270     }
 271   }
 272   return obj;




 231     Space*            const sp   = to_space();
 232     if (word_sz * 100 <
 233         ParallelGCBufferWastePct * plab->word_sz()) {
 234       // Is small enough; abandon this buffer and start a new one.
 235       plab->retire();
 236       size_t buf_size = plab->word_sz();
 237       HeapWord* buf_space = sp->par_allocate(buf_size);
 238       if (buf_space == NULL) {
 239         const size_t min_bytes =
 240           PLAB::min_size() << LogHeapWordSize;
 241         size_t free_bytes = sp->free();
 242         while(buf_space == NULL && free_bytes >= min_bytes) {
 243           buf_size = free_bytes >> LogHeapWordSize;
 244           assert(buf_size == (size_t)align_object_size(buf_size),
 245                  "Invariant");
 246           buf_space  = sp->par_allocate(buf_size);
 247           free_bytes = sp->free();
 248         }
 249       }
 250       if (buf_space != NULL) {
 251         plab->set_buf(buf_space, buf_size);

 252         record_survivor_plab(buf_space, buf_size);
 253         obj = plab->allocate_aligned(word_sz, SurvivorAlignmentInBytes);
 254         // Note that we cannot compare buf_size < word_sz below
 255         // because of AlignmentReserve (see PLAB::allocate()).
 256         assert(obj != NULL || plab->words_remaining() < word_sz,
 257                "Else should have been able to allocate");
 258         // It's conceivable that we may be able to use the
 259         // buffer we just grabbed for subsequent small requests
 260         // even if not for this one.
 261       } else {
 262         // We're used up.
 263         _to_space_full = true;
 264       }
 265 
 266     } else {
 267       // Too large; allocate the object individually.
 268       obj = sp->par_allocate(word_sz);
 269     }
 270   }
 271   return obj;


< prev index next >