Sye*_*san 6 javascript variables memory-management
就像在java中一样
int requires 4 bytes
float requires 4 bytes
char requires 2 bytes
Run Code Online (Sandbox Code Playgroud)
但在 javascript 中我们只有 var 类型的变量。
Q1. var 需要多少内存?
Q2。这块内存什么时候分配给变量呢?
如下例所示,不同类型的数据分配给同一变量
int requires 4 bytes
float requires 4 bytes
char requires 2 bytes
Run Code Online (Sandbox Code Playgroud)
var 需要多少内存?
我们永远不会知道。它的范围可以从无到几个字节。这取决于引擎及其所采取的优化步骤。举个例子:
function test() {
var unused = "stuff";
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下unused不能使用,编译器可能会决定将其完全优化掉,然后它就不占用内存了。但是,如果您在该函数中添加断点,它必须回退到未优化的版本并且必须分配unused.
或者采取这个:
function addOne(n) { return n + 1; }
var test = addOne(2);
test = addOne(3);
Run Code Online (Sandbox Code Playgroud)
编译器可以通过几种方式对其进行优化:
1)它不优化任何东西,然后n可能包含任何可能的JavaScript值,因此它可能引用某种“值”超类。引用将占用几个字节,类实例本身也是如此。
2) 它假设n始终是一个数字(因为它从调用中看到了这一点),并生成仅将数字(或整数)分配到堆栈上的优化字节码。这将占用 8 个字节(可能更少/更多)。
3)它完全内联函数,n根本不存在。结果代码是:
var test = 2 + 1;
test = test + 1;
Run Code Online (Sandbox Code Playgroud)
现在,如果您这样做,addOne("test")它必须要么回退到未优化的版本,要么为字符串生成新的优化版本。
由于这是所有(大多数)引擎正在做的事情,因此您永远不知道变量占用了多少空间,因为它可以在运行时更改(多次)。它甚至可以根据您调用它的方式、您是否调用eval或with何时调用以及您是否使用调试器“查看”函数而改变。
对于全局变量(如您的情况),引擎可能无法进行优化(因为代码的许多部分可以与其交互),因此情况 1 可能适用。
这块内存什么时候分配给变量呢?
要么从不,要么当您调用函数时,或者对于全局范围:当代码被解析时,或者当达到赋值时。
// assuming a non optimized case:
function test() { // a reference holder for a gets allocated
let a;
a = {}; // an object gets allocated, a reference to it gets stored in the already allocated slot
}
Run Code Online (Sandbox Code Playgroud)
上述优化对于 V8 有详细记录,它在 Chrome 和 NodeJS 等中运行。
| 归档时间: |
|
| 查看次数: |
2632 次 |
| 最近记录: |