github.com/razvanm/vanadium-go-1.3@v0.0.0-20160721203343-4a65068e5915/test/gc2.go (about)

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