前言
为啥会有这篇博客呢,因为我在一个坑里面掉了两次…
这两周在实习,还算是适应,体会就是自己真的太菜了….大佬云集
特别是源码的升级和追踪方面,记录一下第二次遇到这个问题
mentor跟我说的时候这是血的教训,跑服务的时候跑着跑着内存炸了,最后发现是正则的问题
案例
正常使用正则的例子,
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package main
import ( "fmt" "regexp" )
func main() {
r, _ := regexp.Compile("p([a-z]+)ch")
fmt.Println(r.MatchString("peach"))
}
|
因为立马main函数就结束了,释放了这个go进程,但是如果一直循环调用这个正则,比如循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package main
import ( "fmt" "regexp" )
func main() { for i:=0;i<1000;i++{ r, _ := regexp.Compile("p([a-z]+)ch") fmt.Println(r.MatchString("peach")) }
}
|
在for循环中不断的正则Compile就会不断对r进行赋值,但是go不会对之前的新建内存进行gc…然后就不断累加内存最后炸了…
也就是传说中的,内存泄漏
解决方案
所以如果要被多次调用正则的时候,需要将这个正则表达式模式提出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package main
import ( "fmt" "regexp" )
r, _ := regexp.Compile("p([a-z]+)ch")
func main() { for i:=0;i<1000;i++{ fmt.Println(r.MatchString("peach")) }
}
|
结论
过一过二不过三…