这是一个用于解压缩字符串的简单程序,我只是运行一个循环以显示内存使用量增加,并且所使用的内存从未释放过。
即使8小时后内存也不会释放
用于解压缩字符串的软件包:https://github.com/Albinzr/lzGo-(简单的lz字符串算法)
我添加了一个gist链接,因为用于解压缩的字符串很大
源代码: Code
我是一个新手,有人可以告诉我如何解决内存问题吗?
更新 7月15日 达到内存限制时,应用仍然崩溃,因为它仅使用12mb-15mb,这应该不会发生!
答案 0 :(得分:4)
这里有很多事情。
首先,使用Go版本1.14.2 your program对我来说很好。它似乎没有泄漏内存。
第二,即使我故意通过将循环大小增加到100并将结果保存在数组中而造成内存泄漏,我也只使用了大约100 MB的内存。
这使我们进入第三,您不应该使用活动监视器或任何其他操作系统级别的工具来检查Go程序中的内存泄漏。操作系统内存管理是一个非常痛苦的主题,其操作系统工具旨在帮助您确定程序如何影响整个系统,而不是程序中正在发生的事情。
具体来说,macOS“ Real Memory”(类似于RSS,常驻集大小)包括程序不再使用但OS尚未收回的内存。当垃圾收集器释放内存并告诉OS不再需要该内存时,OS不会立即将其取回。 (为什么这样工作超出了此答案的范围。) 另外,如果OS处于内存压力下,它不仅可以收回程序已释放的内存,还可以(暂时)收回程序仍在使用但尚未“最近”访问的内存,从而使另一个程序紧急需要内存可以使用它。在这种情况下,即使进程实际上没有使用更少的内存,“ Real Memory”也会减少。操作系统没有报告任何统计信息可以帮到您。
您需要使用GODEBUG=gctrace=1
之类的本机Go设置或expvar和expvarmon之类的工具来查看垃圾收集器在做什么。
关于限制程序时内存不足的原因,请记住,默认情况下,Go会构建动态链接的可执行文件,仅读取所有共享库会占用大量内存。尝试使用CGO_ENABLED=0
通过静态链接构建应用程序,看看是否有帮助。当您只运行一次循环时,看看它使用了多少内存。