欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang程序如何查找內(nèi)存泄漏(pprof)

 更新時間:2024年12月20日 10:52:58   作者:守望先鋒第一亞索  
該文章詳細介紹了如何使用Golang的pprof工具查找內(nèi)存泄漏,首先,在main包中引入pprof包并設置條件編譯,然后編譯程序并運行,通過執(zhí)行gotoolpprof-inuse_space命令,可以進入交互模式并使用top命令查看內(nèi)存分配最多的函數(shù),如果本機中有源代碼

Golang程序查找內(nèi)存泄漏

1. 在main包中

選擇在一個單獨文件中加上pprof包引用并設置條件編譯,這樣不會與develop正式版本代碼產(chǎn)生任何耦合。

// +build debug

package main

import (
	"net/http"
	_ "net/http/pprof"
)

func init() {
	go http.ListenAndServe(":18080", nil)
}

2. 編譯

 go build -tags debug .

3. 在目標機中運行剛編譯出來的debug版本程序

本例中ip為隨意編寫的。

4. 執(zhí)行

go tool pprof -inuse_space http://192.168.20.5:18080/debug/pprof/heap進入交互模式:

[user@LAPTOP-LCP testtool]$ go tool pprof -inuse_space http://192.168.20.5:18080/debug/pprof/heap
Fetching profile over HTTP from http://192.168.20.5:18080/debug/pprof/heap
Saved profile in C:\Users\Noname\pprof\pprof.testtool.alloc_objects.alloc_space.inuse_objects.inuse_space.006.p
b.gz
File: testtool
Type: inuse_space
Time: Aug 16, 2022 at 2:24pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top 10
Showing nodes accounting for 27831.78kB, 100% of 27831.78kB total
Showing top 10 nodes out of 35
flat flat% sum% cum cum%
11787.50kB 42.35% 42.35% 11787.50kB 42.35% runtime.allocm
9382.95kB 33.71% 76.07% 9382.95kB 33.71% io.ReadAll
2561.02kB 9.20% 85.27% 2561.02kB 9.20% runtime.malg
1536.21kB 5.52% 90.79% 1536.21kB 5.52% github.com/aws/aws-sdk-go/aws/endpoints.init
514kB 1.85% 92.63% 514kB 1.85% bufio.NewReaderSize
514kB 1.85% 94.48% 514kB 1.85% bufio.NewWriterSize
512.08kB 1.84% 96.32% 512.08kB 1.84% net/http.newTransferWriter
512.02kB 1.84% 98.16% 512.02kB 1.84% runtime.gcBgMarkWorker
512kB 1.84% 100% 512kB 1.84% runtime.doaddtimer
0 0% 100% 9382.95kB 33.71% io/ioutil.ReadAll
(pprof)
(pprof)

交互界面使用top命令查看內(nèi)存分配最多的函數(shù)。

如果本機中有源代碼,可以使用list命令查看源代碼中哪一行分配的函數(shù)最多。

