有两种方法来限制您的内存使用:事后和抢先。就是说,您可以在程序变得太大之后尝试将其终止,或者可以将其编程为不要使其变得太大。
如果您坚持事后处理方法,则可以使用以下Bash脚本。该脚本首先查找进程ID为pid的进程正在使用的内存量(由“驻留集大小”定义),使用grep过滤掉所有非数值数据,并将该量保存为变量n。然后,脚本检查n是否大于指定的x。如果是,则杀死具有processid pid的进程。
请注意:
- 您必须替换
<pid>
为程序的进程ID。
- 您必须用
<x>
不希望程序超出的rss =“ resident set size”(即实际内存大小)替换。
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
如果您希望此方法每隔y秒运行一次,则将其封闭在一个循环中,并告诉它在每次迭代后等待y秒。您还可以使用编写类似的命令top
。您的起点将是top -l 1|grep "<pid>"|awk '{print $10}'
。
@kenorb的答案帮助我编写了脚本
虽然我相信这可以回答问题,但从长远来看,我认为采用手动内存分配的抢占式方法是更好的编程设计。
首先,您确定内存使用确实存在问题吗?Go 文档指出:
Go内存分配器保留了大范围的虚拟内存作为分配的场所。该虚拟内存在特定的Go进程本地;保留不会剥夺其他进程的内存。
如果您仍然认为自己有问题,那么建议您像使用C编程语言一样手动管理内存。由于go是用C编写的,因此我怀疑会有进入C内存管理/分配的方法,的确存在。看到这个github仓库,
允许您通过系统的标准C分配器进行手动内存管理。它是malloc,calloc之上的薄包装,并且没有。有关系统中这些功能的详细信息,请参见man malloc。该库使用cgo。
用例为:
你为什么要这个?
当程序导致内存压力或系统内存不足时,手动控制内存分配和释放会很有帮助。Go可以帮助您控制分配,但是无法显式取消分配不需要的数据。
这似乎是一个更好的长期解决方案。
如果要了解有关C(包括内存管理)的更多信息,则
C编程语言是标准参考。