To visualize the memory usage in your Go application using the `pprof` package, you can follow these steps:
1. Enable the pprof HTTP server:
- Import the `net/http/pprof` package in your application:
go
import _ "net/http/pprof"
- Start an HTTP server that will expose the pprof endpoints:
go
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
2. Capture a memory profile:
- In your application, trigger the memory profile capture at the desired point:
go
f, err := os.Create("mem.pprof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
runtime.GC() // Get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal(err)
}
3. Analyze the memory profile:
- Use the `go tool pprof` command to analyze the memory profile:
go tool pprof https://localhost:6060/debug/pprof/heap
- This will open an interactive pprof session where you can explore the memory usage of your application.
4. Visualize the memory profile:
- In the pprof interactive session, you can use the following commands to generate visual representations of the memory profile:
- `web`: Generate a graph visualization of the memory profile and open it in your default web browser.
- `svg`: Generate an SVG image of the memory profile and save it to a file.
- `pdf`: Generate a PDF file of the memory profile.
Here's an example of how you can put all these steps together in your Go application:
go
package main
import (
"log"
"net/http"
_ "net/http/pprof"
"os"
"runtime"
"runtime/pprof"
)
func main() {
// Start the pprof HTTP server
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// Your application logic here
// Capture a memory profile
f, err := os.Create("mem.pprof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
runtime.GC() // Get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal(err)
}
// Analyze the memory profile using go tool pprof
log.Println("Memory profile saved to mem.pprof")
log.Println("You can analyze it using: go tool pprof https://localhost:6060/debug/pprof/heap")
}
After running this application, you can use the `go tool pprof` command to analyze the memory profile and generate visual representations of the memory usage in your application.
Remember that the memory profile captures the state of memory at the time the profile was taken, so it's important to capture the profile at the appropriate time in your application's execution.
Citations:[1] https://reintech.io/blog/guide-golang-runtime-pprof-package-profiling-go-programs
[2] https://dev.to/immortalt/use-pprof-for-golang-program-memory-analysis-2cj6
[3] https://jvns.ca/blog/2017/09/24/profiling-go-with-pprof/
[4] https://www.reddit.com/r/golang/comments/11qdrhv/looking_for_a_tool_to_visualize_memory_usage_in/
[5] https://www.codingexplorations.com/blog/understanding-memory-leaks-in-go-and-how-to-avoid-them