猿问

golang 如何限制内存

packagemain
import(
"fmt"
"syscall"
)
funcf(iint)int{
ifi<10000{
i++
fmt.Println(i)
a:=make([]byte,100)
a=append(a,byte(1))
b:=f(i)
returnb
}else{
returni
}
}
funcmain(){
varrlimitsyscall.Rlimit
rlimit.Cur=1
rlimit.Max=2
//syscall.Setrlimit(syscall.RLIMIT_CPU,&rlimit)
rlimit.Cur=100//以字节为单位
rlimit.Max=rlimit.Cur+1024
err:=syscall.Setrlimit(syscall.RLIMIT_STACK,&rlimit)
iferr!=nil{
panic(err)
}
f(0)
/*
fori:=0;i<1000000;i++{
forj:=0;j<100000;j++{
forq:=0;q<1000;q++{
a=append(a,[]byte{1,2,3}...)
}
}
}
*/
}
我想要用rlimit系统调用限制进程的资源.
如果去掉注释,可以限制时间,但是不知道为什么限制不了内存.
go的内存似乎是在堆上分配的,怎样统计比较合适呢?
另外:golang下面没有ptrlimit调用,如果要限制子进程的资源的话应该怎么办?
慕村9548890
浏览 1976回答 2
2回答

达令说

要统计内存,可以使用runtime.MemProfile。go完全不使用stack,所有内存都在堆上分配,有可能你Setrlimit是因为这个原因不工作,不过我不太确定。prlimit也许是因为无法跨平台才没有的吧,你如果需要自己用cgo写一个,go和c语言集成极度的方便,你可以看看文档自己写一下。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答