作为数据点,我在 OS X 10.10.5 中尝试了以下脚本,在配备 2.8 GHz Intel Core i7 的 Macbook Pro Retina 上使用内置 bash:
#!/bin/bash
humombo="X"
while true; do
humombo="$humombo$humombo"
echo "Time $(date "+%H:%M:%S"), chars $(echo "$humombo" | wc -c)"
done
Run Code Online (Sandbox Code Playgroud)
结果:大小一次又一次地愉快地翻倍(请注意,大小包括单行结尾的额外字节)。当humombo超过 4MB时,事情开始变慢;从 256MB 翻倍到 512MB 需要 48 秒,然后脚本爆炸:
mbpe:~ griscom$ ./delme.sh
Time 16:00:04, chars 3
Time 16:00:04, chars 5
Time 16:00:04, chars 9
Time 16:00:04, chars 17
Time 16:00:04, chars 33
Time 16:00:04, chars 65
Time 16:00:04, chars 129
Time 16:00:04, chars 257
Time 16:00:04, chars 513
Time 16:00:04, chars 1025
Time 16:00:04, chars 2049
Time 16:00:04, chars 4097
Time 16:00:04, chars 8193
Time 16:00:04, chars 16385
Time 16:00:04, chars 32769
Time 16:00:04, chars 65537
Time 16:00:04, chars 131073
Time 16:00:04, chars 262145
Time 16:00:04, chars 524289
Time 16:00:04, chars 1048577
Time 16:00:04, chars 2097153
Time 16:00:05, chars 4194305
Time 16:00:05, chars 8388609
Time 16:00:07, chars 16777217
Time 16:00:09, chars 33554433
Time 16:00:15, chars 67108865
Time 16:00:27, chars 134217729
Time 16:00:51, chars 268435457
Time 16:01:39, chars 536870913
bash(80722,0x7fff77bff300) malloc: *** mach_vm_map(size=18446744071562072064) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
./delme.sh: xrealloc: cannot allocate 18446744071562068096 bytes
mbpe:~ griscom$
Run Code Online (Sandbox Code Playgroud)
两个注意事项:
我怀疑崩溃更多是整个过程占用了太多内存,而不是我达到了单个变量容量的限制。
在玩这个时,我以交互方式运行了相同的命令,当循环退出时 bash 被破坏了;我必须打开一个新的终端窗口才能做任何事情。因此,过多的内存分配会以未知的方式破坏 bash;我的猜测是在脚本中执行此操作会在退出时进行清理。
编辑:我刚刚在高性能 Ubuntu 18 系统上尝试了相同的代码:
Time 18:03:02, chars 3
Time 18:03:02, chars 5
Time 18:03:02, chars 9
Time 18:03:02, chars 17
Time 18:03:02, chars 33
Time 18:03:02, chars 65
Time 18:03:02, chars 129
Time 18:03:02, chars 257
Time 18:03:02, chars 513
Time 18:03:02, chars 1025
Time 18:03:02, chars 2049
Time 18:03:02, chars 4097
Time 18:03:02, chars 8193
Time 18:03:02, chars 16385
Time 18:03:02, chars 32769
Time 18:03:02, chars 65537
Time 18:03:02, chars 131073
Time 18:03:02, chars 262145
Time 18:03:02, chars 524289
Time 18:03:02, chars 1048577
Time 18:03:02, chars 2097153
Time 18:03:02, chars 4194305
Time 18:03:02, chars 8388609
Time 18:03:03, chars 16777217
Time 18:03:04, chars 33554433
Time 18:03:07, chars 67108865
Time 18:03:12, chars 134217729
Time 18:03:23, chars 268435457
Time 18:03:43, chars 536870913
./delme.sh: xrealloc: cannot allocate 18446744071562068096 bytes
Run Code Online (Sandbox Code Playgroud)
花了不到一半的时间,死得更干净一点,但字符大小相同。(顺便说一句,错误消息中的数字,十进制 18446744071562068096,是 0xffff ffff 8000 0080,所以很明显我们在这里遇到了一些数字容量限制。)
| 归档时间: |
|
| 查看次数: |
18681 次 |
| 最近记录: |