为什么node.js突然使用更少的内存?

时间:2014-12-05 15:36:01

标签: javascript node.js macos

我有一个25MB的json文件,我“需要”为什么我的应用程序启动。初始似乎node.js进程占用了近200MB的内存。

但是,如果我让它继续运行并回到它,活动监视器报告它只使用9MB,这根本没有意义!至少,它应该多几MB,因为即使一个简单的node.js应用程序几乎什么也不做(像服务器一样),使用9MB。

该应用程序似乎工作正常 - 它是一个服务器,提供搜索建议形成一个220,000字的单词列表。

活动监视器错了吗? 为什么它只使用9MB,但最初在应用程序启动时使用~200MB?

2 个答案:

答案 0 :(得分:1)

由于它的JavaScript不再使用的东西通过垃圾收集器(GC)删除,释放内存。一切(或许多事情)可能在开始时被加载到内存中。然后,GC从内存中删除了不再需要的项目。通常,生成可能会占用更多内存,之后会丢失一些内存,例如临时数据结构可以在进行中使用,但在完成此过程时不再需要。

内存中的项目也可能在时间上换出并写入磁盘(并可能稍后检索),这可以通过您的操作系统进行交换,并且往往会在保留大量内存的程序上使用更多。

答案 1 :(得分:0)

加载文件需要多少内存取决于多种因素

使用什么文本编码来存储文件? JavaScript在内部使用UTF-16,因此如果不是在磁盘上使用的,则大小可能会有所不同。例如,如果文件是UTF-32,则内存中的UTF-16版本会更小,除非它充满了星号。如果文件是UTF-8,那么事情就会逆转:内存版本会更大,除非它充满了星界。但是现在,让我们假设它们的大小差不多,要么是因为它们使用相同的编码,要么就像使用星形模式恰好使文件大小大致相同。

你是对的,加载文件需要至少25MB(假设编码不会干扰)。 JSON API的语义就是它们,你需要将整个文件作为字符串存储在内存中,这样应用程序将占用至少那么多的内存。这不计算解析器需要运行的任何内容,因此您需要至少34MB:25为文件,9为Node,然后是您的特定应用程序自己使用的。

但是你的应用程序并不需要所有的内存。根据你编写应用程序的方式,你可能会在某些时候破坏你对文件的引用。 由于JSON的语义,没有办法避免将整个文件加载到内存中,这需要25MB,因为这是文件的大小。也没有办法避免占用JSON解析器执行其工作和构建对象所需的任何内存。

但是,根据您编写应用程序的方式,当您不再需要该数据时,可能会出现这一点。您可以退出用于加载文件的函数,也可以将该变量分配给其他函数或任何其他可能的函数。但是它发生了, JavaScript回收了不再使用的内存。这称为垃圾收集,它在所谓的“脚本语言”中很流行(尽管其他编程语言也可以使用它)。

还有文本表示与内存中表示的问题。除非你改变编码,否则字符串在内存和磁盘上需要大约相同的空间量,但数字和布尔值完全是另一回事。在JavaScript中,所有数字都是64位浮点数,因此如果磁盘上的大多数数字长度超过4个字符,那么内存中的表示将会更小,可能相当多。请注意,我说的是字符,而不是数字:数字是字符,但是+, - ,e和。也是字符,所以-1e0在写为文本时占用的空间是-1的两倍,即使它们在内存中表示相同的值。作为另一个例子,3.14占用的空间与文本一样多1000(并且恰好在内存中占用相同的空间量:每个64位)。但是-0.00000001和100000000在内存中占用的空间比在磁盘上少得多,因为内存中的表示更小。布尔可以更小:不同的引擎以不同的方式存储它们,但理论上你可以在一点点内完成它。这与存储“true”所需的8个字节或存储“false”的10个字节相差甚远。

因此,如果您的数据主要是关于数字和布尔值,那么内存中的表示就会变得更小。如果它主要是字符串,那就不那么多了。