以下内容,是对 运行时 runtime的神奇用法 的学习与记录
目录:
- 1.获取GOROOT环境变量
- 2.获取GO的版本号
- 3.获取本机CPU个数
- 4.设置最大可同时执行的最大CPU数
- 5.设置cup profile 记录的速录
- 6.查看cup profile 下一次堆栈跟踪数据
- 7.立即执行一次垃圾回收
- 8.给变量绑定方法,当垃圾回收的时候进行监听
- 9.查看内存申请和分配统计信息
- 10.查看程序正在使用的字节数
- 11.查看程序正在使用的对象数
- 12.获取调用堆栈列表
- 13.获取内存profile记录历史
- 14.执行一个断点
- 15.获取程序调用go协程的栈踪迹历史
- 16.获取当前函数或者上层函数的标识号、文件名、调用方法在当前文件中的行号
- 17.获取与当前堆栈记录相关链的调用栈踪迹
- 18.获取一个标识调用栈标识符pc对应的调用栈
- 19.获取调用栈所调用的函数的名字
- 20.获取调用栈所调用的函数的所在的源文件名和行号
- 21.获取该调用栈的调用栈标识符
- 22.获取当前进程执行的cgo调用次数
- 23.获取当前存在的go协程数
- 24.终止掉当前的go协程
- 25.让其他go协程优先执行,等其他协程执行完后,在执行当前的协程
- 26.获取活跃的go协程的堆栈profile以及记录个数
- 27.将调用的go协程绑定到当前所在的操作系统线程,其它go协程不能进入该线程
- 28.解除go协程与操作系统线程的绑定关系
- 29.获取线程创建profile中的记录个数
- 30.控制阻塞profile记录go协程阻塞事件的采样率
- 31.返回当前阻塞profile中的记录个数
1. GOROOT()获取GOROOT环境变量
GOROOT() 返回Go的根目录。如果存在GOROOT环境变量,返回该变量的值;否则,返回创建Go时的根目录
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println(runtime.GOROOT()) // /Users/fliter/.g/go
}
2. Version() 获取GO的版本号
Version() 返回Go的版本字符串。要么是提交的hash和创建时的日期;要么是发行标签如"go1.20"
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println(runtime.Version()) // go1.19
}
3. NumCPU() 获取本机CPU个数
NumCPU返回本地机器的逻辑CPU个数
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println(runtime.NumCPU()) // 8
}
4. GOMAXPROCS() 设置最大可同时执行的最大CPU数
GOMAXPROCS() 设置可同时执行的最大CPU数,并返回先前的设置。 若 n < 1,则不会更改当前设置。
本地机器的逻辑CPU数可通过 NumCPU 查询。该函数在调度程序优化后会去掉?(啥时候..)
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
startTime := time.Now()
var s1 chan int64 = make(chan int64)
var s2 chan int64 = make(chan int64)
var s3 chan int64 = make(chan int64)
var s4 chan int64 = make(chan int64)
go calc(s1)
go calc(s2)
go calc(s3)
go calc(s4)