Source file test/gc2.go

     1  // run
     2  
     3  //go:build !nacl && !js
     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  }
    47  

View as plain text