Golang GOGC、GODEBUG、GOTRACEBACK 的使用场景和代码示范

12 min read

GOGC

GOGC 是 Golang 的垃圾回收控制变量。它的默认值是 100,即垃圾回收会在堆使用的 100% 时触发。我们可以通过修改其值来控制垃圾回收的频率。当我们的程序需要更大的堆时,我们可以将 GOGC 设置为更高的值。否则,将其设置为较低值可能会提高程序的性能。

示例代码:

package main

import "fmt"
import "runtime"

func main() {
    fmt.Println("Before GOGC:", runtime.NumGC())
    runtime.GC() // 主动触发垃圾回收
    fmt.Println("After GOGC:", runtime.NumGC())

    // 修改 GOGC 的值
    oldGOGC := runtime.GOGC
    runtime.GOGC = 200
    fmt.Println("Before GOGC 200:", runtime.NumGC())
    runtime.GC() // 主动触发垃圾回收
    fmt.Println("After GOGC 200:", runtime.NumGC())

    // 恢复原始 GOGC 的值
    runtime.GOGC = oldGOGC
    fmt.Println("After restore GOGC:", runtime.NumGC())
}

GODEBUG

GODEBUG 是一个用来管理 Golang 运行时的环境变量。它可以用来监测调试程序运行时的问题,例如卡死、死锁、垃圾回收等。GODEBUG 支持的选项有很多,可以通过设置不同的参数来获取不同的信息。下面是一些常用的 GODEBUG 选项:

  • 可以使用 GODEBUG=gctrace=1 来打开垃圾回收的追踪功能。
  • 可以使用 GODEBUG=schedtrace=1 来打开调度器的追踪功能。
  • 可以使用 GODEBUG=gocacheverify=1 来打开缓存验证功能,用于调试缓存。

示例代码:

package main

import "fmt"
import "os"

func main() {
    // 打开垃圾回收追踪
    os.Setenv("GODEBUG", "gctrace=1")
    fmt.Println("GODEBUG:", os.Getenv("GODEBUG"))

    // 打开调度器追踪
    os.Setenv("GODEBUG", "schedtrace=1")
    fmt.Println("GODEBUG:", os.Getenv("GODEBUG"))

    // 打开缓存验证功能
    os.Setenv("GODEBUG", "gocacheverify=1")
    fmt.Println("GODEBUG:", os.Getenv("GODEBUG"))
}

GOTRACEBACK

GOTRACEBACK 是 Golang 的运行时环境变量,用于控制错误时堆栈跟踪的级别。GOTRACEBACK 支持的选项有很多,可以通过设置不同的参数来获取不同的信息。下面是一些常用的 GOTRACEBACK 选项:

  • 可以使用 GOTRACEBACK=crash 来在程序崩溃时获取完整的堆栈跟踪信息。
  • 可以使用 GOTRACEBACK=all 来获取程序的完整堆栈跟踪。
  • 可以使用 GOTRACEBACK=single 来获取最顶层的错误信息和调用栈。

示例代码:

package main

import "os"

func main() {
    // 在程序崩溃时获取完整的堆栈跟踪信息
    os.Setenv("GOTRACEBACK", "crash")

    // 获取程序的完整堆栈跟踪
    os.Setenv("GOTRACEBACK", "all")

    // 获取最顶层的错误信息和调用栈
    os.Setenv("GOTRACEBACK", "single")
}