Jvm年輕代複製到Survivor To區時,物件存放不下會發生什麼?
阿新 • • 發佈:2021-07-01
如果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; }