v8 存储一个字符串需要多少内存?

2023-12-15

我正在尝试计算 v8 中字符串的内存使用量,并且我知道单个字符将占用 2 个字节。但是当我在开发工具中检查浅层大小和保留大小时,我对结果感到困惑:

function Student() {
    this.name = 'lll';
}

var a = new Student();

var b = new String("ccccc");

enter image description here

浅层大小和保留大小都是 16 字节。为什么?

正如我想象的那样,浅层大小和保留大小将相等,并且该值将是 6 个字节。如果我将字符串从“lll”更改为“llll”,该值将增加 2 个字节。但它保持不变,如下所示:

enter image description here

有人可以向我解释一下吗?


(V8 开发人员在此。)
前面的一般说明:字符串在网络上非常常见,因此 JavaScript 引擎竭尽全力为您可以使用字符串执行的许多不同操作实现许多不同的优化,因此,现代 JS 引擎中的字符串处理系统倾向于变得非常复杂。排除了这一点,我们可以在这里专注于“简单”字符串。

单个字符需要 2 个字节

还有更多内容:V8 在内部区分一字节和两字节字符串。当给定字符串中的所有字符都可以用一个字节表示时,那么(通常)V8 就会这么做。

浅层大小和保留大小都是 16 字节。为什么?

评论者已经发布了一个描述“浅”和“保留”大小之间差异的链接,所以我不会深入讨论。对于简单的字符串来说,它确实总是相同的值。

堆上的所有对象都以一个形状描述符开始,该描述符占用一个指针大小(由于 64 位平台上的“指针压缩”,现在通常为 4 个字节)。

字符串在其对象头中另外还有两个 4 字节的字段:字符串的哈希值(经常需要它,因此为了避免一直重新计算它,它被缓存在那里)和字符串的长度。

之后,他们存储实际的字符。任何堆对象的大小必须是指针大小的倍数,即 4 的倍数,因此字符串的大小将向上舍入;最后几个字节可能未使用。

所以,总而言之,一个简单字符串的大小nASCII 字符为:

12 + 4 * Math.ceil(n/4)

