node内存的限制

node运行时会有一个默认的内存限制,当node操作的数据量过大时就会抛出异常。一般有个这样的说法,32位机器上node内存限制512M,64位机器上限制内存1G。但是node也给出了用户手动配置此界限的方法。例如:

Luckily node let’s you up the memory limit with the archaically named --max-old-space-size=SPACE_IN_MB flag. And to make life even easier, it allows you to globally set these options in the environment, so you don’t need to worry about catching every node invocation yourself: export NODE_OPTIONS=--max-old-space-size=8192 (for example).

或者

Starting nodejs app with a heap memory of 8 GB

node --max-old-space-size=8192 app.js

内存控制的小诀窍

大的软件系统经常会调用很多底层的c语言模块,有一些c语言模块甚至是知名的模块都会存在或多或少的内存泄漏的问题。

这里有一个简单粗暴的小诀窍,就是有时候可以考虑把一些独立的模块建立新进程来调用。这样,每一次调用完,操作系统都会释放掉该进程占用的所有内存。这是完全隔离一些模块占用内存后不释放的有效解决方案。

python的内存管理机制

智能指针这个东西,基本上是各种系统内存管理的一个标配。所有的python对象都继承自PyObject对象,每当该对象多一个引用,其内置计数器就+1。每少一个就-1。当其减少到0时,就自动释放该内存。

但仅仅是智能指针是不够的,因为它解决不了循环引用的问题。python还采用了gc模块来解决循环引用的问题。gc模块的具体机制可以参考下文:

https://rushter.com/blog/python-garbage-collector/

总的来说,一般情况下我们是不用担心python内存释放的问题。如果你想手动做更多优化,可以考虑调用gc模块的手动释放内存的函数

In some cases, it is useful to disable GC and use it manually. The automatic collection can be disabled by calling gc.disable(). To manually run the collection process, you need to use gc.collect().