(pprof)
(pprof) list io.ReadAll
Total: 27.18MB
ROUTINE ======================== io.ReadAll in C:\Program Files\Go\src\io\io.go
9.16MB 9.16MB (flat, cum) 33.71% of Total
. . 626:func ReadAll(r Reader) ([]byte, error) {
. . 627: b := make([]byte, 0, 512)
. . 628: for {
. . 629: if len(b) == cap(b) {
. . 630: // Add more capacity (let append pick how much).
9.16MB 9.16MB 631: b = append(b, 0)[:len(b)]
. . 632: }
. . 633: n, err := r.Read(b[len(b):cap(b)])
. . 634: b = b[:len(b)+n]
. . 635: if err != nil {
. . 636: if err == EOF {
(pprof)
(pprof)

5. 也可以使用以下命令直接導出調(diào)用圖

非常直觀(需要安裝Graphviz,詳詢Download | Graphviz

go tool pprof -inuse_space -png http://192.168.20.5:18080/debug/pprof/heap > heap.png

可以在圖片中直觀地看到,調(diào)用過程中每個函數(shù)的內(nèi)存使用占比。

出現(xiàn)內(nèi)存泄漏時,如果只查看一次很難確定真正出現(xiàn)內(nèi)存泄露的代碼位置,可以在程序運行一段時間后,程序出現(xiàn)內(nèi)存泄露已經(jīng)很明顯后,再次查看內(nèi)存占用分析圖,找到兩張圖中內(nèi)存占用比例相差最大的函數(shù)。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Golang使用gob實現(xiàn)結構體的序列化過程詳解

    Golang使用gob實現(xiàn)結構體的序列化過程詳解

    Golang struct類型數(shù)據(jù)序列化用于網(wǎng)絡傳輸數(shù)據(jù)或在磁盤上寫入數(shù)據(jù)。在分布式系統(tǒng)中,一端生成數(shù)據(jù)、然后序列化、壓縮和發(fā)送;在另一端,接收數(shù)據(jù)、然后解壓縮、反序列化和處理數(shù)據(jù),整個過程必須快速有效
    2023-03-03
  • gorm整合進go-zero的實現(xiàn)方法

    gorm整合進go-zero的實現(xiàn)方法

    go-zero提供的代碼生成器里面,沒有提供orm框架操作,但是提供了遍歷的緩存操作,所以可以利用gorm當作一個sql語句的生成器,把生成后的sql語句放到go-zero生成的模板中去執(zhí)行,對gorm整合進go-zero的實現(xiàn)方法感興趣的朋友一起看看吧
    2022-03-03
  • Golang的循環(huán)中break和continue語句的用法講解

    Golang的循環(huán)中break和continue語句的用法講解

    這篇文章主要介紹了Golang的循環(huán)中break和continue語句的用法講解,是Go語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • Golang日志操作庫zap的使用詳解

    Golang日志操作庫zap的使用詳解

    zap?是?uber?開源的一個高性能,結構化,分級記錄的日志記錄包,本文主要為大家詳細介紹了zap的具體使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • 基于go語言實現(xiàn)圖片驗證碼的代碼示例

    基于go語言實現(xiàn)圖片驗證碼的代碼示例

    這篇文章主要為大家詳細介紹了基于go語言實現(xiàn)圖片驗證碼的代碼示例,文中的示例代碼簡潔易懂,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • Go語言并發(fā)之context標準庫的使用詳解

    Go語言并發(fā)之context標準庫的使用詳解

    Context的出現(xiàn)是為了解決在大型應用程序中的并發(fā)環(huán)境下,協(xié)調(diào)和管理多個goroutine之間的通信、超時和取消操作的問題,本文就來和大家簡單聊聊它的具體用法,希望對大家有所幫助
    2023-06-06
  • Go語言中結構體方法副本傳參與指針傳參的區(qū)別介紹

    Go語言中結構體方法副本傳參與指針傳參的區(qū)別介紹

    這篇文章主要給大家介紹了關于Go語言中結構體方法副本傳參與指針傳參的區(qū)別的相關資料,文中先對GO語言結構體方法跟結構體指針方法的區(qū)別進行了一些簡單的介紹,來幫助大家理解學習,需要的朋友可以參考下。
    2017-12-12
  • 通過函數(shù)如何將golang?float64?保留2位小數(shù)(方法匯總)

    通過函數(shù)如何將golang?float64?保留2位小數(shù)(方法匯總)

    這篇文章主要介紹了通過函數(shù)將golang?float64保留2位小數(shù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Go語言獲取數(shù)組長度的方法

    Go語言獲取數(shù)組長度的方法

    這篇文章主要介紹了Go語言獲取數(shù)組長度的方法,實例分析了len函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • go連接mysql的項目實踐

    go連接mysql的項目實踐

    本文主要介紹了go連接mysql的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03

最新評論