前言
为啥会有这篇博客呢,因为我在一个坑里面掉了两次…
这两周在实习,还算是适应,体会就是自己真的太菜了….大佬云集
特别是源码的升级和追踪方面,记录一下第二次遇到这个问题
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"))     }
  }
   | 
 
结论
过一过二不过三…