tg-me.com/golang_for_two/49
Last Update:
Note #24 Go и runtime
Существует много споров на тему Go рантайм
и Go
пакета runtime
. Давайте разберемся с этим вопросом.
C одной стороны в Go есть рантайм, который написан на Go в отличии от Java(написан на С). C точки зрения архитектуры, рантайм - это просто коллекция нескольких уникальных частей, самые важные из которых: сборщик мусора и планировщик горутин (goroutine scheduler).
С другой стороны, Go рантайм также реализует фичи, которые экспортируются наружу c помощью пакета runtime
. C помощью пакета runtime
можно осуществлять управление сборщиком мусора и выводить различную дебаг информация см (runwww.tg-me.com/debug).
Либо вывести сколько памяти занимает ваша программа:
package main
import (
"runtime"
"fmt"
"time"
)
func PrintMememoryStats() {
var m runtime.MemStats
// The returned memory allocator statistics are up to date as of the call to ReadMemStats. This is in contrast with a heap profile, which is a snapshot as of the most recently completed garbage collection cycle.
runtime.ReadMemStats(&m)
fmt.Printf("Alloc = %v Mb", m.Alloc / 1024 / 1024)
fmt.Printf(" TotalAlloc = %v Mb", m.TotalAlloc / 1024 / 1024)
fmt.Printf(" Sys = %v Mb", m.Sys / 1024 / 1024)
fmt.Printf(" NumGC = %v\n", m.NumGC)
}
func main() {
PrintMememoryStats()
var total [][]int
for i := 0; i<3; i++ {
array := make([]int, 0, 4200000)
total = append(total, array)
PrintMememoryStats()
time.Sleep(time.Second)
}
PrintMememoryStats()
runtime.GC()
PrintMememoryStats()
}
Note: Также важно понимать, что Go рантайм не включает в себя виртуальную машину, а код программы на Go компилируется сразу в машинный код, кстати это позволяет нам так легко писать программы, которые легко портируются на разные ОС. Поэтому в контексте Go - когда говорят Go и runtime - это обычно имя пакета, а не виртуальное окружение в котором программа на Go запускается.
BY 🇺🇦 Go for two :)
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/golang_for_two/49