Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 2137:ffd725ff6943
Merge
author | johnc |
---|---|
date | Thu, 13 Jan 2011 17:19:21 -0800 |
parents | 7246a374a9f2 2e0b0c4671e4 |
children | 0fa27f37d4d4 |
comparison
equal
deleted
inserted
replaced
2131:856ecff79cf7 | 2137:ffd725ff6943 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
608 // for it to complete, updates to _summary_bytes_used might get | 608 // for it to complete, updates to _summary_bytes_used might get |
609 // lost. This will be resolved in the near future when the operation | 609 // lost. This will be resolved in the near future when the operation |
610 // of the free region list is revamped as part of CR 6977804. | 610 // of the free region list is revamped as part of CR 6977804. |
611 wait_for_cleanup_complete(); | 611 wait_for_cleanup_complete(); |
612 | 612 |
613 // Other threads might still be trying to allocate using CASes out | |
614 // of the region we are retiring, as they can do so without holding | |
615 // the Heap_lock. So we first have to make sure that noone else can | |
616 // allocate in it by doing a maximal allocation. Even if our CAS | |
617 // attempt fails a few times, we'll succeed sooner or later given | |
618 // that a failed CAS attempt mean that the region is getting closed | |
619 // to being full (someone else succeeded in allocating into it). | |
620 size_t free_word_size = cur_alloc_region->free() / HeapWordSize; | |
621 | |
622 // This is the minimum free chunk we can turn into a dummy | |
623 // object. If the free space falls below this, then noone can | |
624 // allocate in this region anyway (all allocation requests will be | |
625 // of a size larger than this) so we won't have to perform the dummy | |
626 // allocation. | |
627 size_t min_word_size_to_fill = CollectedHeap::min_fill_size(); | |
628 | |
629 while (free_word_size >= min_word_size_to_fill) { | |
630 HeapWord* dummy = | |
631 cur_alloc_region->par_allocate_no_bot_updates(free_word_size); | |
632 if (dummy != NULL) { | |
633 // If the allocation was successful we should fill in the space. | |
634 CollectedHeap::fill_with_object(dummy, free_word_size); | |
635 break; | |
636 } | |
637 | |
638 free_word_size = cur_alloc_region->free() / HeapWordSize; | |
639 // It's also possible that someone else beats us to the | |
640 // allocation and they fill up the region. In that case, we can | |
641 // just get out of the loop | |
642 } | |
643 assert(cur_alloc_region->free() / HeapWordSize < min_word_size_to_fill, | |
644 "sanity"); | |
645 | |
613 retire_cur_alloc_region_common(cur_alloc_region); | 646 retire_cur_alloc_region_common(cur_alloc_region); |
614 assert(_cur_alloc_region == NULL, "post-condition"); | 647 assert(_cur_alloc_region == NULL, "post-condition"); |
615 } | 648 } |
616 | 649 |
617 // See the comment in the .hpp file about the locking protocol and | 650 // See the comment in the .hpp file about the locking protocol and |
659 // We need to ensure that the stores to _cur_alloc_region and, | 692 // We need to ensure that the stores to _cur_alloc_region and, |
660 // subsequently, to top do not float above the setting of the | 693 // subsequently, to top do not float above the setting of the |
661 // young type. | 694 // young type. |
662 OrderAccess::storestore(); | 695 OrderAccess::storestore(); |
663 | 696 |
664 // Now allocate out of the new current alloc region. We could | 697 // Now, perform the allocation out of the region we just |
665 // have re-used allocate_from_cur_alloc_region() but its | 698 // allocated. Note that noone else can access that region at |
666 // operation is slightly different to what we need here. First, | 699 // this point (as _cur_alloc_region has not been updated yet), |
667 // allocate_from_cur_alloc_region() is only called outside a | 700 // so we can just go ahead and do the allocation without any |
668 // safepoint and will always unlock the Heap_lock if it returns | 701 // atomics (and we expect this allocation attempt to |
669 // a non-NULL result. Second, it assumes that the current alloc | 702 // suceeded). Given that other threads can attempt an allocation |
670 // region is what's already assigned in _cur_alloc_region. What | 703 // with a CAS and without needing the Heap_lock, if we assigned |
671 // we want here is to actually do the allocation first before we | 704 // the new region to _cur_alloc_region before first allocating |
672 // assign the new region to _cur_alloc_region. This ordering is | 705 // into it other threads might have filled up the new region |
673 // not currently important, but it will be essential when we | 706 // before we got a chance to do the allocation ourselves. In |
674 // change the code to support CAS allocation in the future (see | 707 // that case, we would have needed to retire the region, grab a |
675 // CR 6994297). | 708 // new one, and go through all this again. Allocating out of the |
676 // | 709 // new region before assigning it to _cur_alloc_region avoids |
677 // This allocate method does BOT updates and we don't need them in | 710 // all this. |
678 // the young generation. This will be fixed in the near future by | 711 HeapWord* result = |
679 // CR 6994297. | 712 new_cur_alloc_region->allocate_no_bot_updates(word_size); |
680 HeapWord* result = new_cur_alloc_region->allocate(word_size); | |
681 assert(result != NULL, "we just allocate out of an empty region " | 713 assert(result != NULL, "we just allocate out of an empty region " |
682 "so allocation should have been successful"); | 714 "so allocation should have been successful"); |
683 assert(is_in(result), "result should be in the heap"); | 715 assert(is_in(result), "result should be in the heap"); |
684 | 716 |
717 // Now make sure that the store to _cur_alloc_region does not | |
718 // float above the store to top. | |
719 OrderAccess::storestore(); | |
685 _cur_alloc_region = new_cur_alloc_region; | 720 _cur_alloc_region = new_cur_alloc_region; |
686 | 721 |
687 if (!at_safepoint) { | 722 if (!at_safepoint) { |
688 Heap_lock->unlock(); | 723 Heap_lock->unlock(); |
689 } | 724 } |
715 // exit the loop, either one of the allocation attempts was | 750 // exit the loop, either one of the allocation attempts was |
716 // successful, or we succeeded in doing the VM op but which was | 751 // successful, or we succeeded in doing the VM op but which was |
717 // unable to allocate after the collection. | 752 // unable to allocate after the collection. |
718 for (int try_count = 1; /* we'll return or break */; try_count += 1) { | 753 for (int try_count = 1; /* we'll return or break */; try_count += 1) { |
719 bool succeeded = true; | 754 bool succeeded = true; |
755 | |
756 // Every time we go round the loop we should be holding the Heap_lock. | |
757 assert_heap_locked(); | |
720 | 758 |
721 { | 759 { |
722 // We may have concurrent cleanup working at the time. Wait for | 760 // We may have concurrent cleanup working at the time. Wait for |
723 // it to complete. In the future we would probably want to make | 761 // it to complete. In the future we would probably want to make |
724 // the concurrent cleanup truly concurrent by decoupling it from | 762 // the concurrent cleanup truly concurrent by decoupling it from |
732 // allocate again, just in case. When we make cleanup truly | 770 // allocate again, just in case. When we make cleanup truly |
733 // concurrent with allocation, we should remove this allocation | 771 // concurrent with allocation, we should remove this allocation |
734 // attempt as it's redundant (we only reach here after an | 772 // attempt as it's redundant (we only reach here after an |
735 // allocation attempt has been unsuccessful). | 773 // allocation attempt has been unsuccessful). |
736 wait_for_cleanup_complete(); | 774 wait_for_cleanup_complete(); |
737 HeapWord* result = attempt_allocation(word_size); | 775 |
776 HeapWord* result = attempt_allocation_locked(word_size); | |
738 if (result != NULL) { | 777 if (result != NULL) { |
739 assert_heap_not_locked(); | 778 assert_heap_not_locked(); |
740 return result; | 779 return result; |
741 } | 780 } |
742 } | 781 } |
746 // allocate a new region only if we can expand the young gen. | 785 // allocate a new region only if we can expand the young gen. |
747 | 786 |
748 if (g1_policy()->can_expand_young_list()) { | 787 if (g1_policy()->can_expand_young_list()) { |
749 // Yes, we are allowed to expand the young gen. Let's try to | 788 // Yes, we are allowed to expand the young gen. Let's try to |
750 // allocate a new current alloc region. | 789 // allocate a new current alloc region. |
751 | |
752 HeapWord* result = | 790 HeapWord* result = |
753 replace_cur_alloc_region_and_allocate(word_size, | 791 replace_cur_alloc_region_and_allocate(word_size, |
754 false, /* at_safepoint */ | 792 false, /* at_safepoint */ |
755 true, /* do_dirtying */ | 793 true, /* do_dirtying */ |
756 true /* can_expand */); | 794 true /* can_expand */); |
769 // initiated by the last thread exiting the critical section; so | 807 // initiated by the last thread exiting the critical section; so |
770 // we retry the allocation sequence from the beginning of the loop, | 808 // we retry the allocation sequence from the beginning of the loop, |
771 // rather than causing more, now probably unnecessary, GC attempts. | 809 // rather than causing more, now probably unnecessary, GC attempts. |
772 JavaThread* jthr = JavaThread::current(); | 810 JavaThread* jthr = JavaThread::current(); |
773 assert(jthr != NULL, "sanity"); | 811 assert(jthr != NULL, "sanity"); |
774 if (!jthr->in_critical()) { | 812 if (jthr->in_critical()) { |
775 MutexUnlocker mul(Heap_lock); | |
776 GC_locker::stall_until_clear(); | |
777 | |
778 // We'll then fall off the end of the ("if GC locker active") | |
779 // if-statement and retry the allocation further down in the | |
780 // loop. | |
781 } else { | |
782 if (CheckJNICalls) { | 813 if (CheckJNICalls) { |
783 fatal("Possible deadlock due to allocating while" | 814 fatal("Possible deadlock due to allocating while" |
784 " in jni critical section"); | 815 " in jni critical section"); |
785 } | 816 } |
817 // We are returning NULL so the protocol is that we're still | |
818 // holding the Heap_lock. | |
819 assert_heap_locked(); | |
786 return NULL; | 820 return NULL; |
787 } | 821 } |
822 | |
823 Heap_lock->unlock(); | |
824 GC_locker::stall_until_clear(); | |
825 | |
826 // No need to relock the Heap_lock. We'll fall off to the code | |
827 // below the else-statement which assumes that we are not | |
828 // holding the Heap_lock. | |
788 } else { | 829 } else { |
789 // We are not locked out. So, let's try to do a GC. The VM op | 830 // We are not locked out. So, let's try to do a GC. The VM op |
790 // will retry the allocation before it completes. | 831 // will retry the allocation before it completes. |
791 | 832 |
792 // Read the GC count while holding the Heap_lock | 833 // Read the GC count while holding the Heap_lock |
803 // Allocations that take place on VM operations do not do any | 844 // Allocations that take place on VM operations do not do any |
804 // card dirtying and we have to do it here. | 845 // card dirtying and we have to do it here. |
805 dirty_young_block(result, word_size); | 846 dirty_young_block(result, word_size); |
806 return result; | 847 return result; |
807 } | 848 } |
808 | 849 } |
809 Heap_lock->lock(); | 850 |
810 } | 851 // Both paths that get us here from above unlock the Heap_lock. |
811 | 852 assert_heap_not_locked(); |
812 assert_heap_locked(); | |
813 | 853 |
814 // We can reach here when we were unsuccessful in doing a GC, | 854 // We can reach here when we were unsuccessful in doing a GC, |
815 // because another thread beat us to it, or because we were locked | 855 // because another thread beat us to it, or because we were locked |
816 // out of GC due to the GC locker. In either case a new alloc | 856 // out of GC due to the GC locker. In either case a new alloc |
817 // region might be available so we will retry the allocation. | 857 // region might be available so we will retry the allocation. |
946 | 986 |
947 if (!isHumongous(word_size)) { | 987 if (!isHumongous(word_size)) { |
948 if (!expect_null_cur_alloc_region) { | 988 if (!expect_null_cur_alloc_region) { |
949 HeapRegion* cur_alloc_region = _cur_alloc_region; | 989 HeapRegion* cur_alloc_region = _cur_alloc_region; |
950 if (cur_alloc_region != NULL) { | 990 if (cur_alloc_region != NULL) { |
951 // This allocate method does BOT updates and we don't need them in | 991 // We are at a safepoint so no reason to use the MT-safe version. |
952 // the young generation. This will be fixed in the near future by | 992 HeapWord* result = cur_alloc_region->allocate_no_bot_updates(word_size); |
953 // CR 6994297. | |
954 HeapWord* result = cur_alloc_region->allocate(word_size); | |
955 if (result != NULL) { | 993 if (result != NULL) { |
956 assert(is_in(result), "result should be in the heap"); | 994 assert(is_in(result), "result should be in the heap"); |
957 | 995 |
958 // We will not do any dirtying here. This is guaranteed to be | 996 // We will not do any dirtying here. This is guaranteed to be |
959 // called during a safepoint and the thread that scheduled the | 997 // called during a safepoint and the thread that scheduled the |
981 | 1019 |
982 HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) { | 1020 HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) { |
983 assert_heap_not_locked_and_not_at_safepoint(); | 1021 assert_heap_not_locked_and_not_at_safepoint(); |
984 assert(!isHumongous(word_size), "we do not allow TLABs of humongous size"); | 1022 assert(!isHumongous(word_size), "we do not allow TLABs of humongous size"); |
985 | 1023 |
986 Heap_lock->lock(); | 1024 // First attempt: Try allocating out of the current alloc region |
987 | 1025 // using a CAS. If that fails, take the Heap_lock and retry the |
988 // First attempt: try allocating out of the current alloc region or | 1026 // allocation, potentially replacing the current alloc region. |
989 // after replacing the current alloc region. | |
990 HeapWord* result = attempt_allocation(word_size); | 1027 HeapWord* result = attempt_allocation(word_size); |
991 if (result != NULL) { | 1028 if (result != NULL) { |
992 assert_heap_not_locked(); | 1029 assert_heap_not_locked(); |
993 return result; | 1030 return result; |
994 } | 1031 } |
995 | 1032 |
996 assert_heap_locked(); | 1033 // Second attempt: Go to the slower path where we might try to |
997 | 1034 // schedule a collection. |
998 // Second attempt: go into the even slower path where we might | |
999 // try to schedule a collection. | |
1000 result = attempt_allocation_slow(word_size); | 1035 result = attempt_allocation_slow(word_size); |
1001 if (result != NULL) { | 1036 if (result != NULL) { |
1002 assert_heap_not_locked(); | 1037 assert_heap_not_locked(); |
1003 return result; | 1038 return result; |
1004 } | 1039 } |
1005 | 1040 |
1006 assert_heap_locked(); | 1041 assert_heap_locked(); |
1042 // Need to unlock the Heap_lock before returning. | |
1007 Heap_lock->unlock(); | 1043 Heap_lock->unlock(); |
1008 return NULL; | 1044 return NULL; |
1009 } | 1045 } |
1010 | 1046 |
1011 HeapWord* | 1047 HeapWord* |
1020 // Loop until the allocation is satisified, | 1056 // Loop until the allocation is satisified, |
1021 // or unsatisfied after GC. | 1057 // or unsatisfied after GC. |
1022 for (int try_count = 1; /* we'll return */; try_count += 1) { | 1058 for (int try_count = 1; /* we'll return */; try_count += 1) { |
1023 unsigned int gc_count_before; | 1059 unsigned int gc_count_before; |
1024 { | 1060 { |
1025 Heap_lock->lock(); | |
1026 | |
1027 if (!isHumongous(word_size)) { | 1061 if (!isHumongous(word_size)) { |
1028 // First attempt: try allocating out of the current alloc | 1062 // First attempt: Try allocating out of the current alloc region |
1029 // region or after replacing the current alloc region. | 1063 // using a CAS. If that fails, take the Heap_lock and retry the |
1064 // allocation, potentially replacing the current alloc region. | |
1030 HeapWord* result = attempt_allocation(word_size); | 1065 HeapWord* result = attempt_allocation(word_size); |
1031 if (result != NULL) { | 1066 if (result != NULL) { |
1032 assert_heap_not_locked(); | 1067 assert_heap_not_locked(); |
1033 return result; | 1068 return result; |
1034 } | 1069 } |
1035 | 1070 |
1036 assert_heap_locked(); | 1071 assert_heap_locked(); |
1037 | 1072 |
1038 // Second attempt: go into the even slower path where we might | 1073 // Second attempt: Go to the slower path where we might try to |
1039 // try to schedule a collection. | 1074 // schedule a collection. |
1040 result = attempt_allocation_slow(word_size); | 1075 result = attempt_allocation_slow(word_size); |
1041 if (result != NULL) { | 1076 if (result != NULL) { |
1042 assert_heap_not_locked(); | 1077 assert_heap_not_locked(); |
1043 return result; | 1078 return result; |
1044 } | 1079 } |
1045 } else { | 1080 } else { |
1081 // attempt_allocation_humongous() requires the Heap_lock to be held. | |
1082 Heap_lock->lock(); | |
1083 | |
1046 HeapWord* result = attempt_allocation_humongous(word_size, | 1084 HeapWord* result = attempt_allocation_humongous(word_size, |
1047 false /* at_safepoint */); | 1085 false /* at_safepoint */); |
1048 if (result != NULL) { | 1086 if (result != NULL) { |
1049 assert_heap_not_locked(); | 1087 assert_heap_not_locked(); |
1050 return result; | 1088 return result; |
1052 } | 1090 } |
1053 | 1091 |
1054 assert_heap_locked(); | 1092 assert_heap_locked(); |
1055 // Read the gc count while the heap lock is held. | 1093 // Read the gc count while the heap lock is held. |
1056 gc_count_before = SharedHeap::heap()->total_collections(); | 1094 gc_count_before = SharedHeap::heap()->total_collections(); |
1057 // We cannot be at a safepoint, so it is safe to unlock the Heap_lock | 1095 |
1096 // Release the Heap_lock before attempting the collection. | |
1058 Heap_lock->unlock(); | 1097 Heap_lock->unlock(); |
1059 } | 1098 } |
1060 | 1099 |
1061 // Create the garbage collection operation... | 1100 // Create the garbage collection operation... |
1062 VM_G1CollectForAllocation op(gc_count_before, word_size); | 1101 VM_G1CollectForAllocation op(gc_count_before, word_size); |
1866 const size_t total_reserved = max_byte_size + pgs->max_size(); | 1905 const size_t total_reserved = max_byte_size + pgs->max_size(); |
1867 char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop); | 1906 char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop); |
1868 | 1907 |
1869 ReservedSpace heap_rs(max_byte_size + pgs->max_size(), | 1908 ReservedSpace heap_rs(max_byte_size + pgs->max_size(), |
1870 HeapRegion::GrainBytes, | 1909 HeapRegion::GrainBytes, |
1871 false /*ism*/, addr); | 1910 UseLargePages, addr); |
1872 | 1911 |
1873 if (UseCompressedOops) { | 1912 if (UseCompressedOops) { |
1874 if (addr != NULL && !heap_rs.is_reserved()) { | 1913 if (addr != NULL && !heap_rs.is_reserved()) { |
1875 // Failed to reserve at specified address - the requested memory | 1914 // Failed to reserve at specified address - the requested memory |
1876 // region is taken already, for example, by 'java' launcher. | 1915 // region is taken already, for example, by 'java' launcher. |
1877 // Try again to reserver heap higher. | 1916 // Try again to reserver heap higher. |
1878 addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop); | 1917 addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop); |
1879 ReservedSpace heap_rs0(total_reserved, HeapRegion::GrainBytes, | 1918 ReservedSpace heap_rs0(total_reserved, HeapRegion::GrainBytes, |
1880 false /*ism*/, addr); | 1919 UseLargePages, addr); |
1881 if (addr != NULL && !heap_rs0.is_reserved()) { | 1920 if (addr != NULL && !heap_rs0.is_reserved()) { |
1882 // Failed to reserve at specified address again - give up. | 1921 // Failed to reserve at specified address again - give up. |
1883 addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop); | 1922 addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop); |
1884 assert(addr == NULL, ""); | 1923 assert(addr == NULL, ""); |
1885 ReservedSpace heap_rs1(total_reserved, HeapRegion::GrainBytes, | 1924 ReservedSpace heap_rs1(total_reserved, HeapRegion::GrainBytes, |
1886 false /*ism*/, addr); | 1925 UseLargePages, addr); |
1887 heap_rs = heap_rs1; | 1926 heap_rs = heap_rs1; |
1888 } else { | 1927 } else { |
1889 heap_rs = heap_rs0; | 1928 heap_rs = heap_rs0; |
1890 } | 1929 } |
1891 } | 1930 } |
3854 HeapRegion* _hr; | 3893 HeapRegion* _hr; |
3855 size_t _prev_marked_bytes; | 3894 size_t _prev_marked_bytes; |
3856 size_t _next_marked_bytes; | 3895 size_t _next_marked_bytes; |
3857 OopsInHeapRegionClosure *_cl; | 3896 OopsInHeapRegionClosure *_cl; |
3858 public: | 3897 public: |
3859 RemoveSelfPointerClosure(G1CollectedHeap* g1, OopsInHeapRegionClosure* cl) : | 3898 RemoveSelfPointerClosure(G1CollectedHeap* g1, HeapRegion* hr, |
3860 _g1(g1), _cm(_g1->concurrent_mark()), _prev_marked_bytes(0), | 3899 OopsInHeapRegionClosure* cl) : |
3900 _g1(g1), _hr(hr), _cm(_g1->concurrent_mark()), _prev_marked_bytes(0), | |
3861 _next_marked_bytes(0), _cl(cl) {} | 3901 _next_marked_bytes(0), _cl(cl) {} |
3862 | 3902 |
3863 size_t prev_marked_bytes() { return _prev_marked_bytes; } | 3903 size_t prev_marked_bytes() { return _prev_marked_bytes; } |
3864 size_t next_marked_bytes() { return _next_marked_bytes; } | 3904 size_t next_marked_bytes() { return _next_marked_bytes; } |
3865 | 3905 |
3906 // <original comment> | |
3866 // The original idea here was to coalesce evacuated and dead objects. | 3907 // The original idea here was to coalesce evacuated and dead objects. |
3867 // However that caused complications with the block offset table (BOT). | 3908 // However that caused complications with the block offset table (BOT). |
3868 // In particular if there were two TLABs, one of them partially refined. | 3909 // In particular if there were two TLABs, one of them partially refined. |
3869 // |----- TLAB_1--------|----TLAB_2-~~~(partially refined part)~~~| | 3910 // |----- TLAB_1--------|----TLAB_2-~~~(partially refined part)~~~| |
3870 // The BOT entries of the unrefined part of TLAB_2 point to the start | 3911 // The BOT entries of the unrefined part of TLAB_2 point to the start |
3871 // of TLAB_2. If the last object of the TLAB_1 and the first object | 3912 // of TLAB_2. If the last object of the TLAB_1 and the first object |
3872 // of TLAB_2 are coalesced, then the cards of the unrefined part | 3913 // of TLAB_2 are coalesced, then the cards of the unrefined part |
3873 // would point into middle of the filler object. | 3914 // would point into middle of the filler object. |
3915 // The current approach is to not coalesce and leave the BOT contents intact. | |
3916 // </original comment> | |
3874 // | 3917 // |
3875 // The current approach is to not coalesce and leave the BOT contents intact. | 3918 // We now reset the BOT when we start the object iteration over the |
3919 // region and refine its entries for every object we come across. So | |
3920 // the above comment is not really relevant and we should be able | |
3921 // to coalesce dead objects if we want to. | |
3876 void do_object(oop obj) { | 3922 void do_object(oop obj) { |
3923 HeapWord* obj_addr = (HeapWord*) obj; | |
3924 assert(_hr->is_in(obj_addr), "sanity"); | |
3925 size_t obj_size = obj->size(); | |
3926 _hr->update_bot_for_object(obj_addr, obj_size); | |
3877 if (obj->is_forwarded() && obj->forwardee() == obj) { | 3927 if (obj->is_forwarded() && obj->forwardee() == obj) { |
3878 // The object failed to move. | 3928 // The object failed to move. |
3879 assert(!_g1->is_obj_dead(obj), "We should not be preserving dead objs."); | 3929 assert(!_g1->is_obj_dead(obj), "We should not be preserving dead objs."); |
3880 _cm->markPrev(obj); | 3930 _cm->markPrev(obj); |
3881 assert(_cm->isPrevMarked(obj), "Should be marked!"); | 3931 assert(_cm->isPrevMarked(obj), "Should be marked!"); |
3882 _prev_marked_bytes += (obj->size() * HeapWordSize); | 3932 _prev_marked_bytes += (obj_size * HeapWordSize); |
3883 if (_g1->mark_in_progress() && !_g1->is_obj_ill(obj)) { | 3933 if (_g1->mark_in_progress() && !_g1->is_obj_ill(obj)) { |
3884 _cm->markAndGrayObjectIfNecessary(obj); | 3934 _cm->markAndGrayObjectIfNecessary(obj); |
3885 } | 3935 } |
3886 obj->set_mark(markOopDesc::prototype()); | 3936 obj->set_mark(markOopDesc::prototype()); |
3887 // While we were processing RSet buffers during the | 3937 // While we were processing RSet buffers during the |
3899 obj->oop_iterate(_cl); | 3949 obj->oop_iterate(_cl); |
3900 assert(_cm->isPrevMarked(obj), "Should be marked!"); | 3950 assert(_cm->isPrevMarked(obj), "Should be marked!"); |
3901 } else { | 3951 } else { |
3902 // The object has been either evacuated or is dead. Fill it with a | 3952 // The object has been either evacuated or is dead. Fill it with a |
3903 // dummy object. | 3953 // dummy object. |
3904 MemRegion mr((HeapWord*)obj, obj->size()); | 3954 MemRegion mr((HeapWord*)obj, obj_size); |
3905 CollectedHeap::fill_with_object(mr); | 3955 CollectedHeap::fill_with_object(mr); |
3906 _cm->clearRangeBothMaps(mr); | 3956 _cm->clearRangeBothMaps(mr); |
3907 } | 3957 } |
3908 } | 3958 } |
3909 }; | 3959 }; |
3919 cl = &immediate_update; | 3969 cl = &immediate_update; |
3920 } | 3970 } |
3921 HeapRegion* cur = g1_policy()->collection_set(); | 3971 HeapRegion* cur = g1_policy()->collection_set(); |
3922 while (cur != NULL) { | 3972 while (cur != NULL) { |
3923 assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!"); | 3973 assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!"); |
3924 | 3974 assert(!cur->isHumongous(), "sanity"); |
3925 RemoveSelfPointerClosure rspc(_g1h, cl); | 3975 |
3926 if (cur->evacuation_failed()) { | 3976 if (cur->evacuation_failed()) { |
3927 assert(cur->in_collection_set(), "bad CS"); | 3977 assert(cur->in_collection_set(), "bad CS"); |
3978 RemoveSelfPointerClosure rspc(_g1h, cur, cl); | |
3979 | |
3980 cur->reset_bot(); | |
3928 cl->set_region(cur); | 3981 cl->set_region(cur); |
3929 cur->object_iterate(&rspc); | 3982 cur->object_iterate(&rspc); |
3930 | 3983 |
3931 // A number of manipulations to make the TAMS be the current top, | 3984 // A number of manipulations to make the TAMS be the current top, |
3932 // and the marked bytes be the ones observed in the iteration. | 3985 // and the marked bytes be the ones observed in the iteration. |
3985 while (_evac_failure_scan_stack->length() > 0) { | 4038 while (_evac_failure_scan_stack->length() > 0) { |
3986 oop obj = _evac_failure_scan_stack->pop(); | 4039 oop obj = _evac_failure_scan_stack->pop(); |
3987 _evac_failure_closure->set_region(heap_region_containing(obj)); | 4040 _evac_failure_closure->set_region(heap_region_containing(obj)); |
3988 obj->oop_iterate_backwards(_evac_failure_closure); | 4041 obj->oop_iterate_backwards(_evac_failure_closure); |
3989 } | 4042 } |
3990 } | |
3991 | |
3992 void G1CollectedHeap::handle_evacuation_failure(oop old) { | |
3993 markOop m = old->mark(); | |
3994 // forward to self | |
3995 assert(!old->is_forwarded(), "precondition"); | |
3996 | |
3997 old->forward_to(old); | |
3998 handle_evacuation_failure_common(old, m); | |
3999 } | 4043 } |
4000 | 4044 |
4001 oop | 4045 oop |
4002 G1CollectedHeap::handle_evacuation_failure_par(OopsInHeapRegionClosure* cl, | 4046 G1CollectedHeap::handle_evacuation_failure_par(OopsInHeapRegionClosure* cl, |
4003 oop old) { | 4047 oop old) { |