< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp

Print this page

 54 
 55 void ShenandoahAsserts::print_obj(ShenandoahMessageBuffer& msg, oop obj) {
 56   ShenandoahHeap* heap = ShenandoahHeap::heap();
 57   ShenandoahHeapRegion *r = heap->heap_region_containing(obj);
 58 
 59   ResourceMark rm;
 60   stringStream ss;
 61   r->print_on(&ss);
 62 
 63   stringStream mw_ss;
 64   obj->mark().print_on(&mw_ss);
 65 
 66   ShenandoahMarkingContext* const ctx = heap->marking_context();
 67 
 68   msg.append("  " PTR_FORMAT " - klass " PTR_FORMAT " %s\n", p2i(obj), p2i(obj->klass()), obj->klass()->external_name());
 69   msg.append("    %3s allocated after mark start\n", ctx->allocated_after_mark_start(obj) ? "" : "not");
 70   msg.append("    %3s after update watermark\n",     cast_from_oop<HeapWord*>(obj) >= r->get_update_watermark() ? "" : "not");
 71   msg.append("    %3s marked strong\n",              ctx->is_marked_strong(obj) ? "" : "not");
 72   msg.append("    %3s marked weak\n",                ctx->is_marked_weak(obj) ? "" : "not");
 73   msg.append("    %3s in collection set\n",          heap->in_collection_set(obj) ? "" : "not");



 74   msg.append("  mark:%s\n", mw_ss.freeze());
 75   msg.append("  region: %s", ss.freeze());
 76 }
 77 
 78 void ShenandoahAsserts::print_non_obj(ShenandoahMessageBuffer& msg, void* loc) {
 79   ShenandoahHeap* heap = ShenandoahHeap::heap();
 80   if (heap->is_in_reserved(loc)) {
 81     msg.append("  inside Java heap\n");
 82     ShenandoahHeapRegion *r = heap->heap_region_containing(loc);
 83     stringStream ss;
 84     r->print_on(&ss);
 85 
 86     msg.append("    %3s in collection set\n",    heap->in_collection_set_loc(loc) ? "" : "not");
 87     msg.append("  region: %s", ss.freeze());
 88   } else {
 89     msg.append("  outside of Java heap\n");
 90     stringStream ss;
 91     os::print_location(&ss, (intptr_t) loc, false);
 92     msg.append("  %s", ss.freeze());
 93   }

245     if (!heap->is_in(fwd)) {
246       print_failure(_safe_oop, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
247                     "Forwardee should be in active region area",
248                     file, line);
249     }
250 
251     if (heap->heap_region_index_containing(fwd) == heap->heap_region_index_containing(obj)) {
252       print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
253                     "Non-trivial forwardee should be in another region",
254                     file, line);
255     }
256 
257     // Step 4. Check for multiple forwardings
258     oop fwd2 = ShenandoahForwarding::get_forwardee_raw_unchecked(fwd);
259     if (fwd != fwd2) {
260       print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
261                     "Multiple forwardings",
262                     file, line);
263     }
264   }



















