对于基准测试,我运行了以下命令:
for i in {1..100000000}; do
echo "$i" line >> file
done
Run Code Online (Sandbox Code Playgroud)
Bash扩展了大括号并将列表存储1 2 3 4 5 6 ... 100000000在内存中。
我认为这会以某种方式解除分配。毕竟,它是一个临时变量。几天过去了,该bash进程仍然占用 17.9GB 的内存。
我可以强制 bash 清除这些临时变量吗?我不能使用unset,因为我不知道变量名。(显然unset i没有帮助)
当然,一种解决方法是关闭外壳并打开一个新的外壳。
我还在 bash 邮件列表中询问了这个问题,并得到了Chet Ramsey的有用回复:
那不是内存泄漏。Malloc 实现不需要将内存释放回内核;bash malloc(和其他人)只在有限的情况下这样做。使用 mmap 或 sbrk 从内核获取并由 malloc 实现保存在缓存中的内存不构成泄漏。泄漏是应用程序或 malloc 本身不再有句柄的内存。
malloc() 基本上是应用程序和内核之间的缓存。它可以决定何时以及如何将内存返还给内核。
让我们假设一些 bash shell 脚本,例如:
#!/bin/bash
a=3
b=7
set -o posix
set
Run Code Online (Sandbox Code Playgroud)
在这种情况下,执行变量set或其他一些打印环境变量的命令(env,declare...等)输出 mya和b变量,以及环境中的许多变量PATH(和函数)( ,PWD,TEMP...等) )。
有没有办法只打印脚本主体中定义的变量?
我喜欢为测试或其他目的制作命令行 bash 变量。我给它们取通用名称,如a, b, var1... 有时我可能会忘记我已经使用过哪些变量。无论如何,是否有一个命令可以清除所有 bash 变量?现在运行这样的命令后,我希望用户定义的所有 bash 变量都变为未定义。当echo $undefinedvariable运行时,其结果是一个空行。所有内置变量,如$USER或$SHELL应该保持不受此命令影响。