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

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

但是,如果我放弃运行并回到它,活动监视器报告它只使用了9MB,这是毫无意义的! 至less,它应该是几MB,因为即使是一个简单的node.js应用程序几乎没有(像服务器一样),使用9MB。

该应用程序似乎工作正常 – 这是一个服务器,提供searchbuild议形成一个单词列表22万字。

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

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

内存中的项目也可能暂时交换出来并写入磁盘(以后可能会被检索到),这种交换是由您的操作系统来完成的,而且往往会被用在更多的程序上,这些程序会保留大量的内存。

加载文件需要多less内存取决于许多因素

什么文字编码被用来存储文件? JavaScript在内部使用UTF-16,所以如果这不是在磁盘上使用的,大小可能会有所不同。 例如,如果文件采用UTF-32格式,则内存中的UTF-16版本将会变得更小,除非满满当当。 如果这个文件是UTF-8,那么事情就会颠倒过来:内存版本将会变得更大,除非它满是星星。 但是现在,让我们假设它们的大小差不多,或者是因为它们使用了相同的编码,或者只是使文件大小差不多一样。

你说得对,加载文件至less需要25MB(假设编码不会干扰) 。 JSON API的语义是什么,你需要把整个文件作为一个string存储在内存中,所以当时的应用程序至less占用了那么多的内存。 这并不算分析器需要运行的任何东西,所以你至less需要34MB:25的文件,9的Node,然后无论你的特定应用程序用于自己。

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

但是,根据你编写应用程序的方式,当你不再需要这些数据时,可能会出现一个问题。 您可以退出您用于加载文件的function,也可以将该variables分配给其他任何可能的值。 然而,它发生, JavaScript回收不再使用的内存 。 这被称为垃圾收集 ,在所谓的“脚本语言”中很受欢迎(尽pipe其他编程语言也可以使用它)。

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

所以如果你的数据主要是关于Numbers和Booleans,那么内存中的表示就会变得更小。 如果它大部分是弦乐,那么不是那么多。