Chrome保留了函数的源代码



我有一些JavaScript函数,源代码来自较大的JavaScript文件。它们是这样创建的:

const function = Function("foo", "...<large JS source code>...");

在Chrome中查看内存快照时,会保留这些函数的源代码,并产生较大的内存开销。是否可以在JavaScript中"发布"/"删除"函数的源代码?

编辑

我真的在保留函数本身,想知道是否可以告诉函数从内存中删除源代码。

Chrome 内部使用 V8 JavaScript 引擎。这个引擎是一个即时的JavaScript引擎,这意味着它需要你的JavaScript,并在需要时将其编译为机器代码。这很昂贵;所以 V8 将缓存编译的结果,并且(在大多数情况下(如果您再次调用该函数,将重用以前编译的代码。

我相信函数内存回收是由 V8 垃圾回收器处理的。当变量(或函数(超出范围时(任何地方都没有任何引用,包括闭包(,那么垃圾回收器可以自由回收该内存,包括源代码和缓存的机器代码。垃圾回收器定期运行,并将从仍在范围内的任何内存中清除任何内存。一般来说,您不应该尝试自己强制垃圾回收,它应该自动发生,但是使用 Chrome 有一种方法可以使用开发人员工具强制垃圾回收。

如果删除对函数的任何引用(请记住这包括闭包(并强制垃圾回收,则应看到内存已回收。使用 Chrome 开发者内存工具查看您的函数是否已被回收(查看"堆快照"(。

还有一个警告:即使回收内存,它也不一定会被释放回操作系统,甚至不会被清除。许多处理大量小内存分配的应用程序将尝试通过尝试重用以前分配的内存来提高性能,然后再向操作系统请求更多内存。因此,如果您使用的是低级内存检查器,您仍然可能会看到您的代码在内存中徘徊,即使它已被垃圾回收并且没有任何有用的引用。如果不深入研究 V8 内部结构,可能无法从内存转储中确定您的代码是否由于内存泄漏或因为 Chrome 分配了内存,并且在内部清理对该内存的引用后根本没有将其释放回操作系统。

最新更新