LINUX.ORG.RU

История изменений

Исправление kaldeon, (текущая версия) :

Выключил гц, запустил 100,000,000 итераций, выводя текущее и общее числа аллокаций на каждой 10,000,000 итерации, включил гц и снова сделал замеры — всё освободилось.

; go vet && go run lor.go
alloc (kib)  totalalloc (kib)  
110          110               
234486       234486            
468861       468861            
703236       703236            
937611       937611            
1171986      1171986           
1406362      1406362           
1640737      1640737           
1875112      1875112           
2109488      2109488           
2343863      2343863           
124          2343877           

Код:

func main() {
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
	defer w.Flush()

	memstats := func() {
		var m runtime.MemStats
		runtime.ReadMemStats(&m)
		fmt.Fprintf(w, "%v\t%v\t\n", m.Alloc/1024, m.TotalAlloc/1024)
	}

	debug.SetGCPercent(-1)

	fmt.Fprintln(w, "alloc (kib)\ttotalalloc (kib)\t")

	state := Printsum
	for i := 0; i < 100_000_000; i++ {
		if (i % 10_000_000) == 0 {
			memstats()
		}
		state = state(i)
	}

	memstats()
	runtime.GC()
	memstats()
}

Исправление kaldeon, :

Выключил гц, запустил 100,000,000 итераций, выводя текущее и общее числа аллокаций на каждой 10,000,000 итерации, включил гц и снова сделал замеры — всё освободилось.

% go vet && go run lor.go
alloc (kib)  totalalloc (kib)  
110          110               
234486       234486            
468861       468861            
703236       703236            
937611       937611            
1171986      1171986           
1406362      1406362           
1640737      1640737           
1875112      1875112           
2109488      2109488           
2343863      2343863           
124          2343877           

Код:

func main() {
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
	defer w.Flush()

	memstats := func() {
		var m runtime.MemStats
		runtime.ReadMemStats(&m)
		fmt.Fprintf(w, "%v\t%v\t\n", m.Alloc/1024, m.TotalAlloc/1024)
	}

	debug.SetGCPercent(-1)

	fmt.Fprintln(w, "alloc (kib)\ttotalalloc (kib)\t")

	state := Printsum
	for i := 0; i < 100_000_000; i++ {
		if (i % 10_000_000) == 0 {
			memstats()
		}
		state = state(i)
	}

	memstats()
	runtime.GC()
	memstats()
}

Исправление kaldeon, :

Выключил гц, запустил 100,000,000 итераций, выводя текущее и общее числа аллокаций на каждой 10,000,000 итерации, включил гц и снова сделал замеры — гц освободил всё.

% go vet && go run lor.go
alloc (kib)  totalalloc (kib)  
110          110               
234486       234486            
468861       468861            
703236       703236            
937611       937611            
1171986      1171986           
1406362      1406362           
1640737      1640737           
1875112      1875112           
2109488      2109488           
2343863      2343863           
124          2343877           

Код:

func main() {
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
	defer w.Flush()

	memstats := func() {
		var m runtime.MemStats
		runtime.ReadMemStats(&m)
		fmt.Fprintf(w, "%v\t%v\t\n", m.Alloc/1024, m.TotalAlloc/1024)
	}

	debug.SetGCPercent(-1)

	fmt.Fprintln(w, "alloc (kib)\ttotalalloc (kib)\t")

	state := Printsum
	for i := 0; i < 100_000_000; i++ {
		if (i % 10_000_000) == 0 {
			memstats()
		}
		state = state(i)
	}

	memstats()
	runtime.GC()
	memstats()
}

Исходная версия kaldeon, :

Выключил гц, запустил 100,000,000 итераций, выводя текущее и общее числа аллокаций на каждой 10,000,000 итерации, выключил гц и снова сделал замеры — гц освободил всё.

% go vet && go run lor.go
alloc (kib)  totalalloc (kib)  
110          110               
234486       234486            
468861       468861            
703236       703236            
937611       937611            
1171986      1171986           
1406362      1406362           
1640737      1640737           
1875112      1875112           
2109488      2109488           
2343863      2343863           
124          2343877           

Код:

func main() {
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
	defer w.Flush()

	memstats := func() {
		var m runtime.MemStats
		runtime.ReadMemStats(&m)
		fmt.Fprintf(w, "%v\t%v\t\n", m.Alloc/1024, m.TotalAlloc/1024)
	}

	debug.SetGCPercent(-1)

	fmt.Fprintln(w, "alloc (kib)\ttotalalloc (kib)\t")

	state := Printsum
	for i := 0; i < 100_000_000; i++ {
		if (i % 10_000_000) == 0 {
			memstats()
		}
		state = state(i)
	}

	memstats()
	runtime.GC()
	memstats()
}