TCL脚本中止:无法重新分配XXX字节



我的Tcl脚本中止,说它无法重新分配2191392个字节。当脚本的执行时间较长(例如超过10小时)时,就会发生这种情况。我的Tcl脚本使用telnet和ssh连接连接到设备,并在设备上执行/验证一些命令输出。Linux机器有足够的内存32GB, ulimit对于进程、数据和文件大小是无限的。我的脚本进程不会占用更多内存,但最坏的情况是<1 gb。我只是想知道为什么内存分配失败有足够的RAM

该消息表明底层的malloc()调用返回了NULL(在一个不可恢复的位置),并且考虑到它不是很多,这表明系统完全无法分配太多内存。这取决于您的系统配置(32位vs. 64位;检查什么parray tcl_platform打印发现),这可能是一个人工制品的一些事情,但如果你认为它不应该使用超过千兆字节的内存,这是一个内存泄漏的迹象。

不幸的是,通常很难追踪内存泄漏。Tcl的内置memory命令(在构建时通过configure --enable-symbols=mem启用)可以提供帮助,像Electric Fence这样的工具也可以,但是它们并不完美,通常不能告诉您哪里出错了(因为您将寻找缺少某些东西来释放内存)。在Tcl级别,查看info globals列出的每个变量的大小是否合理,或者是否有越来越多的全局变量。您将需要使用string length, array exists, array sizearray names等工具。

也有可能内存分配失败,因为另一个进程消耗了如此多的内存,以至于操作系统开始感到高度受限。我希望这不会发生在你的情况下,因为它很难预防。

最新更新