265 }
266 
267 void ShenandoahAsserts::assert_in_correct_region(void* interior_loc, oop obj, const char* file, int line) {
268   assert_correct(interior_loc, obj, file, line);
269 
270   ShenandoahHeap* heap = ShenandoahHeap::heap();
271   ShenandoahHeapRegion* r = heap->heap_region_containing(obj);
272   if (!r->is_active()) {
273     print_failure(_safe_unknown, obj, interior_loc, nullptr, "Shenandoah assert_in_correct_region failed",
274                   "Object must reside in active region",
275                   file, line);
276   }
277 
278   size_t alloc_size = obj->size();
279   if (alloc_size > ShenandoahHeapRegion::humongous_threshold_words()) {
280     size_t idx = r->index();
281     size_t num_regions = ShenandoahHeapRegion::required_regions(alloc_size * HeapWordSize);
282     for (size_t i = idx; i < idx + num_regions; i++) {
283       ShenandoahHeapRegion* chain_reg = heap->get_region(i);
284       if (i == idx && !chain_reg->is_humongous_start()) {
285         print_failure(_safe_unknown, obj, interior_loc, nullptr, "Shenandoah assert_in_correct_region failed",
286                       "Object must reside in humongous start",
287                       file, line);
288       }
289       if (i != idx && !chain_reg->is_humongous_continuation()) {
290         print_failure(_safe_oop, obj, interior_loc, nullptr, "Shenandoah assert_in_correct_region failed",
291                       "Humongous continuation should be of proper size",
292                       file, line);
293       }
294     }
295   }
296 }
297 
298 void ShenandoahAsserts::assert_forwarded(void* interior_loc, oop obj, const char* file, int line) {
299   assert_correct(interior_loc, obj, file, line);

380                   file, line);
381   }
382 }
383 
384 void ShenandoahAsserts::print_rp_failure(const char *label, BoolObjectClosure* actual,
385                                          const char *file, int line) {
386   ShenandoahMessageBuffer msg("%s\n", label);
387   msg.append(" Actual:                  " PTR_FORMAT "\n", p2i(actual));
388   report_vm_error(file, line, msg.buffer());
389 }
390 
391 void ShenandoahAsserts::assert_locked_or_shenandoah_safepoint(Mutex* lock, const char* file, int line) {
392   if (ShenandoahSafepoint::is_at_shenandoah_safepoint()) {
393     return;
394   }
395 
396   if (lock->owned_by_self()) {
397     return;
398   }
399 
400   ShenandoahMessageBuffer msg("Must ba at a Shenandoah safepoint or held %s lock", lock->name());
401   report_vm_error(file, line, msg.buffer());
402 }
403 
404 void ShenandoahAsserts::assert_heaplocked(const char* file, int line) {
405   ShenandoahHeap* heap = ShenandoahHeap::heap();
406 
407   if (heap->lock()->owned_by_self()) {
408     return;
409   }
410 
411   ShenandoahMessageBuffer msg("Heap lock must be owned by current thread");
412   report_vm_error(file, line, msg.buffer());
413 }
414 
415 void ShenandoahAsserts::assert_not_heaplocked(const char* file, int line) {
416   ShenandoahHeap* heap = ShenandoahHeap::heap();
417 
418   if (!heap->lock()->owned_by_self()) {
419     return;
420   }
421 
422   ShenandoahMessageBuffer msg("Heap lock must not be owned by current thread");
423   report_vm_error(file, line, msg.buffer());
424 }
425 
426 void ShenandoahAsserts::assert_heaplocked_or_safepoint(const char* file, int line) {
427   ShenandoahHeap* heap = ShenandoahHeap::heap();
428 
429   if (heap->lock()->owned_by_self()) {
430     return;
431   }
432 
433   if (ShenandoahSafepoint::is_at_shenandoah_safepoint() && Thread::current()->is_VM_thread()) {
434     return;
435   }
436 
437   ShenandoahMessageBuffer msg("Heap lock must be owned by current thread, or be at safepoint");
438   report_vm_error(file, line, msg.buffer());
439 }














































 54 
 55 void ShenandoahAsserts::print_obj(ShenandoahMessageBuffer& msg, oop obj) {
 56   ShenandoahHeap* heap = ShenandoahHeap::heap();
 57   ShenandoahHeapRegion *r = heap->heap_region_containing(obj);
 58 
 59   ResourceMark rm;
 60   stringStream ss;
 61   r->print_on(&ss);
 62 
 63   stringStream mw_ss;
 64   obj->mark().print_on(&mw_ss);
 65 
 66   ShenandoahMarkingContext* const ctx = heap->marking_context();
 67 
 68   msg.append("  " PTR_FORMAT " - klass " PTR_FORMAT " %s\n", p2i(obj), p2i(obj->klass()), obj->klass()->external_name());
 69   msg.append("    %3s allocated after mark start\n", ctx->allocated_after_mark_start(obj) ? "" : "not");
 70   msg.append("    %3s after update watermark\n",     cast_from_oop<HeapWord*>(obj) >= r->get_update_watermark() ? "" : "not");
 71   msg.append("    %3s marked strong\n",              ctx->is_marked_strong(obj) ? "" : "not");
 72   msg.append("    %3s marked weak\n",                ctx->is_marked_weak(obj) ? "" : "not");
 73   msg.append("    %3s in collection set\n",          heap->in_collection_set(obj) ? "" : "not");
 74   if (heap->mode()->is_generational() && !obj->is_forwarded()) {
 75     msg.append("  age: %d\n", obj->age());
 76   }
 77   msg.append("  mark:%s\n", mw_ss.freeze());
 78   msg.append("  region: %s", ss.freeze());
 79 }
 80 
 81 void ShenandoahAsserts::print_non_obj(ShenandoahMessageBuffer& msg, void* loc) {
 82   ShenandoahHeap* heap = ShenandoahHeap::heap();
 83   if (heap->is_in_reserved(loc)) {
 84     msg.append("  inside Java heap\n");
 85     ShenandoahHeapRegion *r = heap->heap_region_containing(loc);
 86     stringStream ss;
 87     r->print_on(&ss);
 88 
 89     msg.append("    %3s in collection set\n",    heap->in_collection_set_loc(loc) ? "" : "not");
 90     msg.append("  region: %s", ss.freeze());
 91   } else {
 92     msg.append("  outside of Java heap\n");
 93     stringStream ss;
 94     os::print_location(&ss, (intptr_t) loc, false);
 95     msg.append("  %s", ss.freeze());
 96   }

248     if (!heap->is_in(fwd)) {
249       print_failure(_safe_oop, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
250                     "Forwardee should be in active region area",
251                     file, line);
252     }
253 
254     if (heap->heap_region_index_containing(fwd) == heap->heap_region_index_containing(obj)) {
255       print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
256                     "Non-trivial forwardee should be in another region",
257                     file, line);
258     }
259 
260     // Step 4. Check for multiple forwardings
261     oop fwd2 = ShenandoahForwarding::get_forwardee_raw_unchecked(fwd);
262     if (fwd != fwd2) {
263       print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
264                     "Multiple forwardings",
265                     file, line);
266     }
267   }
268 
269   // Do additional checks for special objects: their fields can hold metadata as well.
270   // We want to check class loading/unloading did not corrupt them.
271 
272   if (obj_klass == vmClasses::Class_klass()) {
273     Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset());
274     if (klass != nullptr && !Metaspace::contains(klass)) {
275       print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
276                     "Instance class mirror should point to Metaspace",
277                     file, line);
278     }
279 
280     Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset());
281     if (array_klass != nullptr && !Metaspace::contains(array_klass)) {
282       print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed",
283                     "Array class mirror should point to Metaspace",
284                     file, line);
285     }
286   }
287 }
288 
289 void ShenandoahAsserts::assert_in_correct_region(void* interior_loc, oop obj, const char* file, int line) {
290   assert_correct(interior_loc, obj, file, line);
291 
292   ShenandoahHeap* heap = ShenandoahHeap::heap();
293   ShenandoahHeapRegion* r = heap->heap_region_containing(obj);
294   if (!r->is_active()) {
295     print_failure(_safe_unknown, obj, interior_loc, nullptr, "Shenandoah assert_in_correct_region failed",
296                   "Object must reside in active region",
297                   file, line);
298   }
299 
300   size_t alloc_size = obj->size();
301   if (ShenandoahHeapRegion::requires_humongous(alloc_size)) {
302     size_t idx = r->index();
303     size_t num_regions = ShenandoahHeapRegion::required_regions(alloc_size * HeapWordSize);
304     for (size_t i = idx; i < idx + num_regions; i++) {
305       ShenandoahHeapRegion* chain_reg = heap->get_region(i);
306       if (i == idx && !chain_reg->is_humongous_start()) {
307         print_failure(_safe_unknown, obj, interior_loc, nullptr, "Shenandoah assert_in_correct_region failed",
308                       "Object must reside in humongous start",
309                       file, line);
310       }
311       if (i != idx && !chain_reg->is_humongous_continuation()) {
312         print_failure(_safe_oop, obj, interior_loc, nullptr, "Shenandoah assert_in_correct_region failed",
313                       "Humongous continuation should be of proper size",
314                       file, line);
315       }
316     }
317   }
318 }
319 
320 void ShenandoahAsserts::assert_forwarded(void* interior_loc, oop obj, const char* file, int line) {
321   assert_correct(interior_loc, obj, file, line);

402                   file, line);
403   }
404 }
405 
406 void ShenandoahAsserts::print_rp_failure(const char *label, BoolObjectClosure* actual,
407                                          const char *file, int line) {
408   ShenandoahMessageBuffer msg("%s\n", label);
409   msg.append(" Actual:                  " PTR_FORMAT "\n", p2i(actual));
410   report_vm_error(file, line, msg.buffer());
411 }
412 
413 void ShenandoahAsserts::assert_locked_or_shenandoah_safepoint(Mutex* lock, const char* file, int line) {
414   if (ShenandoahSafepoint::is_at_shenandoah_safepoint()) {
415     return;
416   }
417 
418   if (lock->owned_by_self()) {
419     return;
420   }
421 
422   ShenandoahMessageBuffer msg("Must be at a Shenandoah safepoint or held %s lock", lock->name());
423   report_vm_error(file, line, msg.buffer());
424 }
425 
426 void ShenandoahAsserts::assert_heaplocked(const char* file, int line) {
427   ShenandoahHeap* heap = ShenandoahHeap::heap();
428 
429   if (heap->lock()->owned_by_self()) {
430     return;
431   }
432 
433   ShenandoahMessageBuffer msg("Heap lock must be owned by current thread");
434   report_vm_error(file, line, msg.buffer());
435 }
436 
437 void ShenandoahAsserts::assert_not_heaplocked(const char* file, int line) {
438   ShenandoahHeap* heap = ShenandoahHeap::heap();
439 
440   if (!heap->lock()->owned_by_self()) {
441     return;
442   }
443 
444   ShenandoahMessageBuffer msg("Heap lock must not be owned by current thread");
445   report_vm_error(file, line, msg.buffer());
446 }
447 
448 void ShenandoahAsserts::assert_heaplocked_or_safepoint(const char* file, int line) {
449   ShenandoahHeap* heap = ShenandoahHeap::heap();
450 
451   if (heap->lock()->owned_by_self()) {
452     return;
453   }
454 
455   if (ShenandoahSafepoint::is_at_shenandoah_safepoint()) {
456     return;
457   }
458 
459   ShenandoahMessageBuffer msg("Heap lock must be owned by current thread, or be at safepoint");
460   report_vm_error(file, line, msg.buffer());
461 }
462 
463 void ShenandoahAsserts::assert_generational(const char* file, int line) {
464   if (ShenandoahHeap::heap()->mode()->is_generational()) {
465     return;
466   }
467 
468   ShenandoahMessageBuffer msg("Must be in generational mode");
469   report_vm_error(file, line, msg.buffer());
470 }
471 
472 void ShenandoahAsserts::assert_control_or_vm_thread_at_safepoint(bool at_safepoint, const char* file, int line) {
473   Thread* thr = Thread::current();
474   if (thr == ShenandoahHeap::heap()->control_thread()) {
475     return;
476   }
477   if (thr->is_VM_thread()) {
478     if (!at_safepoint) {
479       return;
480     } else if (SafepointSynchronize::is_at_safepoint()) {
481       return;
482     }
483   }
484 
485   ShenandoahMessageBuffer msg("Must be either control thread, or vm thread");
486   if (at_safepoint) {
487     msg.append(" at a safepoint");
488   }
489   report_vm_error(file, line, msg.buffer());
490 }
491 
492 void ShenandoahAsserts::assert_generations_reconciled(const char* file, int line) {
493   if (!SafepointSynchronize::is_at_safepoint()) {
494     return;
495   }
496 
497   ShenandoahHeap* heap = ShenandoahHeap::heap();
498   ShenandoahGeneration* ggen = heap->gc_generation();
499   ShenandoahGeneration* agen = heap->active_generation();
500   if (agen == ggen) {
501     return;
502   }
503 
504   ShenandoahMessageBuffer msg("Active(%d) & GC(%d) Generations aren't reconciled", agen->type(), ggen->type());
505   report_vm_error(file, line, msg.buffer());
506 }
< prev index next >