自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊什么是 Go Runtime.KeepAlive?

開發(fā) 后端
有些同學喜歡利用 runtime.SetFinalizer 模擬析構函數(shù),當變量被回收時,執(zhí)行一些回收操作,加速一些資源的釋放。在做性能優(yōu)化的時候這樣做確實有一定的效果,不過這樣做是有一定的風險的。

[[436758]]

本文轉載自微信公眾號「HHFCodeRv」,作者haohongfan。轉載本文請聯(lián)系HHFCodeRv公眾號。

有些同學喜歡利用 runtime.SetFinalizer 模擬析構函數(shù),當變量被回收時,執(zhí)行一些回收操作,加速一些資源的釋放。在做性能優(yōu)化的時候這樣做確實有一定的效果,不過這樣做是有一定的風險的。

比如下面這段代碼,初始化一個文件描述符,當 GC 發(fā)生時釋放掉無效的文件描述符。

  1. type File struct { d int } 
  2.  
  3. func main() { 
  4.     p := openFile("t.txt"
  5.     content := readFile(p.d) 
  6.  
  7.     println("Here is the content: "+content) 
  8.  
  9. func openFile(path string) *File { 
  10.     d, err := syscall.Open(path, syscall.O_RDONLY, 0) 
  11.     if err != nil { 
  12.       panic(err) 
  13.     } 
  14.  
  15.     p := &Filek6zqhab033oa 
  16.     runtime.SetFinalizer(p, func(p *File) { 
  17.       syscall.Close(p.d) 
  18.     }) 
  19.  
  20.     return p 
  21.  
  22. func readFile(descriptor int) string { 
  23.     doSomeAllocation() 
  24.  
  25.     var buf [1000]byte 
  26.     _, err := syscall.Read(descriptor, buf[:]) 
  27.     if err != nil { 
  28.       panic(err) 
  29.     } 
  30.  
  31.     return string(buf[:]) 
  32.  
  33. func doSomeAllocation() { 
  34.     var a *int 
  35.  
  36.     // memory increase to force the GC 
  37.     for i:= 0; i < 10000000; i++ { 
  38.       i := 1 
  39.       a = &i 
  40.     } 
  41.  
  42.     _ = a 

上面這段代碼是對 go 官方文檔[1]的一個延伸,doSomeAllocation 會強制執(zhí)行 GC,當我們執(zhí)行這段代碼時會出現(xiàn)下面的錯誤。

  1. panic: no such file or directory 
  2.  
  3. goroutine 1 [running]: 
  4. main.openFile(0x107a65e, 0x5, 0x10d9220) 
  5.         main.go:20 +0xe5 
  6. main.main() 
  7.         main.go:11 +0x3a 

這是因為 syscall.Open 產(chǎn)生的文件描述符比較特殊,是個 int 類型,當以值拷貝的方式在函數(shù)間傳遞時,并不會讓 File.d 產(chǎn)生引用關系,于是 GC 發(fā)生時就會調用 runtime.SetFinalizer(p, func(p *File) 導致文件描述符被 close 掉。

什么是 runtime.KeepAlive ?

如上面的例子,我們如果才能讓文件描述符不被 gc 給釋放掉呢?其實很簡單,只需要調用 runtime.KeepAlive 即可。

  1. func main() { 
  2.     p := openFile("t.txt"
  3.     content := readFile(p.d) 
  4.      
  5.     runtime.KeepAlive(p) 
  6.  
  7.     println("Here is the content: "+content) 

runtime.KeepAlive 能阻止 runtime.SetFinalizer 延遲發(fā)生,保證我們的變量不被 GC 所回收。

結論

正常情況下,runtime.KeepAlive,runtime.SetFinalizer 不應該被濫用,當我們真的需要使用時候,要注意使用是否合理。

 

責任編輯:武曉燕 來源: HHFCodeRv
相關推薦

2021-07-20 08:03:43

微服務應用程序

2020-06-17 07:40:26

監(jiān)控系統(tǒng)zabbix

2021-07-26 05:10:13

JavaJakarta EEJSR

2021-02-05 08:42:21

云原生系統(tǒng)方式

2022-03-18 10:43:12

WebSocketHTML5TCP 連接

2022-10-28 08:46:57

變革型領導IT

2022-03-17 21:30:31

BRAS寬帶服務器

2020-07-02 14:30:12

SDNSDON交換機

2023-05-14 19:18:07

2021-03-08 23:45:33

數(shù)字化轉型5G

2020-06-19 08:04:23

監(jiān)控系統(tǒng)

2023-09-13 07:02:23

2015-09-07 09:53:02

Objective-CRuntime

2023-01-12 08:52:50

GoroutinesGo語言

2021-11-11 09:27:02

技術RedisMySQL

2020-08-07 14:28:04

裸金屬服務器云服務

2020-11-03 07:09:31

5GCPEWi-Fi

2022-05-31 09:17:08

通信網(wǎng)絡技術

2022-02-26 19:05:01

AI人工智能機器學習

2023-12-05 17:57:13

nginx參數(shù)
點贊
收藏

51CTO技術棧公眾號