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