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  }