comparison src/share/vm/memory/collectorPolicy.cpp @ 6753:8da5e203b993

7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently Reviewed-by: johnc, ysr
author jmasa
date Tue, 18 Sep 2012 14:15:06 -0700
parents da91efe96a93
children 3fadc0e8cffe
comparison
equal deleted inserted replaced
6752:9646b7ff4d14 6753:8da5e203b993
741 uint loop_count = 0; 741 uint loop_count = 0;
742 uint gc_count = 0; 742 uint gc_count = 0;
743 uint full_gc_count = 0; 743 uint full_gc_count = 0;
744 744
745 do { 745 do {
746 MetaWord* result = NULL;
747 if (GC_locker::is_active_and_needs_gc()) {
748 // If the GC_locker is active, just expand and allocate.
749 // If that does not succeed, wait if this thread is not
750 // in a critical section itself.
751 result =
752 loader_data->metaspace_non_null()->expand_and_allocate(word_size,
753 mdtype);
754 if (result != NULL) {
755 return result;
756 }
757 JavaThread* jthr = JavaThread::current();
758 if (!jthr->in_critical()) {
759 MutexUnlocker mul(Heap_lock);
760 // Wait for JNI critical section to be exited
761 GC_locker::stall_until_clear();
762 // The GC invoked by the last thread leaving the critical
763 // section will be a young collection and a full collection
764 // is (currently) needed for unloading classes so continue
765 // to the next iteration to get a full GC.
766 continue;
767 } else {
768 if (CheckJNICalls) {
769 fatal("Possible deadlock due to allocating while"
770 " in jni critical section");
771 }
772 return NULL;
773 }
774 }
775
746 { // Need lock to get self consistent gc_count's 776 { // Need lock to get self consistent gc_count's
747 MutexLocker ml(Heap_lock); 777 MutexLocker ml(Heap_lock);
748 gc_count = Universe::heap()->total_collections(); 778 gc_count = Universe::heap()->total_collections();
749 full_gc_count = Universe::heap()->total_full_collections(); 779 full_gc_count = Universe::heap()->total_full_collections();
750 } 780 }