Go语言环境安装完成后,可以使用 go env命令查看环境变量,打开命令终端执行go env命令,输出内容如下: ~~~ GOARCH="amd64" GOBIN="/Users/***/Desktop/go/bin" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/***/Desktop/go" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/darwin\_amd64" GCCGO="gccgo" CC="clang" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/pr/llzpdzcn6n7crtrjmpmwyjxm0000gn/T/go-build496244169=/tmp/go-build -gno-record-gcc-switches -fno-common" CXX="clang++" CGO\_ENABLED="1" CGO\_CFLAGS="-g -O2" CGO\_CPPFLAGS="" CGO\_CXXFLAGS="-g -O2" CGO\_FFLAGS="-g -O2" CGO\_LDFLAGS="-g -O2" PKG\_CONFIG="pkg-config" ~~~ ~~~ > runtime 包 包含与 Go 的运行时系统交互的操作,例如控制 goroutines 的函数。 > 也包含 reflect 包使用的低级别的类型信息;查看 reflect 的文档了解运行时类型的可编程接口。 > 以下环境变量($name 或 %name% 取决于主机操作系统)控制 Go 程序的运行时行为,其含义和用途可能会随版本发布而变化。 ~~~ ### GOGC `GOGC`变量设置初始垃圾收集目标百分比。 当新分配的数据与上一次收集后剩余的活动数据的比率达到此百分比时,将触发收集。 默认值为`GOGC = 100`。 设置`GOGC = off`会完全禁用垃圾收集器。 `runtime/debug`包的`SetGCPercent`函数允许在运行时更改此百分比。 ### GODEBUG `GODEBUG`变量控制运行时内的调试变量。 它是以逗号分隔的`name = val`对列表,用于设置这些命名变量: ~~~ allocfreetrace:设置 `allocfreetrace = 1` 会导致对每个对象的分配和释放进行概要分析和栈跟踪。 clobberfree:设置 `clobberfree = 1` 使垃圾回收器在释放对象时用错误内容破坏对象的内存内容。 cgocheck: 设置 `cgocheck = 0` 禁用使用 cgo 将 Go 指针错误传递到非 Go 代码的所有包检查。 设置 `cgocheck = 1`(默认值)可以启用相对便宜的检查,这些检查可能会遗漏一些错误。 设置 `cgocheck = 2` 启用昂贵的检查,这些检查不会遗漏任何错误,但是会导致程序运行速度变慢。 efence: 设置 `efence = 1` 会导致分配器以某种模式运行,在该模式下每个对象都分配在一个唯一的页面上,地址永远不会被回收。 gccheckmark: 设置 `gccheckmark = 1` 可以通过在 STW 时执行第二次标记传递来验证垃圾收集器的并发标记阶段。 如果第二次传递找到了一个并发标记未找到的可达对象,垃圾收集器将 panic。 gcpacertrace:设置 `gcpacertrace = 1` 会导致垃圾收集器打印有关并发 pacer 内部状态的信息。 gcshrinkstackoff: 设置 `gcshrinkstackoff = 1` 禁止将 goroutines 移动到较小的栈上。 在这种模式下,goroutine 的栈只能增长。 gcstoptheworld: 设置 `gcstoptheworld = 1` 禁用并发垃圾收集,使每个垃圾收集成为一个 STW 事件。 设置 `gcstoptheworld = 2` 还会在垃圾收集完成后禁用并发清除。 ~~~ * * * ~~~ gctrace: 设置 `gctrace = 1` 会导致垃圾收集器在每次收集时向标准错误输出发出一行, 汇总收集的内存量和暂停的长度。此行的格式可能会发生变化。 目前格式是: gc # @#s #%: #+#+# ms clock, #+#/#/#+# ms cpu, #->#-># MB, # MB goal, # P 其中字段含义如下('#' 代表数字):       gc #             每次 GC 时递增的 GC 编号       @#s              程序运行的秒数       #%               自程序启动后在 GC 中花费的时间百分比       #+...+#          GC 各阶段的挂钟时间(wall-clock)/CPU 时间       #->#-># MB       GC 开始时的堆大小、GC 结束时的堆大小和活动堆大小       # MB goal        目标堆大小       # P              使用的处理器数量 这些阶段是 stop-the-world(STW)清除终止(sweep termination), 并发标记和扫描,以及 STW 标记终止(mark termination)。 `mark/scan` 的 CPU 时间被分解为辅助时间(根据分配执行的 GC)、后台 GC 时间和空闲 GC 时间。 如果该行以 `"(forced)"` 结尾,则此 GC 由 `runtime.GC()` 调用强制执行。 ~~~ > **挂钟时间:** > > 根据计算机的内部时钟流逝的时间,这应该与外界的时间相匹配。 > > 这与 CPU 使用率无关; 它仅供参考。 > > > 如果挂钟时间 < CPU 时间,那么您正在并行执行一个程序。 > > > > 如果挂钟时间 > CPU时间,则表示您正在等待磁盘,网络或其他设备。 ~~~ 将 `gctrace` 设置为任何大于 0 的值也会导致垃圾收集器在将内存释放回系统时发出摘要。 将内存返回到系统的这个过程称为清除(`scavenging`)。 此摘要的格式可能会更改。 目前格式是:     scvg#: # MB released  printed only if non-zero     scvg#: inuse: # idle: # sys: # released: # consumed: # (MB) 其中字段含义如下('#' 代表数字):     scvg#           清除周期数,每次清除时递增     inuse: #        MB 已使用或部分使用的 spans     idle: #         MB spans 待清除     sys: #          从系统映射的 MB     released: #     释放到系统的 MB     consumed: #     从系统中分配的 MB ~~~ * * * ~~~ madvdontneed: 设置 madvdontneed = 1  当将内存返回到内核时,将在 Linux 上使用 MADV_DONTNEED 而不是 MADV_FREE。 这效率较低,但会导致 RSS(resident set size 常驻内存集)数量下降得更快。 ~~~ > madvise()  系统调用允许一个了解其内存行为的进程将其描述给系统,给予使用内存的建议。 > > > > **int > madvise(void \*addr, size\_t len, int advice);** > > > 系统可以使用传入的建议来更改其虚拟内存分页策略。 > > > 此建议可以提高应用程序和系统性能。建议有很多种其中两种: > > > **MADV\_DONTNEED:** > 表示应用程序不希望很快访问此地址范围。 > > > **MADV\_FREE:** > 表示应用程序不需要此地址范围中包含的信息,因此可以立即重用这些页面。 > 地址范围仍然有效。 ~~~ memprofilerate: 设置 `memprofilerate = X` 将更新 runtime.MemProfileRate 的值。 设置为 0 时,禁用内存分析。 MemProfileRate 控制在内存概要文件中记录和报告的内存分配比例。 分析器的目标是对每 `MemProfileRate` 字节的平均分配进行抽样。 要在概要文件中包含每个已分配的块,请将 `MemProfileRate` 设置为 1。 要完全关闭分析,请将 `MemProfileRate` 设置为 0。 处理内存概要文件的工具假设概要文件速率在程序的整个生命周期中是恒定的,并且等于当前值。 更改内存分析速率的程序应该只改变一次,在程序执行过程中越早越好(例如,在 `main` 的开头)。 var MemProfileRate int = 512 * 1024 ~~~ * * * ~~~ invalidptr: 默认 `invalidptr = 1`,如果在指针类型的位置中发现无效的指针值(例如,1), 则会导致垃圾收集器和栈复制器使程序 crash。 设置 `invalidptr = 0` 将禁用此检查。 这应该只被用作诊断错误代码的临时解决方案。 真正的解决方案是不将整数存储在指针类型的位置。 ~~~ * * * ~~~ sbrk: 设置 `sbrk = 1` 用一个简单的分配器替换内存分配器和垃圾收集器, 该分配器从操作系统获取内存并且永远不会回收任何内存。 ~~~ * * * ~~~ scavenge: `scavenge = 1` 启用堆清除程序的调试模式。 ~~~ * * * ~~~ scheddetail: 设置 `schedtrace = X` 和 `scheddetail = 1` 会导致调度程序每 `X` 毫秒发出一次详细的多行信息, 描述`调度程序`,`处理器`,`线程` 和 `goroutines` 的状态。 schedtrace: 设置 `schedtrace = X` 使调度程序每 `X` 毫秒发出一行标准错误,汇总调度程序状态。 ~~~ * * * ~~~ tracebackancestors: 设置 `tracebackancestors = N` 使用创建 `goroutines` 的栈扩展回溯, 其中 `N` 限制要报告的祖先 `goroutines` 的数量。 这也扩展了 `runtime.Stack` 返回的信息。 祖先的 `goroutine IDs` 将引用创建时 goroutine 的 ID; 这个 ID 有可能被重用于另一个 goroutine。 将 `N` 设置为 0 将不报告任何祖先信息。 ~~~ `net`,`net/http`和`crypto/tls` 也引用`GODEBUG`中的调试变量,有关详细信息,请参阅这些包的文档。 ### GOMAXPROCS `GOMAXPROCS`变量限制了可以同时执行用户级 Go 代码的操作系统线程数 (即,可以同时执行的最大`CPU`数)。 代表 Go 代码在系统调用中可以阻塞的线程数没有限制;那些不计入`GOMAXPROCS`限制。 该包的`GOMAXPROCS`函数查询并更改限制。 ### GOTRACEBACK `GOTRACEBACK`变量控制 Go 程序因未恢复的`panic`或意外的运行时条件而失败时生成的输出量。 默认情况下,失败会打印当前`goroutine`的栈跟踪,省略运行时系统内部的函数,然后使用退出代码`2`退出。 如果当前`goroutine`或者故障都不在运行时内部,则故障会打印所有`goroutines`的栈跟踪。 * `GOTRACEBACK = none`完全省略了 goroutine 栈跟踪。 * `GOTRACEBACK = single`(默认值)的行为如上所述。 * `GOTRACEBACK = all`为用户创建的所有 goroutines 添加栈跟踪。 * `GOTRACEBACK=system`就像`"all"`,但为运行时函数添加了栈帧,并显示了运行时内部创建的 goroutine。 * `GOTRACEBACK=crash`就像`"system"`,但是以特定于操作系统的方式 crash 而不是退出。例如,在`Unix`系统上,`crash`引发`SIGABRT`以触发核心转储(`core dump`)。 由于历史原因,`GOTRACEBACK`设置`0`,`1`和`2`分别是`none`,`all`和`system`的同义词。 `runtime/debug`包的`SetTraceback`函数允许在运行时增加输出量,但不能减少到低于环境变量指定的输出量。