了解 Javascript / V8 中的字符串堆大小

2024-02-01

有谁对如何使用 Chrome(V8) 在 Javascript 中确定字符串的堆大小有很好的理解/解释吗?

我在堆转储中看到的一些示例:

1) 相同的 2 个字符串(即“dt”)的多个副本,但具有不同的值@对象 ID 全部指定为 OneByteStrings。 heapdump 表示每个副本的浅层保留大小为 32 字节。目前尚不清楚两字节字符串如何保留 32 的大小以及为什么这些字符串似乎没有被保留。

2) 长对象路径字符串,长度为 78 个字符。所有字符在 utf8 中都是一个字节。它被归类为InternalizedString。它的保留大小为 184 字节。即使使用 2 字节字符编码,仍然无法解释剩余的 28 字节。为什么这些路径字符串占用这么多空间?我可以想象另外 4 个字节(可能是 8 个)用于地址,另外 4 个字节用于存储字符串长度,但即使使用 2 字节字符编码,仍然剩下 16 个字节。


在内部,V8 有许多不同的字符串表示形式:

  • SeqOneByteString:最简单,包含一些头字段,然后是字符串的字节(不是UTF-8编码的,只能包含前256个unicode代码点中的字符)
  • SeqTwoByteString:相同,但每个字符使用两个字节(使用代理对来表示无法用两个字节表示的 unicode 字符)。
  • SlicedString:其他字符串的子字符串。包含指向“父”字符串的指针以及偏移量和长度。
  • ConsString:两个字符串相加的结果(如果超过一定大小)。包含指向两个字符串的指针(它们本身可以是这些类型的字符串中的任何一种)。
  • ExternalString:用于从V8外部传入的字符串。

“Internalized”只是一个标志,实际的字符串表示形式可以是上述任何一种。

所有这些都有一个共同的父类 String,其父类是 Name,其父类是 HeapObject(这是在 V8 堆上分配的对象的 V8 类层次结构的根)。

  • HeapObject 有一个字段:指向其 Map 的指针(对此有一个很好的解释)here http://jayconrod.com/posts/52/a-tour-of-v8-object-representation).
  • 名称添加了一个附加字段:哈希值。
  • String 添加了另一个字段:长度。

在 32 位系统上,每个字节都是 4 个字节。在64位系统上,每个是8字节。

如果您使用的是 64 位系统,则 SeqOneByteString 的最小大小将为 32 字节:上述标头字段为 24 字节,加上至少 1 个字符串数据字节,四舍五入为 8 的倍数。

关于你的第二个问题,很难说清楚到底发生了什么。可能是该字符串使用 2 字节表示形式,并且其标头字段将大小推高到超出您的预期,或者可能是它是 ConsString 或 SlicedString(其保留的大小将包括它指向的字符串)到)。

V8 大多数时候不会内化字符串 - 它会内化在解析过程中找到的字符串常量和标识符名称,以及用作对象属性键的字符串,以及可能的其他一些情况。

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

