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