当前位置:首页 > 科技  > 软件

「字符串」存在「栈内存」?那我可要杠你了哦!

来源: 责编: 时间:2024-03-27 17:39:54 282观看
导读前言大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。在我们的认知里:基础类型存栈内存,引用数据类型存堆内存。const a = '林三心'const b = { age: 18, height: 180}

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。pCD28资讯网——每日最新资讯28at.com

在我们的认知里:基础类型存栈内存,引用数据类型存堆内存。pCD28资讯网——每日最新资讯28at.com

const a = '林三心'const b = {    age: 18,    height: 180}

图片图片pCD28资讯网——每日最新资讯28at.com

超长字符串

大家都知道,字符串属于基础类型,所以大家会觉得字符串是存在栈内存中的,但是大家要知道,V8默认栈内存是984Kib,那如果一个超长字符串 > 984Kib能装的进栈内存吗?这也就是一个比较经典的问题——大象装箱问题,试问:一头大象能装进一个小箱子里吗?pCD28资讯网——每日最新资讯28at.com

图片图片pCD28资讯网——每日最新资讯28at.com

一探究竟

堆快照

先来看一段代码pCD28资讯网——每日最新资讯28at.com

const func = function() {  this.str1 = '林三心'  this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()

然后咱们来看看堆快照的详情pCD28资讯网——每日最新资讯28at.com

图片图片pCD28资讯网——每日最新资讯28at.com

上面的结果可以看出:pCD28资讯网——每日最新资讯28at.com

  • a 和 b的str1都指向同一个地址
  • a 和 b的str2都指向同一个地址

那我们可不可以猜测出一个结论:字符串的内容存于堆内存中,指针存于栈内存中,且相同的字符串指向同一个堆内存地址pCD28资讯网——每日最新资讯28at.com

修改和新增字符串

我们稍微修改下代码pCD28资讯网——每日最新资讯28at.com

const func = function() {  this.str1 = '林三心'  this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()// 修改str1a.str1 = '哈哈哈哈哈哈哈哈哈哈'// 新增str3,跟str2一样a.str3 = 'Sunshine_Lin'

再来看看现阶段的堆快照的详情pCD28资讯网——每日最新资讯28at.com

图片图片pCD28资讯网——每日最新资讯28at.com

上面的结果可以看出:pCD28资讯网——每日最新资讯28at.com

  • str1修改成一个新的字符串后,重新开辟了一个内存空间(新地址)
  • str3新增之后,指针指向已有的Sunshine_Lin的内存空间

那我们可不可以猜测出一个结论:新增或者修改字符串后,如果是一个之前不存在的字符串,则新开辟内存空间,如果是已有的,则直接使用已有的内存空间pCD28资讯网——每日最新资讯28at.com

源码分析

当我们声明一个字符串时:pCD28资讯网——每日最新资讯28at.com

  • 1、v8内部有一个名为stringTable的hashmap缓存了所有字符串,在V8阅读我们的代码,转换抽象语法树时,每遇到一个字符串,会根据其特征换算为一个hash值,插入到hashmap中。在之后如果遇到了hash值一致的字符串,会优先从里面取出来进行比对,一致的话就不会生成新字符串类。
  • 2、缓存字符串时,根据字符串不同采取不同hash方式。

图片图片pCD28资讯网——每日最新资讯28at.com

源码

图片图片pCD28资讯网——每日最新资讯28at.com

图片图片pCD28资讯网——每日最新资讯28at.com

通俗易懂总结

字符串的数据存于 堆内存 中,栈内存 中只是存其 地址指针pCD28资讯网——每日最新资讯28at.com

当我们新建一个字符串时,V8会从内存中查找一下是否已经有存在的一样的字符串,找到的话直接复用。如果找不到的话,则开辟一块新的内存空间来存这个字符串,并把地址赋给变量。pCD28资讯网——每日最新资讯28at.com

大家有没有想过,为什么字符串不能通过下标索引来进行修改呢?因为字符串的修改本质上只能是通过整个的修改,而不能局部修改。pCD28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-79841-0.html「字符串」存在「栈内存」?那我可要杠你了哦!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: ZGC可伸缩低延迟垃圾收集器深度解析

下一篇: 聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    7月20日消息,据外媒报道,研究机构的报告显示,在全球智能手机出货量同比仍在下滑的大背景下,印度这一有潜力的市场也未能幸免,出货量同比也有下滑,多家厂
  • 三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板电脑以及三星Galaxy Watch6系列智能手表也同期
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top