了解 Javascript / V8 中的字符串堆大小 的相关文章

  • 使用智能菜单jquery打印json

    menu name Computers children name Notebook children name Apple name Windows name Tablets children name Apple name Androi
  • 获取插入符位置上的当前单词

    如何通过当前插入符号位置获取 textarrea 中的单词 我尝试了类似的操作 但是这仅返回单词的第一个字母到插入符号位置的字符 例如 如果光标位于fo and o它返回fo并不是foo正如预期的那样 Fo o bar 不等于 bar fo
  • Javascript hasOwnProperty 在事件对象上总是 false?

    我希望有人可以帮助澄清与事件对象相关的 hasOwnProperty 方法 我正在尝试克隆鼠标事件 最终该对象将被传递到 iframe 我已经构建了一个 克隆 函数 但每当我尝试克隆窗口事件 即滚动 单击等 时 hasOwnProperty
  • PHP中的“@/path/to/a/file”是什么意思?

    我偶然发现以下代码示例 image file path code tmhOAuth gt request POST https upload twitter com 1 statuses update with media json arr
  • 如果Functions是javascript中的对象,为什么function.constructor指向Function而不是Object?

    当像这样从窗口对象创建以下函数时 function userInfo 既然函数是对象 为什么 userInfo constructor 显示 Function 而不是 Object 当使用以下内容时 它甚至显示函数而不是对象 Functio
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • Golang:从文本文件中替换字符串中的换行符时出现问题

    我一直在尝试读取一个文件 然后将读取的材料放入字符串中 然后字符串将按行分割成多个字符串 absPath filepath Abs Go input txt data err ioutil ReadFile absPath if err n
  • Chart.js - 如何将数组集合推入数据集

    我一直在尝试多种方法将数组集合推送到数据集中 任何人都可以帮助我根据下面的代码将数组推入堆积图表中 这是例子 Codepen 堆叠栏 https codepen io narendrajadhav pen abzpWam JavaScrip
  • 如何获得相对于特定父级的偏移量?

    我想获取元素相对于的偏移量特定的父母不是直接的 也不是文档 我在互联网上查找并找到了offset http api jquery com offset and position http api jquery com position jQ
  • 强制执行 show.bind

    我有一个包含数据的表 当从另一个视图触发事件时 我希望视图检查 show bind 语句 问题是该事件没有更改当前视图中的任何数据 foo html tr p canBeRemoved p tr 我正在使用 EventAggregator
  • 按日期对 JSON 进行排序

    我知道这一定相对简单 但我有一个 JSON 数据集 我想按日期排序 到目前为止 我每次都会遇到问题 现在我将日期存储为this lastUpdated 如果有帮助的话 我可以访问 jquery 但我意识到 sort 是本机 JS 提前致谢
  • React JS“this”没有按预期工作

    我有下面的代码 save function var this this console log this refs itemText this setState isEditing false function console log In
  • 根据数据更改图例颜色高图表

    我可以根据数据动态设置列的颜色 但无法弄清楚如何更改图例中的颜色 请注意 jsfiddle 最新的条形图是绿色的 但图例是蓝色的 有没有办法改变列颜色也会改变图例颜色 这是我用于列颜色的代码 jsfiddle http jsfiddle n
  • 如何在 Next.js 中正确使用 Mongoose 模型?

    我正在使用 TypeScript 和 MongoDB Mongoose 构建 Next js 应用程序 我在使用 Mongoose 模型时开始遇到错误 这导致它们在每次使用模型时都尝试覆盖模型 导致模型覆盖错误的代码 import mong
  • 用于图形操作的 Javascript 库

    有没有建议的 javascript 替代 pythonpygraph http code google com p python graph or NetworkX http networkx lanl gov 应该注意的是 可视化不是必需
  • Bootstrap 3 - 模态背景不会根据模态对话框的高度调整大小?

    我将一个表单放入模式中 并尝试在用户触发单选按钮时显示表单的一些隐藏字段 显示隐藏字段后 模态自动重新缩放的高度 但模态背景的高度不能用作模态对话框 我该如何解决它 div class modal fade div class modal
  • 正则表达式获取两个方括号之间的数字

    您好 我需要使用正则表达式在 JavaScript 中获取两对方括号内的字符串 这是我的字符串 12 23 asd 到目前为止我尝试的是使用这种模式 d 我需要获得价值12使用正则表达式 您可以使用以下正则表达式 d 这将提取12 from
  • onClick 事件适用于触摸屏设备上的触摸吗?

    我用过onclick我的网站上的活动 但是 当我在谷歌浏览器的开发人员模式移动视图中打开它时 触摸使用鼠标单击的元素没有任何反应 所以我的问题是 我还必须添加吗ontouch事件连同onclick事件或 onClick 事件适用于所有触摸屏
  • python 函数返回 javascript date.getTime()

    我正在尝试创建一个简单的 python 函数 它将返回与 javascript 相同的值new Date getTime 方法 如所写here http www w3schools com js js dates asp javascrip

随机推荐