github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/gc2.go (about) 1 // run 2 3 // Copyright 2011 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test that buffered channels are garbage collected properly. 8 // An interesting case because they have finalizers and used to 9 // have self loops that kept them from being collected. 10 // (Cyclic data with finalizers is never finalized, nor collected.) 11 12 package main 13 14 import ( 15 "fmt" 16 "os" 17 "runtime" 18 ) 19 20 func main() { 21 const N = 10000 22 st := new(runtime.MemStats) 23 memstats := new(runtime.MemStats) 24 runtime.ReadMemStats(st) 25 for i := 0; i < N; i++ { 26 c := make(chan int, 10) 27 _ = c 28 if i%100 == 0 { 29 for j := 0; j < 4; j++ { 30 runtime.GC() 31 runtime.Gosched() 32 runtime.GC() 33 runtime.Gosched() 34 } 35 } 36 } 37 38 runtime.ReadMemStats(memstats) 39 obj := memstats.HeapObjects - st.HeapObjects 40 if obj > N/5 { 41 fmt.Println("too many objects left:", obj) 42 os.Exit(1) 43 } 44 }