Mercurial > hg > graal-compiler
comparison src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp @ 139:c0492d52d55b
6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
Reviewed-by: ysr, jmasa
author | apetrusenko |
---|---|
date | Tue, 01 Apr 2008 15:13:47 +0400 |
parents | 183f41cf8bfe |
children | d1605aabd0a1 12eea04c8b06 |
comparison
equal
deleted
inserted
replaced
95:d05ebaf00ed0 | 139:c0492d52d55b |
---|---|
588 MutexLocker ml(Heap_lock); | 588 MutexLocker ml(Heap_lock); |
589 gc_count = Universe::heap()->total_collections(); | 589 gc_count = Universe::heap()->total_collections(); |
590 full_gc_count = Universe::heap()->total_full_collections(); | 590 full_gc_count = Universe::heap()->total_full_collections(); |
591 | 591 |
592 result = perm_gen()->allocate_permanent(size); | 592 result = perm_gen()->allocate_permanent(size); |
593 | |
594 if (result != NULL) { | |
595 return result; | |
596 } | |
597 | |
598 if (GC_locker::is_active_and_needs_gc()) { | |
599 // If this thread is not in a jni critical section, we stall | |
600 // the requestor until the critical section has cleared and | |
601 // GC allowed. When the critical section clears, a GC is | |
602 // initiated by the last thread exiting the critical section; so | |
603 // we retry the allocation sequence from the beginning of the loop, | |
604 // rather than causing more, now probably unnecessary, GC attempts. | |
605 JavaThread* jthr = JavaThread::current(); | |
606 if (!jthr->in_critical()) { | |
607 MutexUnlocker mul(Heap_lock); | |
608 GC_locker::stall_until_clear(); | |
609 continue; | |
610 } else { | |
611 if (CheckJNICalls) { | |
612 fatal("Possible deadlock due to allocating while" | |
613 " in jni critical section"); | |
614 } | |
615 return NULL; | |
616 } | |
617 } | |
593 } | 618 } |
594 | 619 |
595 if (result == NULL) { | 620 if (result == NULL) { |
596 | 621 |
597 // Exit the loop if the gc time limit has been exceeded. | 622 // Exit the loop if the gc time limit has been exceeded. |
620 // This prevents us from looping until time out on requests that can | 645 // This prevents us from looping until time out on requests that can |
621 // not be satisfied. | 646 // not be satisfied. |
622 if (op.prologue_succeeded()) { | 647 if (op.prologue_succeeded()) { |
623 assert(Universe::heap()->is_in_permanent_or_null(op.result()), | 648 assert(Universe::heap()->is_in_permanent_or_null(op.result()), |
624 "result not in heap"); | 649 "result not in heap"); |
650 // If GC was locked out during VM operation then retry allocation | |
651 // and/or stall as necessary. | |
652 if (op.gc_locked()) { | |
653 assert(op.result() == NULL, "must be NULL if gc_locked() is true"); | |
654 continue; // retry and/or stall as necessary | |
655 } | |
625 // If a NULL results is being returned, an out-of-memory | 656 // If a NULL results is being returned, an out-of-memory |
626 // will be thrown now. Clear the gc_time_limit_exceeded | 657 // will be thrown now. Clear the gc_time_limit_exceeded |
627 // flag to avoid the following situation. | 658 // flag to avoid the following situation. |
628 // gc_time_limit_exceeded is set during a collection | 659 // gc_time_limit_exceeded is set during a collection |
629 // the collection fails to return enough space and an OOM is thrown | 660 // the collection fails to return enough space and an OOM is thrown |