Print this page
*** 1833,1843 ****
void CompactibleFreeListSpace::object_iterate_since_last_GC(ObjectClosure* cl) {
// ugghh... how would one do this efficiently for a non-contiguous space?
guarantee(false, "NYI");
}
! bool CompactibleFreeListSpace::linearAllocationWouldFail() {
return _smallLinearAllocBlock._word_size == 0;
}
void CompactibleFreeListSpace::repairLinearAllocationBlocks() {
// Fix up linear allocation blocks to look like free blocks
--- 1833,1843 ----
void CompactibleFreeListSpace::object_iterate_since_last_GC(ObjectClosure* cl) {
// ugghh... how would one do this efficiently for a non-contiguous space?
guarantee(false, "NYI");
}
! bool CompactibleFreeListSpace::linearAllocationWouldFail() const {
return _smallLinearAllocBlock._word_size == 0;
}
void CompactibleFreeListSpace::repairLinearAllocationBlocks() {
// Fix up linear allocation blocks to look like free blocks
*** 1904,1913 ****
--- 1904,1920 ----
blk->_word_size = fc->size();
fc->dontCoalesce(); // to prevent sweeper from sweeping us up
}
}
+ // Support for concurrent collection policy decisions.
+ bool CompactibleFreeListSpace::should_concurrent_collect() const {
+ // In the future we might want to add in frgamentation stats --
+ // including erosion of the "mountain" into this decision as well.
+ return !adaptive_freelists() && linearAllocationWouldFail();
+ }
+
// Support for compaction
void CompactibleFreeListSpace::prepare_for_compaction(CompactPoint* cp) {
SCAN_AND_FORWARD(cp,end,block_is_obj,block_size);
// prepare_for_compaction() uses the space between live objects
*** 2011,2025 ****
fl->set_splitBirths(0);
fl->set_splitDeaths(0);
}
}
! void CompactibleFreeListSpace::endSweepFLCensus(int sweepCt) {
setFLSurplus();
setFLHints();
if (PrintGC && PrintFLSCensus > 0) {
! printFLCensus(sweepCt);
}
clearFLCensus();
assert_locked();
_dictionary->endSweepDictCensus(SplitSurplusPercent);
}
--- 2018,2032 ----
fl->set_splitBirths(0);
fl->set_splitDeaths(0);
}
}
! void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) {
setFLSurplus();
setFLHints();
if (PrintGC && PrintFLSCensus > 0) {
! printFLCensus(sweep_count);
}
clearFLCensus();
assert_locked();
_dictionary->endSweepDictCensus(SplitSurplusPercent);
}
*** 2291,2353 ****
assert((IndexSetStride != 2) || (IndexSetSize % 2 == 1),
"For-loops that iterate over IndexSet with stride 2 may be wrong");
}
#endif
! void CompactibleFreeListSpace::printFLCensus(int sweepCt) const {
assert_lock_strong(&_freelistLock);
! ssize_t bfrSurp = 0;
! ssize_t surplus = 0;
! ssize_t desired = 0;
! ssize_t prevSweep = 0;
! ssize_t beforeSweep = 0;
! ssize_t count = 0;
! ssize_t coalBirths = 0;
! ssize_t coalDeaths = 0;
! ssize_t splitBirths = 0;
! ssize_t splitDeaths = 0;
! gclog_or_tty->print("end sweep# %d\n", sweepCt);
! gclog_or_tty->print("%4s\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t"
! "%7s\t" "%7s\t" "%7s\t" "%7s\t" "%7s\t"
! "%7s\t" "\n",
! "size", "bfrsurp", "surplus", "desired", "prvSwep",
! "bfrSwep", "count", "cBirths", "cDeaths", "sBirths",
! "sDeaths");
!
size_t totalFree = 0;
for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
const FreeList *fl = &_indexedFreeList[i];
totalFree += fl->count() * fl->size();
!
! gclog_or_tty->print("%4d\t" "%7d\t" "%7d\t" "%7d\t"
! "%7d\t" "%7d\t" "%7d\t" "%7d\t"
! "%7d\t" "%7d\t" "%7d\t" "\n",
! fl->size(), fl->bfrSurp(), fl->surplus(), fl->desired(),
! fl->prevSweep(), fl->beforeSweep(), fl->count(), fl->coalBirths(),
! fl->coalDeaths(), fl->splitBirths(), fl->splitDeaths());
! bfrSurp += fl->bfrSurp();
! surplus += fl->surplus();
! desired += fl->desired();
! prevSweep += fl->prevSweep();
! beforeSweep += fl->beforeSweep();
! count += fl->count();
! coalBirths += fl->coalBirths();
! coalDeaths += fl->coalDeaths();
! splitBirths += fl->splitBirths();
! splitDeaths += fl->splitDeaths();
}
! gclog_or_tty->print("%4s\t"
! "%7d\t" "%7d\t" "%7d\t" "%7d\t" "%7d\t"
! "%7d\t" "%7d\t" "%7d\t" "%7d\t" "%7d\t" "\n",
! "totl",
! bfrSurp, surplus, desired, prevSweep, beforeSweep,
! count, coalBirths, coalDeaths, splitBirths, splitDeaths);
! gclog_or_tty->print_cr("Total free in indexed lists %d words", totalFree);
gclog_or_tty->print("growth: %8.5f deficit: %8.5f\n",
! (double)(splitBirths+coalBirths-splitDeaths-coalDeaths)/
! (prevSweep != 0 ? (double)prevSweep : 1.0),
! (double)(desired - count)/(desired != 0 ? (double)desired : 1.0));
_dictionary->printDictCensus();
}
// Return the next displaced header, incrementing the pointer and
// recycling spool area as necessary.
--- 2298,2338 ----
assert((IndexSetStride != 2) || (IndexSetSize % 2 == 1),
"For-loops that iterate over IndexSet with stride 2 may be wrong");
}
#endif
! void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const {
assert_lock_strong(&_freelistLock);
! FreeList total;
! gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count);
! FreeList::print_labels_on(gclog_or_tty, "size");
size_t totalFree = 0;
for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
const FreeList *fl = &_indexedFreeList[i];
totalFree += fl->count() * fl->size();
! if (i % (40*IndexSetStride) == 0) {
! FreeList::print_labels_on(gclog_or_tty, "size");
}
! fl->print_on(gclog_or_tty);
! total.set_bfrSurp( total.bfrSurp() + fl->bfrSurp() );
! total.set_surplus( total.surplus() + fl->surplus() );
! total.set_desired( total.desired() + fl->desired() );
! total.set_prevSweep( total.prevSweep() + fl->prevSweep() );
! total.set_beforeSweep(total.beforeSweep() + fl->beforeSweep());
! total.set_count( total.count() + fl->count() );
! total.set_coalBirths( total.coalBirths() + fl->coalBirths() );
! total.set_coalDeaths( total.coalDeaths() + fl->coalDeaths() );
! total.set_splitBirths(total.splitBirths() + fl->splitBirths());
! total.set_splitDeaths(total.splitDeaths() + fl->splitDeaths());
! }
! total.print_on(gclog_or_tty, "TOTAL");
! gclog_or_tty->print_cr("Total free in indexed lists "
! SIZE_FORMAT " words", totalFree);
gclog_or_tty->print("growth: %8.5f deficit: %8.5f\n",
! (double)(total.splitBirths()+total.coalBirths()-total.splitDeaths()-total.coalDeaths())/
! (total.prevSweep() != 0 ? (double)total.prevSweep() : 1.0),
! (double)(total.desired() - total.count())/(total.desired() != 0 ? (double)total.desired() : 1.0));
_dictionary->printDictCensus();
}
// Return the next displaced header, incrementing the pointer and
// recycling spool area as necessary.