--- a/hotspot/src/share/vm/memory/metaspace.cpp Tue Mar 19 13:44:26 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Fri Mar 22 10:32:21 2013 +0100
@@ -1103,25 +1103,24 @@
}
bool MetaspaceGC::should_expand(VirtualSpaceList* vsl, size_t word_size) {
+ // If the user wants a limit, impose one.
+ if (!FLAG_IS_DEFAULT(MaxMetaspaceSize) &&
+ MetaspaceAux::reserved_in_bytes() >= MaxMetaspaceSize) {
+ return false;
+ }
// Class virtual space should always be expanded. Call GC for the other
// metadata virtual space.
if (vsl == Metaspace::class_space_list()) return true;
- // If the user wants a limit, impose one.
- size_t max_metaspace_size_words = MaxMetaspaceSize / BytesPerWord;
- size_t metaspace_size_words = MetaspaceSize / BytesPerWord;
- if (!FLAG_IS_DEFAULT(MaxMetaspaceSize) &&
- vsl->capacity_words_sum() >= max_metaspace_size_words) {
- return false;
- }
-
// If this is part of an allocation after a GC, expand
// unconditionally.
if(MetaspaceGC::expand_after_GC()) {
return true;
}
+ size_t metaspace_size_words = MetaspaceSize / BytesPerWord;
+
// If the capacity is below the minimum capacity, allow the
// expansion. Also set the high-water-mark (capacity_until_GC)
// to that minimum capacity so that a GC will not be induced
@@ -1311,8 +1310,7 @@
gclog_or_tty->print_cr(" metaspace HWM: %.1fK", new_capacity_until_GC / (double) K);
}
}
- assert(vsl->used_bytes_sum() == used_after_gc &&
- used_after_gc <= vsl->capacity_bytes_sum(),
+ assert(used_after_gc <= vsl->capacity_bytes_sum(),
"sanity check");
}
@@ -1972,6 +1970,9 @@
}
SpaceManager::~SpaceManager() {
+ // This call this->_lock which can't be done while holding expand_lock()
+ const size_t in_use_before = sum_capacity_in_chunks_in_use();
+
MutexLockerEx fcl(SpaceManager::expand_lock(),
Mutex::_no_safepoint_check_flag);
@@ -1989,7 +1990,7 @@
// Have to update before the chunks_in_use lists are emptied
// below.
- chunk_manager->inc_free_chunks_total(sum_capacity_in_chunks_in_use(),
+ chunk_manager->inc_free_chunks_total(in_use_before,
sum_count_in_chunks_in_use());
// Add all the chunks in use by this space manager