(这可能会随着时间的推移而改变,如果在构建时关闭指针压缩,情况会有所不同,当字符串中有两字节字符时,情况会有所不同,当字符串是“切片”时,情况会有所不同" 或 "cons" 字符串,当该字符串与 Blink 共享时,它会有所不同,而且我可能忘记了某些情况下它也会有所不同。)

如果你稍微扩展你的实验,你会看到:
""占用 12 个字节
"1"通过"1234"占用16字节
"12345"通过"12345678"占用20字节
"123456789"占用 24 个字节,依此类推。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

v8 存储一个字符串需要多少内存? 的相关文章

随机推荐

  • 文件中的 JetBrains PhpStorm 红色不会消失

    我有一些红色的文件 它们绝对没有错误 所有内容都正确编译 网络也正确显示 控制台上有 0 个错误 我实际上是复制粘贴 Angular 教程 它肯定是 100 无错误 但文件仍然是红色的 我很生气 因为它看起来像一个错误 有人有解决这个问题的
  • 使用pyaudio进行录音

    我正在尝试使用 python 录制语音 我尝试使用 pyaudio 模块 它在我的计算机上保存了一个 wav 文件 但录制了静态声音 有什么建议么 import pyaudio import wave CHUNK 1024 FORMAT p
  • 将 Unicode 字符串转换为转义 ASCII 字符串

    我怎样才能转换这个字符串 This string contains the Unicode character Pi 转换成转义的 ASCII 字符串 This string contains the Unicode character P
  • Yii2:验证是否至少选择了一个复选框

    我有多个音乐版本供用户创建促销 在促销创建表单上 我们列出了所有版本 我正在使用表单模型来创建促销 其中我为我的几个输入定义了所有规则促销形式模型 我想检查用户在保存表单时是否至少选择了一个版本 但它不起作用 因为复选框是动态创建的 我该字
  • 是否可以使用边框半径实现弯曲的圆形形状?

    我不确定形状是什么 我假设它是一个弯曲的圆圈 下面是示例的屏幕截图 我希望图像的形状有点像这样 但尝试与边界半径根本不工作 有什么方法可以用CSS实现这个形状吗 这是你的答案 你可以通过 border radius 来实现 如果您想自定义它
  • Laravel 5 多语言站点,url 中带有语言前缀

    因此 我需要在具有如下网址的网站上使用多种语言 mysite en language mysite it language mysite es language 我决定在我的路线中使用前缀 如下所示 allLanguages en it e
  • colgroup 和 col 上的 Span 属性

    这些代码在逻辑上是等价的吗
  • Laravel Route 在 web.php 中存在路由顺序问题

    我在 Laravel 中遇到路由问题 我正在遵循一个教程 并且我们在 web php 文件中列出了此路由 Route get home HomeController index gt name home Route get blog Blo
  • ColdFusion 9.0.0 TLSv1.2

    我正在运行 ColdFusion 9 0 Hotfix 3 我正在尝试让 TLSv1 2 适用于 cf http 标记 我首先升级到 Java 7 Update 80 然后升级到 Java 8 Update 25 使用 Wireshark
  • 具有多个模板参数错误的模板部分特化

    当我在具有一个模板参数的类上使用模板部分特化时 我可以特化这样的方法 include
  • C++ OpenGL:调用 gluPerspective 会引发未定义的引用错误? [复制]

    这个问题在这里已经有答案了 我正在使用 FreeGLUT 尝试使用 OpenGL 在 C 中创建我的第一个立方体 我有一个问题 每当我调用 gluPerspective 时 编译器都会抛出此错误 build Debug MinGW Wind
  • 有没有办法使用 C 标准库来测量微秒的时间?

    有没有平台无关使用 C 标准库测量微秒时间的方法 不幸的是 测量的精度取决于操作系统
  • 在经典 ASP / Javascript 中将对象插入全局范围

    这个问题与经典 ASP 中的 Javascript 有关 它与浏览器中运行的 Javascript 无关 设计为可重用的 JS 模块的典型构造如下 function globalScope declarations here this 这允
  • iframe 中的parent.location.reload 不工作 IE

    当我单击测试时 我需要刷新父站点 刷新浏览器 我有源index php 在 q php 中 a href testing a 它可以在 FF LAtest 版本 Chrome 中工作 但不能在 IE 9 中工作 他说 script70 权限
  • 向 hibernate JoinTable 添加附加属性

    我有两个实体 消息和用户 用户与消息具有多对多关系 一个用户可以拥有多条消息 并且消息 目前 为了使其不那么复杂 与用户具有多对多关系 一条消息可以发送给多个用户 我使用 JoinTable 连接两个实体 但是 我想在连接表中添加一个 状态
  • 如何获取小于/大于给定数字的最接近的浮点数

    这是一个示例函数 function step x min max return x gt min x lt max x 0 console log step 3 Number EPSILON 3 5 Expected 0 actual 3
  • 如何使用 Express 框架从 Node.js 中的请求中获取字段?

    我正在编写 Node js 脚本 但在集成 登录 表单时遇到问题 我可以使用静态 HTML 页面来完成此操作 但是使用动态 ejs 页面会导致问题 我的表单字段被报告为 未定义 var helmet require helmet var b
  • 如何解决 mtrand.RandomState.choice 中的内存错误?

    我正在尝试从 1e5 字符串中采样 1e7 项 但出现内存错误 从 1e4 个字符串中采样 1e6 个项目是很好的 我使用的是 4GB RAM 的 64 位机器 并且认为我不应该达到 1e7 的任何内存限制 有任何想法吗 python3 P
  • 消息系统数据库架构

    我正在尝试在 PHP 和 MySQL 中实现消息传递系统 但在决定如何处理表和查询时遇到一些困难 对于允许多个参与者的系统来说 最好的方法是什么 我想我可能需要 3 个表 除了用户表 就像是 Conversation id Messages
  • v8 存储一个字符串需要多少内存?

    我正在尝试计算 v8 中字符串的内存使用量 并且我知道单个字符将占用 2 个字节 但是当我在开发工具中检查浅层大小和保留大小时 我对结果感到困惑 function Student this name lll var a new Studen