comparison src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
180 uint queue_size; 180 uint queue_size;
181 if (depth_first()) { 181 if (depth_first()) {
182 claimed_stack_depth()->initialize(); 182 claimed_stack_depth()->initialize();
183 queue_size = claimed_stack_depth()->max_elems(); 183 queue_size = claimed_stack_depth()->max_elems();
184 // We want the overflow stack to be permanent 184 // We want the overflow stack to be permanent
185 _overflow_stack_depth = new (ResourceObj::C_HEAP) GrowableArray<oop*>(10, true); 185 _overflow_stack_depth = new (ResourceObj::C_HEAP) GrowableArray<StarTask>(10, true);
186 _overflow_stack_breadth = NULL; 186 _overflow_stack_breadth = NULL;
187 } else { 187 } else {
188 claimed_stack_breadth()->initialize(); 188 claimed_stack_breadth()->initialize();
189 queue_size = claimed_stack_breadth()->max_elems(); 189 queue_size = claimed_stack_breadth()->max_elems();
190 // We want the overflow stack to be permanent 190 // We want the overflow stack to be permanent
238 _total_steals = 0; 238 _total_steals = 0;
239 _masked_steals = 0; 239 _masked_steals = 0;
240 #endif // PS_PM_STATS 240 #endif // PS_PM_STATS
241 } 241 }
242 242
243
243 void PSPromotionManager::drain_stacks_depth(bool totally_drain) { 244 void PSPromotionManager::drain_stacks_depth(bool totally_drain) {
244 assert(depth_first(), "invariant"); 245 assert(depth_first(), "invariant");
245 assert(overflow_stack_depth() != NULL, "invariant"); 246 assert(overflow_stack_depth() != NULL, "invariant");
246 totally_drain = totally_drain || _totally_drain; 247 totally_drain = totally_drain || _totally_drain;
247 248
252 MutableSpace* old_space = heap->old_gen()->object_space(); 253 MutableSpace* old_space = heap->old_gen()->object_space();
253 MutableSpace* perm_space = heap->perm_gen()->object_space(); 254 MutableSpace* perm_space = heap->perm_gen()->object_space();
254 #endif /* ASSERT */ 255 #endif /* ASSERT */
255 256
256 do { 257 do {
257 oop* p; 258 StarTask p;
258 259
259 // Drain overflow stack first, so other threads can steal from 260 // Drain overflow stack first, so other threads can steal from
260 // claimed stack while we work. 261 // claimed stack while we work.
261 while(!overflow_stack_depth()->is_empty()) { 262 while(!overflow_stack_depth()->is_empty()) {
262 p = overflow_stack_depth()->pop(); 263 // linux compiler wants different overloaded operator= in taskqueue to
263 process_popped_location_depth(p); 264 // assign to p that the other compilers don't like.
265 StarTask ptr = overflow_stack_depth()->pop();
266 process_popped_location_depth(ptr);
264 } 267 }
265 268
266 if (totally_drain) { 269 if (totally_drain) {
267 while (claimed_stack_depth()->pop_local(p)) { 270 while (claimed_stack_depth()->pop_local(p)) {
268 process_popped_location_depth(p); 271 process_popped_location_depth(p);
363 // into smaller submethods, but we need to be careful not to hurt 366 // into smaller submethods, but we need to be careful not to hurt
364 // performance. 367 // performance.
365 // 368 //
366 369
367 oop PSPromotionManager::copy_to_survivor_space(oop o, bool depth_first) { 370 oop PSPromotionManager::copy_to_survivor_space(oop o, bool depth_first) {
368 assert(PSScavenge::should_scavenge(o), "Sanity"); 371 assert(PSScavenge::should_scavenge(&o), "Sanity");
369 372
370 oop new_obj = NULL; 373 oop new_obj = NULL;
371 374
372 // NOTE! We must be very careful with any methods that access the mark 375 // NOTE! We must be very careful with any methods that access the mark
373 // in o. There may be multiple threads racing on it, and it may be forwarded 376 // in o. There may be multiple threads racing on it, and it may be forwarded
528 531
529 #ifdef DEBUG 532 #ifdef DEBUG
530 // This code must come after the CAS test, or it will print incorrect 533 // This code must come after the CAS test, or it will print incorrect
531 // information. 534 // information.
532 if (TraceScavenge) { 535 if (TraceScavenge) {
533 gclog_or_tty->print_cr("{%s %s 0x%x -> 0x%x (%d)}", 536 gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (" SIZE_FORMAT ")}",
534 PSScavenge::should_scavenge(new_obj) ? "copying" : "tenuring", 537 PSScavenge::should_scavenge(&new_obj) ? "copying" : "tenuring",
535 new_obj->blueprint()->internal_name(), o, new_obj, new_obj->size()); 538 new_obj->blueprint()->internal_name(), o, new_obj, new_obj->size());
536
537 } 539 }
538 #endif 540 #endif
539 541
540 return new_obj; 542 return new_obj;
543 }
544
545 template <class T> void PSPromotionManager::process_array_chunk_work(
546 oop obj,
547 int start, int end) {
548 assert(start < end, "invariant");
549 T* const base = (T*)objArrayOop(obj)->base();
550 T* p = base + start;
551 T* const chunk_end = base + end;
552 while (p < chunk_end) {
553 if (PSScavenge::should_scavenge(p)) {
554 claim_or_forward_depth(p);
555 }
556 ++p;
557 }
541 } 558 }
542 559
543 void PSPromotionManager::process_array_chunk(oop old) { 560 void PSPromotionManager::process_array_chunk(oop old) {
544 assert(PSChunkLargeArrays, "invariant"); 561 assert(PSChunkLargeArrays, "invariant");
545 assert(old->is_objArray(), "invariant"); 562 assert(old->is_objArray(), "invariant");
567 start = 0; 584 start = 0;
568 int const actual_length = arrayOop(obj)->length(); 585 int const actual_length = arrayOop(obj)->length();
569 arrayOop(old)->set_length(actual_length); 586 arrayOop(old)->set_length(actual_length);
570 } 587 }
571 588
572 assert(start < end, "invariant"); 589 if (UseCompressedOops) {
573 oop* const base = objArrayOop(obj)->base(); 590 process_array_chunk_work<narrowOop>(obj, start, end);
574 oop* p = base + start; 591 } else {
575 oop* const chunk_end = base + end; 592 process_array_chunk_work<oop>(obj, start, end);
576 while (p < chunk_end) {
577 if (PSScavenge::should_scavenge(*p)) {
578 claim_or_forward_depth(p);
579 }
580 ++p;
581 } 593 }
582 } 594 }
583 595
584 oop PSPromotionManager::oop_promotion_failed(oop obj, markOop obj_mark) { 596 oop PSPromotionManager::oop_promotion_failed(oop obj, markOop obj_mark) {
585 assert(_old_gen_is_full || PromotionFailureALot, "Sanity"); 597 assert(_old_gen_is_full || PromotionFailureALot, "Sanity");