comparison src/share/vm/memory/referenceProcessor.cpp @ 4728:441e946dc1af

7121618: Change type of number of GC workers to unsigned int. Summary: Change variables representing the number of GC workers to uint from int and size_t. Change the parameter in work(int i) to work(uint worker_id). Reviewed-by: brutisso, tonyp
author jmasa
date Wed, 14 Dec 2011 13:34:57 -0800
parents e7dead7e90af
children d2a62e0f25eb
comparison
equal deleted inserted replaced
4727:67fdcb391461 4728:441e946dc1af
86 _discovering_refs = true; 86 _discovering_refs = true;
87 } 87 }
88 88
89 ReferenceProcessor::ReferenceProcessor(MemRegion span, 89 ReferenceProcessor::ReferenceProcessor(MemRegion span,
90 bool mt_processing, 90 bool mt_processing,
91 int mt_processing_degree, 91 uint mt_processing_degree,
92 bool mt_discovery, 92 bool mt_discovery,
93 int mt_discovery_degree, 93 uint mt_discovery_degree,
94 bool atomic_discovery, 94 bool atomic_discovery,
95 BoolObjectClosure* is_alive_non_header, 95 BoolObjectClosure* is_alive_non_header,
96 bool discovered_list_needs_barrier) : 96 bool discovered_list_needs_barrier) :
97 _discovering_refs(false), 97 _discovering_refs(false),
98 _enqueuing_is_done(false), 98 _enqueuing_is_done(false),
103 _next_id(0) 103 _next_id(0)
104 { 104 {
105 _span = span; 105 _span = span;
106 _discovery_is_atomic = atomic_discovery; 106 _discovery_is_atomic = atomic_discovery;
107 _discovery_is_mt = mt_discovery; 107 _discovery_is_mt = mt_discovery;
108 _num_q = MAX2(1, mt_processing_degree); 108 _num_q = MAX2(1U, mt_processing_degree);
109 _max_num_q = MAX2(_num_q, mt_discovery_degree); 109 _max_num_q = MAX2(_num_q, mt_discovery_degree);
110 _discovered_refs = NEW_C_HEAP_ARRAY(DiscoveredList, 110 _discovered_refs = NEW_C_HEAP_ARRAY(DiscoveredList,
111 _max_num_q * number_of_subclasses_of_ref()); 111 _max_num_q * number_of_subclasses_of_ref());
112 if (_discovered_refs == NULL) { 112 if (_discovered_refs == NULL) {
113 vm_exit_during_initialization("Could not allocated RefProc Array"); 113 vm_exit_during_initialization("Could not allocated RefProc Array");
116 _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; 116 _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q];
117 _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; 117 _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q];
118 _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; 118 _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q];
119 119
120 // Initialize all entries to NULL 120 // Initialize all entries to NULL
121 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { 121 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
122 _discovered_refs[i].set_head(NULL); 122 _discovered_refs[i].set_head(NULL);
123 _discovered_refs[i].set_length(0); 123 _discovered_refs[i].set_length(0);
124 } 124 }
125 125
126 // If we do barriers, cache a copy of the barrier set. 126 // If we do barriers, cache a copy of the barrier set.
131 } 131 }
132 132
133 #ifndef PRODUCT 133 #ifndef PRODUCT
134 void ReferenceProcessor::verify_no_references_recorded() { 134 void ReferenceProcessor::verify_no_references_recorded() {
135 guarantee(!_discovering_refs, "Discovering refs?"); 135 guarantee(!_discovering_refs, "Discovering refs?");
136 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { 136 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
137 guarantee(_discovered_refs[i].is_empty(), 137 guarantee(_discovered_refs[i].is_empty(),
138 "Found non-empty discovered list"); 138 "Found non-empty discovered list");
139 } 139 }
140 } 140 }
141 #endif 141 #endif
142 142
143 void ReferenceProcessor::weak_oops_do(OopClosure* f) { 143 void ReferenceProcessor::weak_oops_do(OopClosure* f) {
144 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { 144 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
145 if (UseCompressedOops) { 145 if (UseCompressedOops) {
146 f->do_oop((narrowOop*)_discovered_refs[i].adr_head()); 146 f->do_oop((narrowOop*)_discovered_refs[i].adr_head());
147 } else { 147 } else {
148 f->do_oop((oop*)_discovered_refs[i].adr_head()); 148 f->do_oop((oop*)_discovered_refs[i].adr_head());
149 } 149 }
435 RefProcEnqueueTask tsk(*this, _discovered_refs, 435 RefProcEnqueueTask tsk(*this, _discovered_refs,
436 pending_list_addr, _max_num_q); 436 pending_list_addr, _max_num_q);
437 task_executor->execute(tsk); 437 task_executor->execute(tsk);
438 } else { 438 } else {
439 // Serial code: call the parent class's implementation 439 // Serial code: call the parent class's implementation
440 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { 440 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
441 enqueue_discovered_reflist(_discovered_refs[i], pending_list_addr); 441 enqueue_discovered_reflist(_discovered_refs[i], pending_list_addr);
442 _discovered_refs[i].set_head(NULL); 442 _discovered_refs[i].set_head(NULL);
443 _discovered_refs[i].set_length(0); 443 _discovered_refs[i].set_length(0);
444 } 444 }
445 } 445 }
694 clear_discovered_references(refs_list); 694 clear_discovered_references(refs_list);
695 } 695 }
696 696
697 void ReferenceProcessor::abandon_partial_discovery() { 697 void ReferenceProcessor::abandon_partial_discovery() {
698 // loop over the lists 698 // loop over the lists
699 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { 699 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
700 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { 700 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) {
701 gclog_or_tty->print_cr("\nAbandoning %s discovered list", list_name(i)); 701 gclog_or_tty->print_cr("\nAbandoning %s discovered list", list_name(i));
702 } 702 }
703 abandon_partial_discovered_list(_discovered_refs[i]); 703 abandon_partial_discovered_list(_discovered_refs[i]);
704 } 704 }
785 size_t total_refs = 0; 785 size_t total_refs = 0;
786 if (TraceReferenceGC && PrintGCDetails) { 786 if (TraceReferenceGC && PrintGCDetails) {
787 gclog_or_tty->print_cr("\nBalance ref_lists "); 787 gclog_or_tty->print_cr("\nBalance ref_lists ");
788 } 788 }
789 789
790 for (int i = 0; i < _max_num_q; ++i) { 790 for (uint i = 0; i < _max_num_q; ++i) {
791 total_refs += ref_lists[i].length(); 791 total_refs += ref_lists[i].length();
792 if (TraceReferenceGC && PrintGCDetails) { 792 if (TraceReferenceGC && PrintGCDetails) {
793 gclog_or_tty->print("%d ", ref_lists[i].length()); 793 gclog_or_tty->print("%d ", ref_lists[i].length());
794 } 794 }
795 } 795 }
796 if (TraceReferenceGC && PrintGCDetails) { 796 if (TraceReferenceGC && PrintGCDetails) {
797 gclog_or_tty->print_cr(" = %d", total_refs); 797 gclog_or_tty->print_cr(" = %d", total_refs);
798 } 798 }
799 size_t avg_refs = total_refs / _num_q + 1; 799 size_t avg_refs = total_refs / _num_q + 1;
800 int to_idx = 0; 800 uint to_idx = 0;
801 for (int from_idx = 0; from_idx < _max_num_q; from_idx++) { 801 for (uint from_idx = 0; from_idx < _max_num_q; from_idx++) {
802 bool move_all = false; 802 bool move_all = false;
803 if (from_idx >= _num_q) { 803 if (from_idx >= _num_q) {
804 move_all = ref_lists[from_idx].length() > 0; 804 move_all = ref_lists[from_idx].length() > 0;
805 } 805 }
806 while ((ref_lists[from_idx].length() > avg_refs) || 806 while ((ref_lists[from_idx].length() > avg_refs) ||
855 } 855 }
856 } 856 }
857 } 857 }
858 #ifdef ASSERT 858 #ifdef ASSERT
859 size_t balanced_total_refs = 0; 859 size_t balanced_total_refs = 0;
860 for (int i = 0; i < _max_num_q; ++i) { 860 for (uint i = 0; i < _max_num_q; ++i) {
861 balanced_total_refs += ref_lists[i].length(); 861 balanced_total_refs += ref_lists[i].length();
862 if (TraceReferenceGC && PrintGCDetails) { 862 if (TraceReferenceGC && PrintGCDetails) {
863 gclog_or_tty->print("%d ", ref_lists[i].length()); 863 gclog_or_tty->print("%d ", ref_lists[i].length());
864 } 864 }
865 } 865 }
901 must_balance) { 901 must_balance) {
902 balance_queues(refs_lists); 902 balance_queues(refs_lists);
903 } 903 }
904 if (PrintReferenceGC && PrintGCDetails) { 904 if (PrintReferenceGC && PrintGCDetails) {
905 size_t total = 0; 905 size_t total = 0;
906 for (int i = 0; i < _max_num_q; ++i) { 906 for (uint i = 0; i < _max_num_q; ++i) {
907 total += refs_lists[i].length(); 907 total += refs_lists[i].length();
908 } 908 }
909 gclog_or_tty->print(", %u refs", total); 909 gclog_or_tty->print(", %u refs", total);
910 } 910 }
911 911
917 if (policy != NULL) { 917 if (policy != NULL) {
918 if (mt_processing) { 918 if (mt_processing) {
919 RefProcPhase1Task phase1(*this, refs_lists, policy, true /*marks_oops_alive*/); 919 RefProcPhase1Task phase1(*this, refs_lists, policy, true /*marks_oops_alive*/);
920 task_executor->execute(phase1); 920 task_executor->execute(phase1);
921 } else { 921 } else {
922 for (int i = 0; i < _max_num_q; i++) { 922 for (uint i = 0; i < _max_num_q; i++) {
923 process_phase1(refs_lists[i], policy, 923 process_phase1(refs_lists[i], policy,
924 is_alive, keep_alive, complete_gc); 924 is_alive, keep_alive, complete_gc);
925 } 925 }
926 } 926 }
927 } else { // policy == NULL 927 } else { // policy == NULL
933 // . Traverse the list and remove any refs whose referents are alive. 933 // . Traverse the list and remove any refs whose referents are alive.
934 if (mt_processing) { 934 if (mt_processing) {
935 RefProcPhase2Task phase2(*this, refs_lists, !discovery_is_atomic() /*marks_oops_alive*/); 935 RefProcPhase2Task phase2(*this, refs_lists, !discovery_is_atomic() /*marks_oops_alive*/);
936 task_executor->execute(phase2); 936 task_executor->execute(phase2);
937 } else { 937 } else {
938 for (int i = 0; i < _max_num_q; i++) { 938 for (uint i = 0; i < _max_num_q; i++) {
939 process_phase2(refs_lists[i], is_alive, keep_alive, complete_gc); 939 process_phase2(refs_lists[i], is_alive, keep_alive, complete_gc);
940 } 940 }
941 } 941 }
942 942
943 // Phase 3: 943 // Phase 3:
944 // . Traverse the list and process referents as appropriate. 944 // . Traverse the list and process referents as appropriate.
945 if (mt_processing) { 945 if (mt_processing) {
946 RefProcPhase3Task phase3(*this, refs_lists, clear_referent, true /*marks_oops_alive*/); 946 RefProcPhase3Task phase3(*this, refs_lists, clear_referent, true /*marks_oops_alive*/);
947 task_executor->execute(phase3); 947 task_executor->execute(phase3);
948 } else { 948 } else {
949 for (int i = 0; i < _max_num_q; i++) { 949 for (uint i = 0; i < _max_num_q; i++) {
950 process_phase3(refs_lists[i], clear_referent, 950 process_phase3(refs_lists[i], clear_referent,
951 is_alive, keep_alive, complete_gc); 951 is_alive, keep_alive, complete_gc);
952 } 952 }
953 } 953 }
954 } 954 }
955 955
956 void ReferenceProcessor::clean_up_discovered_references() { 956 void ReferenceProcessor::clean_up_discovered_references() {
957 // loop over the lists 957 // loop over the lists
958 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { 958 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
959 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { 959 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) {
960 gclog_or_tty->print_cr( 960 gclog_or_tty->print_cr(
961 "\nScrubbing %s discovered list of Null referents", 961 "\nScrubbing %s discovered list of Null referents",
962 list_name(i)); 962 list_name(i));
963 } 963 }
998 } 998 }
999 ) 999 )
1000 } 1000 }
1001 1001
1002 inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt) { 1002 inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt) {
1003 int id = 0; 1003 uint id = 0;
1004 // Determine the queue index to use for this object. 1004 // Determine the queue index to use for this object.
1005 if (_discovery_is_mt) { 1005 if (_discovery_is_mt) {
1006 // During a multi-threaded discovery phase, 1006 // During a multi-threaded discovery phase,
1007 // each thread saves to its "own" list. 1007 // each thread saves to its "own" list.
1008 Thread* thr = Thread::current(); 1008 Thread* thr = Thread::current();
1280 #endif 1280 #endif
1281 // Soft references 1281 // Soft references
1282 { 1282 {
1283 TraceTime tt("Preclean SoftReferences", PrintGCDetails && PrintReferenceGC, 1283 TraceTime tt("Preclean SoftReferences", PrintGCDetails && PrintReferenceGC,
1284 false, gclog_or_tty); 1284 false, gclog_or_tty);
1285 for (int i = 0; i < _max_num_q; i++) { 1285 for (uint i = 0; i < _max_num_q; i++) {
1286 if (yield->should_return()) { 1286 if (yield->should_return()) {
1287 return; 1287 return;
1288 } 1288 }
1289 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive, 1289 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
1290 keep_alive, complete_gc, yield); 1290 keep_alive, complete_gc, yield);
1293 1293
1294 // Weak references 1294 // Weak references
1295 { 1295 {
1296 TraceTime tt("Preclean WeakReferences", PrintGCDetails && PrintReferenceGC, 1296 TraceTime tt("Preclean WeakReferences", PrintGCDetails && PrintReferenceGC,
1297 false, gclog_or_tty); 1297 false, gclog_or_tty);
1298 for (int i = 0; i < _max_num_q; i++) { 1298 for (uint i = 0; i < _max_num_q; i++) {
1299 if (yield->should_return()) { 1299 if (yield->should_return()) {
1300 return; 1300 return;
1301 } 1301 }
1302 preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive, 1302 preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive,
1303 keep_alive, complete_gc, yield); 1303 keep_alive, complete_gc, yield);
1306 1306
1307 // Final references 1307 // Final references
1308 { 1308 {
1309 TraceTime tt("Preclean FinalReferences", PrintGCDetails && PrintReferenceGC, 1309 TraceTime tt("Preclean FinalReferences", PrintGCDetails && PrintReferenceGC,
1310 false, gclog_or_tty); 1310 false, gclog_or_tty);
1311 for (int i = 0; i < _max_num_q; i++) { 1311 for (uint i = 0; i < _max_num_q; i++) {
1312 if (yield->should_return()) { 1312 if (yield->should_return()) {
1313 return; 1313 return;
1314 } 1314 }
1315 preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive, 1315 preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive,
1316 keep_alive, complete_gc, yield); 1316 keep_alive, complete_gc, yield);
1319 1319
1320 // Phantom references 1320 // Phantom references
1321 { 1321 {
1322 TraceTime tt("Preclean PhantomReferences", PrintGCDetails && PrintReferenceGC, 1322 TraceTime tt("Preclean PhantomReferences", PrintGCDetails && PrintReferenceGC,
1323 false, gclog_or_tty); 1323 false, gclog_or_tty);
1324 for (int i = 0; i < _max_num_q; i++) { 1324 for (uint i = 0; i < _max_num_q; i++) {
1325 if (yield->should_return()) { 1325 if (yield->should_return()) {
1326 return; 1326 return;
1327 } 1327 }
1328 preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive, 1328 preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive,
1329 keep_alive, complete_gc, yield); 1329 keep_alive, complete_gc, yield);
1384 iter.removed(), iter.processed(), (address)refs_list.head()); 1384 iter.removed(), iter.processed(), (address)refs_list.head());
1385 } 1385 }
1386 ) 1386 )
1387 } 1387 }
1388 1388
1389 const char* ReferenceProcessor::list_name(int i) { 1389 const char* ReferenceProcessor::list_name(uint i) {
1390 assert(i >= 0 && i <= _max_num_q * number_of_subclasses_of_ref(), 1390 assert(i >= 0 && i <= _max_num_q * number_of_subclasses_of_ref(),
1391 "Out of bounds index"); 1391 "Out of bounds index");
1392 1392
1393 int j = i / _max_num_q; 1393 int j = i / _max_num_q;
1394 switch (j) { 1394 switch (j) {
1408 #endif 1408 #endif
1409 1409
1410 #ifndef PRODUCT 1410 #ifndef PRODUCT
1411 void ReferenceProcessor::clear_discovered_references() { 1411 void ReferenceProcessor::clear_discovered_references() {
1412 guarantee(!_discovering_refs, "Discovering refs?"); 1412 guarantee(!_discovering_refs, "Discovering refs?");
1413 for (int i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { 1413 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
1414 clear_discovered_references(_discovered_refs[i]); 1414 clear_discovered_references(_discovered_refs[i]);
1415 } 1415 }
1416 } 1416 }
1417 1417
1418 #endif // PRODUCT 1418 #endif // PRODUCT