// 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. package runtime_test import ( "runtime" "testing" ) func TestGcSys(t *testing.T) { defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) memstats := new(runtime.MemStats) runtime.GC() runtime.ReadMemStats(memstats) sys := memstats.Sys runtime.MemProfileRate = 0 // disable profiler itercount := 1000000 if testing.Short() { itercount = 100000 } for i := 0; i < itercount; i++ { workthegc() } // Should only be using a few MB. // We allocated 100 MB or (if not short) 1 GB. runtime.ReadMemStats(memstats) if sys > memstats.Sys { sys = 0 } else { sys = memstats.Sys - sys } t.Logf("used %d extra bytes", sys) if sys > 16<<20 { t.Fatalf("using too much memory: %d bytes", sys) } } func workthegc() []byte { return make([]byte, 1029) } func TestGcDeepNesting(t *testing.T) { type T [2][2][2][2][2][2][2][2][2][2]*int a := new(T) // Prevent the compiler from applying escape analysis. // This makes sure new(T) is allocated on heap, not on the stack. t.Logf("%p", a) a[0][0][0][0][0][0][0][0][0][0] = new(int) *a[0][0][0][0][0][0][0][0][0][0] = 13 runtime.GC() if *a[0][0][0][0][0][0][0][0][0][0] != 13 { t.Fail() } }