我有一些JavaScript函数,其源代码来自较大的JavaScript文件。它们是通过以下方式创建的:
const function = Function("foo", "...<large JS source code>...");
在Chrome浏览器中查看内存快照时,这些函数的源代码会保留,并会占用大量内存。是否可以“释放” /“删除” JavaScript函数的源代码?
编辑
我真的是在保留函数本身,想知道是否可以告诉函数从内存中删除源代码。
答案 0 :(得分:2)
Chrome内部使用V8 JavaScript引擎。该引擎是即时JavaScript引擎,这意味着它将获取您的JavaScript,并在需要时将其编译为机器代码。这很昂贵;因此,V8将缓存编译结果,并且(在大多数情况下)如果再次调用该函数,则将重新使用以前编译的代码。
我相信功能内存回收是由V8垃圾收集器处理的。当变量(或函数)超出范围(在任何地方都没有留下任何引用,包括闭包)时,垃圾回收器可以自由回收该内存,包括源代码和缓存的机器代码。垃圾收集器会定期运行,并将清除范围内的任何内存。一般来说,您不应该尝试自行强制进行垃圾收集,它应该自动发生,而应with Chrome there is a way to force garbage collection using the developer tools。
如果删除对函数的任何引用(请记住这包括闭包)并强制进行垃圾回收,则应该看到已回收内存。使用Chrome Developer memory tools查看您的功能是否已收回(请查看“堆快照”)。
还有另一点警告:即使回收了内存,也不一定会将其释放回操作系统甚至清除。许多处理大量小内存分配的应用程序将尝试通过在请求操作系统提供更多信息之前重用先前分配的内存来提高性能。因此,如果您使用的是低级内存检查器,则即使您的代码已被垃圾回收并且没有任何有用的引用,您仍可能会看到代码在内存中徘徊。如果没有深入研究V8 internals,就可能无法从内存转储中确定代码是否仍在内存中是由于内存泄漏,还是因为Chrome分配了内存并且只是没有将其释放回内存内部清除对该内存的引用后,操作系统。