mirror of
https://github.com/golang/go
synced 2024-11-14 08:30:25 -07:00
9d93d57465
The gccgo library generates some garbage in the init routines because it handles interfaces slightly differently. Since the test sets MemStats.Alloc to 0, the first time the garbage collector runs it goes negative and the test fails. R=rsc, r2 CC=golang-dev https://golang.org/cl/2110044
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
// $G $D/$F.go && $L $F.$A && ./$A.out
|
|
|
|
// Copyright 2009 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.
|
|
|
|
// Repeated malloc test.
|
|
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"runtime"
|
|
)
|
|
|
|
var chatty = flag.Bool("v", false, "chatty")
|
|
|
|
var oldsys uint64
|
|
|
|
func bigger() {
|
|
if st := runtime.MemStats; oldsys < st.Sys {
|
|
oldsys = st.Sys
|
|
if *chatty {
|
|
println(st.Sys, " system bytes for ", st.Alloc, " Go bytes")
|
|
}
|
|
if st.Sys > 1e9 {
|
|
println("too big")
|
|
panic("fail")
|
|
}
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
runtime.GC() // clean up garbage from init
|
|
runtime.MemProfileRate = 0 // disable profiler
|
|
runtime.MemStats.Alloc = 0 // ignore stacks
|
|
flag.Parse()
|
|
for i := 0; i < 1<<7; i++ {
|
|
for j := 1; j <= 1<<22; j <<= 1 {
|
|
if i == 0 && *chatty {
|
|
println("First alloc:", j)
|
|
}
|
|
if a := runtime.MemStats.Alloc; a != 0 {
|
|
println("no allocations but stats report", a, "bytes allocated")
|
|
panic("fail")
|
|
}
|
|
b := runtime.Alloc(uintptr(j))
|
|
during := runtime.MemStats.Alloc
|
|
runtime.Free(b)
|
|
if a := runtime.MemStats.Alloc; a != 0 {
|
|
println("allocated ", j, ": wrong stats: during=", during, " after=", a, " (want 0)")
|
|
panic("fail")
|
|
}
|
|
bigger()
|
|
}
|
|
if i%(1<<10) == 0 && *chatty {
|
|
println(i)
|
|
}
|
|
if i == 0 {
|
|
if *chatty {
|
|
println("Primed", i)
|
|
}
|
|
// runtime.frozen = true
|
|
}
|
|
}
|
|
}
|