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