【发布时间】:2021-03-09 12:50:24
【问题描述】:
golang 遇到 OOM 时是否会运行 GC 并重试分配?
我们面临一个问题,即 kubernetes pod(运行 go 代码)在处理大文件时被 OOM Killed。
go 代码处理许多文件,逐行读取它们并为它解析的每一行(通过创建解析的结构分配一些内存 - 循环中的局部变量),如果匹配某些条件,则将其插入数据库。 这是为多个客户端同时运行的。 这适用于许多具有小文件的客户端。但是当它遇到客户端的大文件时,它就会 OOM。
我们让系统运行了很长时间,没有发现任何内存泄漏。甚至 pprof 分析也表明没有内存泄漏。
【问题讨论】:
-
GC 不会释放内存,它只能重用它。您无法从进程中判断何时内存不足,这取决于系统。如果你不能再分配任何东西,你无论如何都不能运行 GC。
-
不,OOM 杀手只是杀死一个进程。没有事先的“警告”。如果在 Go 中分配内存失败,也会选择“否”。
标签: go garbage-collection