js引擎v8源码分析之SemiSpace(基于v8 0.1.5)

SemiSpace的管理新生代内存的类,即我们常听到的from区和to区。from区和to区都由一个SemiSpace对象管理。SemiSpace只管理地址,不负责分配和释放管理的内存。下面是Semispace类的定义。

class SemiSpace  BASE_EMBEDDED {
 public:
  SemiSpace(int initial_capacity, int maximum_capacity);
  bool Setup(Address start, int size);
  void TearDown();
  bool HasBeenSetup() { return start_ != NULL; }
  bool Double();
  Address low() { return start_; }
  Address high() { return low() + capacity_; }
  Address age_mark() { return age_mark_; }
  void set_age_mark(Address mark) { age_mark_ = mark; }
  // 判断地址a是否在该对象管理的内存中,&address_mask即让a减去size-1的大小。如果等于start说明在管理范围内
  bool Contains(Address a) {
    return (reinterpret_cast<uint32_t>(a) & address_mask_) == reinterpret_cast<uint32_t>(start_);
  }
  // 类似上面的逻辑,但是堆对象低位是标记,判断时候需要处理一下,加SetUp
  bool Contains(Object* o) {
    return (reinterpret_cast<uint32_t>(o) & object_mask_) == object_expected_;
  }
  // 距离开始地址的p
  int SpaceOffsetForAddress(Address addr) { return addr - low(); }
  
 private:
  int capacity_;
  int maximum_capacity_;
  Address start_;
  Address age_mark_;
  // 见SetUp函数
  uint32_t address_mask_;
  uint32_t object_mask_;
  uint32_t object_expected_;

 public:
  TRACK_MEMORY("SemiSpace")
};

下面是SemiSpace类的实现。

SemiSpace

新建一个SemiSpace对象的时候默认初始化某些字段。这些字段的真正设置在SetUp函数。

SemiSpace::SemiSpace(int initial_capacity, int maximum_capacity)
    : capacity_(initial_capacity), 
      maximum_capacity_(maximum_capacity),
      start_(NULL), 
      age_mark_(NULL) {
}

Setup

Setup函数是初始化SemiSpace对象属性的函数

// 设置管理的地址范围
bool SemiSpace::Setup(Address start, int size) {
  ASSERT(size == maximum_capacity_);
  // 判断地址的有效性
  if (!MemoryAllocator::CommitBlock(start, capacity_)) return false;
  // 管理地址空间的首地址
  start_ = start;
  // 低于有效范围的掩码,即保证相与后的值小于等于管理的地址范围
  address_mask_ = ~(size - 1);
  // 计算堆对象地址掩码,低位是标记位,判断的时候需要保留,kHeapObjectTag是堆对象的标记
  object_mask_ = address_mask_ | kHeapObjectTag;
  // 见contains函数,对象地址里低位是标记位,判断的时候需要带上
  object_expected_ = reinterpret_cast<uint32_t>(start) | kHeapObjectTag;
  // gc相关
  age_mark_ = start_;
  return true;
}

TearDown

重置SemiSpace管理的地址,但不负责释放内存。

void SemiSpace::TearDown() {
  start_ = NULL;
  capacity_ = 0;
}

Double

“扩容”函数,只不负责内存的分配,只对管理的大小进行扩容。

bool SemiSpace::Double() {
  // 内存在其他地方分配了,这里校验地址是否合法,即是否分配了
  if (!MemoryAllocator::CommitBlock(high(), capacity_)) return false;
  capacity_ *= 2;
  return true;
}

SemiSpace的功能比较简单,有些属性的使用后续用到的时候再分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要下载elasticsearchhead0.1.5谷歌插件,您可以按照以下步骤进行操作: 1. 首先,打开您的Chrome浏览器,并在地址栏中输入"Chrome网上应用店"。 2. 在搜索栏中,输入"elasticsearchhead0.1.5"并点击搜索按钮。 3. 在搜索结果中,应该能找到相关的插件。请确保选择的插件是"elasticsearchhead0.1.5"。 4. 点击插件的名称或图标,进入插件的详情页面。 5. 在详情页面,您将看到一个"添加至Chrome"的按钮。点击该按钮以安装插件。 6. 安装完成后,您将收到一个确认消息,并且插件的图标将出现在Chrome浏览器的工具栏或扩展程序区域。 7. 现在,您已成功下载并安装了elasticsearchhead0.1.5谷歌插件。 请注意,插件的下载和安装过程可能因不同的Chrome浏览器版本而有所不同。如果您遇到任何问题,请参考官方文档或在相关论坛寻求帮助。 ### 回答2: Elasticsearch Head是一个用于查看和管理Elasticsearch集群的插件。虽然插件名称中包含谷歌,但实际上Elasticsearch Head插件不是谷歌官方出品的插件,它是开社区开发的一个插件。要下载Elasticsearch Head插件,可以按照以下步骤进行操作: 1. 打开谷歌浏览器,进入插件商店。 2. 在插件商店搜索框中输入“Elasticsearch Head”并回车。 3. 在搜索结果中选择合适的插件,通常是由mobz开发的插件。 4. 点击插件卡片上的“添加至Chrome”按钮,开始下载和安装插件。 5. 下载完成后,浏览器右上角会出现一个新的插件图标。 6. 点击插件图标,弹出一个新的页面,输入Elasticsearch集群的地址和端口号。 7. 输入正确的地址和端口号后,点击连接按钮,即可访问和管理Elasticsearch集群。 需要注意的是,Elasticsearch Head插件只适用于谷歌浏览器,其他浏览器可能无法使用该插件。此外,插件下载和使用需要一定的网络条件和相关知识,对于不熟悉的用户,可以参考相关教程或向社区寻求帮助。 ### 回答3: 要下载elasticsearch-head 0.1.5插件,可以按照以下步骤进行操作: 1. 打开谷歌浏览器,并在地址栏中输入“elasticsearch-head 0.1.5谷歌插件下载”。 2. 在搜索结果页面,可以找到elasticsearch-head插件的官方下载页面或第三方站点提供的下载链接。 3. 点击相关链接,进入插件下载页面。 4. 在插件下载页面,可以选择合适的插件版本,确认选择0.1.5版本。 5. 阅读下载页面上的相关信息,了解插件的功能和适用版本。 6. 确认无误后,点击下载按钮开始下载插件。 7. 下载完成后,根据提示,将下载的插件文件保存到本地计算机的特定文件夹中。 8. 在谷歌浏览器中,点击浏览器右上方三个点的菜单按钮,选择“更多工具”->“扩展程序”。 9. 在打开的扩展程序页面上,找到“elasticsearch-head”插件,并启用它。 10. 完成上述操作后,elasticsearch-head插件将被成功安装,并在浏览器的工具栏上显示图标,点击图标即可使用该插件进行Elasticsearch相关操作。 请注意,在下载和安装插件的过程中,要确保从官方或可信赖的第三方网站下载插件,以避免安全隐患。另外,确认插件的兼容性和适用版本,以确保它能够正常运行在您的谷歌浏览器上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值