当前位置: 首页 > Web前端 > vue.js

js内存数据

时间:2023-03-31 15:48:22 vue.js

基本存储单位位(bit):二进制数中的一位数,可以是0也可以是1,是计算机中数据的最小单位。字节(Byte,B):计算机中数据的基本单位,每8位组成一个字节。各种信息至少需要一个字节在计算机中存储和处理。比如一个ASCII码用一个字节表示,一个汉字用两个字节表示。字(Word):两个字节称为一个字。汉字的存储单位是字。扩展存储单位在各种计算机存储介质(如内存、硬盘、光盘等)的存储容量表示中,用户接触到的存储单位不是位、字节、字,而是KB、MB、GB等,但这并不是新的存储单位,而是基于字节的转换。KB:1KB=1024BMB:1MB=1024KBGB:1GB=1024MBTB:1TB=1024GBUTF-8编码:一个英文字符等于一个字节,一个中文(包括繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。Unicode编码:一个英文等于两个字节,一个中文(包括繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节。array数组的最大长度为2^32–1(即4294967296–1)。js数组不是真正的数组(栈)。在计算机科学中,数组数据结构(英语:arraydatastructure),简称数组(英语:Array),是由相同类型的元素集合组成的数据结构,并分配一块连续的内存进行存储.JavaScript数组是否分配连续内存取决于数组成员的类型。如果是单类型数组,会分配连续的内存。如果数组包含多种不同的类型,那么它就是非连续内存。非连续内存数组以类似于哈希映射的方式存在,可以通过多种数据结构来实现,链表就是其中之一。比如声明一个数组,它被分配到四个不连续的内存地址1001、2011、1088、1077,它们通过指针连接起来形成一个线性结构。那么我们在查询一个元素的时候,其实是需要遍历这个线性链表结构的,这对性能的消耗很大。现在,JavaScript引擎已经在为相同数据类型的数组分配连续的存储空间。此外,在ES2015/ES6中,数组还有其他改进。TC39决定在JavaScript中引入类型化数组,所以现在我们有了ArrayBuffer。ArrayBuffer将有一个大的连续内存位置,你可以用它做任何你想做的事。然而,直接处理内存涉及非常低级的操作并且相当复杂。字符串理论上最大长度是没有限制的,只要你的js解释器有足够的内存即可,但是目前大多数浏览器还不能支持2^28(即268435456)位串。如果存储全部英文字符,则大小为268435456/1024/1024=256MB。那么这么大的字符串是如何存储在内存中的呢?ECMAScript5.1规范对“内存”的定义非常模糊,没有明确定义ECMAScript实现中各个运行时区域的划分,所以没有“栈/堆划分”。因此,从定义层面并不清楚String中存储的字符串是分配在栈上还是堆上。ECMAScript规范只是规定了如果String类型是值类型,这个类型必须能够以UTF-16为单位存储字符,根本没有规定String类型应该如何实现。因此,每个JavaScript引擎的具体实现是不同的。在内存分配方面,V8对String直接使用堆存储,没有在C++堆外分配内存,Google也对String进行了优化。在实际的拼接速度对比中,String要快于Buffer。在V8中,字符串有以下五种表达方式:SeqString需要查看内容的字符串:使用flatstring的思想来实现,本质上是以数组的形式存储String内容。实际的数据存储分为两种:OneByte和TwoByte(Unicode)。ConsString拼接字符串但未检查其内容:拼接字符串时,使用树结构来表示拼接后的(第一个+第二个)字符串。使用“绳子”的想法或其他延迟连接的想法。当需要查看其内容时,执行“扁平化”操作,将其转换为扁平字符串表示。最常见的是绳索的内部节点就像一棵二叉树,但也可以有具有更多叉树设计或更动态的多树实现的节点。SliceString(parent,offset)substring:切割字符串时,用offset和[length]表示父字符串(parent)的一部分。它是使用“切片”思想实现的,也就是说,它只是一个视图,它本身不存储字符内容,只记录一个偏移量和长度,底层存储共享它所引用的源字符串。ThinString(actual)值得实习的字符串:在某些场景下重复出现的字符串。当两个变量保存同一个字符串时,实际上保存的是该字符串在内存中的地址。.最大的好处是一些字符串在特殊场景下出现频率高,或者经常用于相等比较。驻留这些字符串可以节省内存(相同内容的字符串只驻留一份),后续可以使用指针比较而不是全等比较(因为驻留时已经比较过了)。在大多数情况下,可以认为等同于ConsString(actual,empty_string)。ExternalStringforeignstring:表示在V8堆外生成的字符串资源。有时JavaScript引擎与外界交互,外界想直接将一个char8_t或char16_t作为JavaScript字符串传递给JavaScript引擎。JavaScript引擎可能会针对某些特殊场景提供一种封装方式,将这些外部传递的字符串直接当作JavaScriptString处理,而无需复制其内容。值得注意的是:虽然ECMAScript的String值是值类型,但这并不意味着“String值在栈上”。相反,V8实现的String值都是存放在V8的GC堆上的。传递String值时,实际传递的是指向它的指针。但是,由于JavaScript的String值是不可变的,所以无论底层实现是真的“将String入栈”还是传递指针,对上层应用的JavaScript代码都没有影响。ExternalString虽然特殊,但也不例外:虽然它实际存放字符串内容的空间是从外部传入的,不在V8的GC堆中,但是ExternalString对象本身还是作为一个在GC堆中的objectheader,所以这个String类型按道理来说还是在GC堆里的。在v8中,Boolean、Null、Undefined、Number都存储在栈内存中,这几种类型的值都可以用32位数据来表示。那么剩下的数据类型Symbol、BigInt、Object、String都存放在堆中,栈中只存放这些值的地址的引用。栈内存:1.存储值的大小是固定的。2、空间小。3、可以直接操作存储的变量,操作效率高。4、存储空间由系统自动分配。栈内存是线性的、有规律的、基本固定大小、有序排列的内存空间块,每个单元有固定的大小,并且有规律、有序地排列。堆内存:5.存储值的大小是可变的,可以动态调整6.空间大,运行效率低7.不能直接操作其内部存储,使用引用地址读取8.通过分配空间codeNumber,遵循IEEE754规范,使用双精度存储(doubleprecision),占用64位,其中1位用于表示符号位,11位用于表示指数,其余52位代表尾数。这是Number.MAX_SAFE_INTEGER,也称为最大安全数。它的值为9007199254740991,换算成二进制就是2^53-1,占52位。.大于9007199254740992可能丢失精度9007199254740992+1//丢失9007199254740992+2//不丢失9007199254740992+3//丢失9007199254740992+4//它的最小安全数是INT_SA。-9007199254740991最大数为Number.MAX_VALUE,其值为1.7976931348623157e+308,介于2^1023–2^1024之间。大于MAX_VALUE的值表示为InfinityECMAScript标准约定number数字需要被视为64位双精度浮点数,但实际上总是用64位来存储任何数字是非常低效的,所以JavaScript引擎并不总是使用64位来存储数字,引擎在内部使用其他内存表示形式(例如32位),只要在数字之外可以监控的所有特性都与64位性能对齐即可。V8不仅简单到用32位来表示数字,还将数字分为Smi和HeapNumber(这只是引擎层面的处理,js内部只识别数字,不区分整数和浮点数).在V8中,Smi表示小整数(-2^31、2^31-1),而HeapNumber表示一些浮点数和32位不能表示的数,如NaN、Infinity、-0等。因为小整数在我们编码过程中太常见了,所以V8专门把它拿出来优化,让它可以进行快速的整数运算,比如for循环等,当我们更新它们的值时,Smi的值会原地更新,并且由于其HeapNumber的不可变特性,V8会开辟一个新的内存实体来存储新的值。如果我们需要频繁更新HeapNumber的值,执行效率会比Smi慢很多。V8引擎和内存分配V8是Google开发的一款高性能JavaScript引擎,它是用C++开发的。目前主要用于谷歌Chrome浏览器和node.js。V8内置的高性能垃圾回收机制,使开发者可以专注于程序开发,大大提高了开发者的编程效率。但是除了方便之外,对于新手来说也会遇到一些棘手的问题:进程内存飙升,cpu飙升,性能差等等。一个V8进程的内存通常由以下几块组成:新生代内存区(newspace)64位新生代为64M,32位新生代为16M。大部分对象都会分配到这里,这个区域很小但是垃圾回收比较频繁;64位版本的旧空间(oldspace)为1400M;32位版本是700M。属于老年代,只保存原始数据对象,这些对象没有指向其他对象的指针;大对象空间(largeobjectspace)存放体积超过其他区域大小的对象,每个对象都有自己的内存,垃圾回收不会移动大对象区域;代码空间中的代码对象将分配在这里。唯一有执行权限的内存;地图区域(地图空间)存储Cell和Map,每个区域存储相同大小的元素,结构简单。