zoukankan      html  css  js  c++  java
  • 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;
    }
     
    
  • 相关阅读:
    php的迭代器
    memcache学习使用
    php数组操作小结
    ThinkPHP-3.2.3学习
    正则
    PHP中$_FILES的使用方法及注意事项说明
    子进程管理模块subprocess
    atexit模块解析
    GNU自动补全模块readline解析
    python命令行解析工具argparse模块【3】
  • 原文地址:https://www.cnblogs.com/huisunan/p/14959949.html
Copyright © 2011-2022 走看看