成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊什么是 Go Runtime.KeepAlive?

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

[[436758]]

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

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

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

  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 := &Fileowocgsc 
  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 會強制執行 GC,當我們執行這段代碼時會出現下面的錯誤。

  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 產生的文件描述符比較特殊,是個 int 類型,當以值拷貝的方式在函數間傳遞時,并不會讓 File.d 產生引用關系,于是 GC 發生時就會調用 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 延遲發生,保證我們的變量不被 GC 所回收。

結論

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

 

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

2020-06-17 07:40:26

監控系統zabbix

2021-07-26 05:10:13

JavaJakarta EEJSR

2021-07-20 08:03:43

微服務應用程序

2021-02-05 08:42:21

云原生系統方式

2022-03-18 10:43:12

WebSocketHTML5TCP 連接

2020-07-02 14:30:12

SDNSDON交換機

2022-03-17 21:30:31

BRAS寬帶服務器

2023-05-14 19:18:07

2022-10-28 08:46:57

變革型領導IT

2021-03-08 23:45:33

數字化轉型5G

2020-06-19 08:04:23

監控系統

2023-09-13 07:02:23

2015-09-07 09:53:02

Objective-CRuntime

2021-11-11 09:27:02

技術RedisMySQL

2022-05-31 09:17:08

通信網絡技術

2020-11-03 07:09:31

5GCPEWi-Fi

2020-08-07 14:28:04

裸金屬服務器云服務

2022-02-26 19:05:01

AI人工智能機器學習

2023-01-12 08:52:50

GoroutinesGo語言

2022-11-30 08:19:15

內存分配Go逃逸分析
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产69精品久久99不卡免费版 | 免费看91 | 91欧美精品| 91久久久www播放日本观看 | 狠狠干网站 | 欧美另类视频 | 在线高清免费观看视频 | 国产精品99久久久久久人 | 夜夜爽99久久国产综合精品女不卡 | 欧美一级免费观看 | 亚洲综合中文字幕在线观看 | 国产精彩视频 | 亚洲欧美日韩精品久久亚洲区 | 日韩在线视频免费观看 | 国产二区视频 | 亚洲精品久久久久久久久久久久久 | 久久9久| 伊人网伊人网 | 91久久北条麻妃一区二区三区 | 国产ts人妖系列高潮 | 中文字幕av第一页 | 久久天天躁狠狠躁夜夜躁2014 | 国产一区二区在线视频 | 成人在线视频免费观看 | 祝你幸福电影在线观看 | 日韩精品久久 | 亚洲一区二区三区免费观看 | 久久最新精品 | 国产农村妇女精品一区 | 免费视频久久 | 天堂在线91 | 91精品国产乱码麻豆白嫩 | 天天干狠狠操 | 精品三区 | 久久国内| 天天舔天天 | 精品国产一区二区三区四区在线 | 欧美日产国产成人免费图片 | 日韩精品一区二区三区视频播放 | 成人在线视频网 | 日韩不卡一区二区 |