--- old/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp 2010-03-10 14:49:35.000000000 -0800 +++ new/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp 2010-03-10 14:49:35.000000000 -0800 @@ -308,16 +308,16 @@ size_t size = align_size_down(bytes, virtual_space()->alignment()); if (size > 0) { assert_lock_strong(ExpandHeap_lock); - virtual_space()->shrink_by(bytes); + virtual_space()->shrink_by(size); post_resize(); if (Verbose && PrintGC) { size_t new_mem_size = virtual_space()->committed_size(); - size_t old_mem_size = new_mem_size + bytes; + size_t old_mem_size = new_mem_size + size; gclog_or_tty->print_cr("Shrinking %s from " SIZE_FORMAT "K by " SIZE_FORMAT "K to " SIZE_FORMAT "K", - name(), old_mem_size/K, bytes/K, new_mem_size/K); + name(), old_mem_size/K, size/K, new_mem_size/K); } } } @@ -497,3 +497,26 @@ object_space()->set_top_for_allocations(); } #endif + +void PSOldGen::try_to_shrink_by(size_t shrink_bytes) { + if (shrink_bytes < MinHeapDeltaBytes || + capacity_in_bytes() - shrink_bytes < _init_gen_size) { + return; + } + + if (PrintGC) { + gclog_or_tty->print_cr(" Resizing old gen. shrink_bytes=%d", shrink_bytes); + gclog_or_tty->print("BEFORE: Old Gen: "); + gclog_or_tty->print("capacity : " SIZE_FORMAT ", ", capacity_in_bytes()); + gclog_or_tty->print_cr("used : " SIZE_FORMAT ", " , used_in_bytes()); + } + + MutexLocker x(ExpandHeap_lock); + shrink(shrink_bytes); + + if (PrintGC) { + gclog_or_tty->print("AFTER: Old Gen: "); + gclog_or_tty->print("capacity : " SIZE_FORMAT ", ", capacity_in_bytes()); + gclog_or_tty->print_cr("used : " SIZE_FORMAT ", " , used_in_bytes()); + } +}