Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript静态类和方法进行内存管理_Javascript_Class_Memory - Fatal编程技术网

使用Javascript静态类和方法进行内存管理

使用Javascript静态类和方法进行内存管理,javascript,class,memory,Javascript,Class,Memory,我想知道这些东西是怎么工作的 class Test { whatIsMyName(name) { this.name = name; } tellMyName() { return this.name; } } let a = new Test(); a.whatIsMyName("Bob"); a.tellMyName(); // "Bob" 浏览器将一部分内存分配给变量a 浏览器会保留内存,直到我刷新网站 当我调用多个内存时

我想知道这些东西是怎么工作的

class Test {
    whatIsMyName(name) {
        this.name = name;
    }
    tellMyName() {
        return this.name;
    }
}

let a = new Test();
a.whatIsMyName("Bob");
a.tellMyName(); // "Bob"
浏览器将一部分内存分配给变量
a

浏览器会保留内存,直到我刷新网站

当我调用多个内存时,浏览器是否分配了另一部分内存


tl;dr本机实现是古怪的和情境性的,并且几乎总是像想象的那样高效。他们不是照你说的做,而是照你的意思做

这在JavaScript引擎之间可能有所不同,但假设您正在谈论v8引擎或其扩展

不看源代码就很难准确地说出它的功能,但我以前在字符串副本上运行过jsperf测试,发现v8似乎尽可能少地复制字符串。您可以随意调用substr,并且不会影响性能。你可以把字符串复制到所有地方,这样就好像什么都没发生过一样。但只要稍微修改字符串,性能就会急剧下降

我从中得到的信息是,在修改字符串之前,它不会将字符串复制到内存中的新位置。也就是说,所有这些都应该访问内存中的同一字符串,最多有一个开始索引和长度不同:

const str = "string";
const str2 = str; // same memory
const str3 = str2; // same memory
const snip = str.slice(1,3); // different start position and length, same memory

const diff = str.replace("i", "o"); // potentially some shared memory, but performance drops would indicate a copy happens
如果您真的想知道什么时候复制东西,什么时候使用引用,那么您必须查看v8()的源代码

此外,浏览器实际实现javascript的方式可能会因情况的不同而有所不同。例如,在这样的情况下,它可能会复制:
“hat”。替换(“a”,“o”)
,因为“hat”很短,但在这样的情况下,它会将字符串片段链接在一起
“在这里想象一整本书”。替换(“一个发生过一次的短语”,“经过审查”)
。检查修改后的字符串的长度和替换量,以及根据这些变量检查复制或链接代码段肯定是最有效的

当我调用多个内存时,浏览器是否分配了另一部分内存

很可能,是的。它必须分配字符串
“bob”
,并创建一个局部变量
name
。两者都消耗内存。由于您既不创建闭包,也不将字符串存储在某处,因此每次调用后对它的所有引用都将丢失,因此垃圾收集可能会在调用后直接释放内存


²尽管现代js引擎做了很多聪明的优化,但它们可能会把事情优化掉…

这太奇怪了。我认为原始值不是指记忆。当您更改
str
变量时,其他变量不会更改。这意味着它们不引用也不共享相同的内存,是吗?所以JS的行为就像字符串是通过值传递的。但是(asfaict)它在内部实际实现它的方式是优化的。这就是JS成为脚本语言的原因,而不是真正的语言。在JS中,有非常明确的定义,说明某些东西实际上应该做什么,但它实际上是如何管理的,这是任意的。相反,编译语言完全按照您所说的做,完全按照您所说的做,即使这是一个坏主意(减去一些有据可查的优化)。在更改任何字符串之前,它们是否共享内存?之后,它将内存分配给新字符串。例如:
var a=“a”;变量b=a;//与**变量a**相同的内存;var b=“b”//现在这两个变量的内存都不同了
我说得对吗?我不能肯定地告诉您,但在运行测试时,似乎发生了一些性能问题。您必须查看源代码才能知道是什么。我只关心检查它没有以缓慢的方式运行。我学会了如何测试它。在调用任何静态方法之前和在测试类中调用大约100次静态方法之后,我创建了snaphost。对象的内存(计数)正在增加。垃圾收集能立即完成工作吗?这要看情况而定。引擎通常有多个垃圾收集器:(1)最理想的情况是,如果一个变量有一个不返回点,那么引擎将立即收集它,(2)JS中有很多“短生命”对象,有一个garbagge收集器跟踪并移除它们,(3)有一个收集长寿物品的garbagge收集器。收集garbagge的一般规则是:如果根本不需要内存,那么花大量时间释放内存是没有意义的。因此,如果你想看到garbagge收集器的运行,你必须大量地填充内存。
const str = "string";
const str2 = str; // same memory
const str3 = str2; // same memory
const snip = str.slice(1,3); // different start position and length, same memory

const diff = str.replace("i", "o"); // potentially some shared memory, but performance drops would indicate a copy happens