1. 程式人生 > 其它 >Jvm年輕代複製到Survivor To區時,物件存放不下會發生什麼?

Jvm年輕代複製到Survivor To區時,物件存放不下會發生什麼?

如果To區放不下會直接晉升到老年代

oop DefNewGeneration::copy_to_survivor_space(oop old) {
  assert(is_in_reserved(old) && !old->is_forwarded(),
         "shouldn't be scavenging this oop");
  size_t s = old->size();
  oop obj = NULL;
 
  // Try allocating obj in to-space (unless too old)
  if (old->age() < tenuring_threshold()) {
    //如果物件的年齡低於tenuring_threshold,則該在to區申請一塊同樣大小的記憶體
    obj = (oop) to()->allocate_aligned(s);
  }
 
  // Otherwise try allocating obj tenured
  if (obj == NULL) {
    //如果如果物件的年齡大於tenuring_threshold或者to區申請記憶體失敗
    //則嘗試將該物件複製到老年代
    obj = _next_gen->promote(old, s);
    if (obj == NULL) {
      //複製失敗
      handle_promotion_failure(old);
      return old;
    }
  } else {
    //to區中申請記憶體成功
    const intx interval = PrefetchCopyIntervalInBytes;
    Prefetch::write(obj, interval);
 
    //物件複製
    Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)obj, s);
 
    //增加年齡,並修改age_table,增加對應年齡的總物件大小
    //注意此處是增加複製物件而非原來物件的分代年齡
    obj->incr_age();
    age_table()->add(obj, s);
  }
 
  //將物件頭指標指向新地址
  old->forward_to(obj);
 
  return obj;
}