1、检查Cmd对象是否释放资源。
-
Java 代码
1 | cmd := exec.Command( "sleep" , "5" ) |
6 | log.Printf( "Waiting for command to finish..." ) |
8 | log.Printf( "Command finished with error: %v" , err) |
Start starts the specified command but does not wait for it to complete.
The Wait method will return the exit code and release associated resources once the command exits.
2、检查Process对象是否释放资源。
-
Java 代码
03 | Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, //其他变量如果不清楚可以不设定 |
05 | p, err := os.StartProcess( "/usr/bin/vim" , []string{ "/usr/bin/vim" , "tmp.txt" }, attr) //vim 打开tmp.txt文件 |
10 | pro, _ := os.FindProcess(p.Pid) //查找进程 |
13 | err = p.Kill() //杀死进程但不释放进程相关资源 |
16 | err = p.Release() // 释放进程相关资源,因为资源释放凋之后进程p就不能进行任何操作,此后进程P的任何操作都会被报错</span> |
3、检查Reponse对象是否释放资源。
-
Java 代码
2 | _, err = http.Post(url, "" , nil) // 此处返回的reponse对象被忽略掉,应调用resp.Body.Close()释放资源 |
4、检查Ticker对象是否正释放资源
-
Java 代码
02 | ticker := time.NewTicker(time.Second) |
03 | defer ticker.Stop() // 如果未调用该方法,会造成ticker资源无法释放 |
04 | done := make(chan bool) |
06 | time.Sleep( 10 * time.Second) |
15 | fmt.Println( "Current time: " , t) |
5、检查文件对象是否释放资源
-
Java 代码
1 | h, err := os.Open( "/path/to/file.txt" ) |
4 | return ; // 此处直接返回,会导致句柄泄漏 |
-
Java 代码
04 | fOut, err := os.OpenFile(fileTempPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644 ) |
05 | defer fOut.Close() // defer只有在函数退出时调用,而且此处调用多次,defer栈会越来越大 |
07 | gsflog.Error( "fail to creat file:" , fileTempPath, err) |
10 | if errPerm := os.Chmod(fileTempPath, 0600 ); errPerm != nil { |
11 | gsflog.Error( "change bill path perm fail:" , errPerm) |
13 | fOut.WriteString(billStr) |
6、goroutine资源泄漏
一般是由于channel的错误使用,IO操作堵塞或者Http请求超时,没有超时机制,导致
package main
import (
"fmt"
"math/rand"
"runtime"
"time"
)
func query() int {
n := rand.Intn(100)
time.Sleep(time.Duration(n) * time.Millisecond)
return n
}
func queryAll() int {
ch := make(chan int)
go func() { ch <- query() }()
go func() { ch <- query() }()
go func() { ch <- query() }()
return <-ch // channel没有接收完,直接退出,导致另外两个channel无法写入,goroutine持续泄漏
}
func main() {
for i := 0; i < 4; i++ {
queryAll()
fmt.Printf("#goroutines: %d", runtime.NumGoroutine())
}
}
C语言资源泄漏:
检视点:
1、所有的分支路径上是否将分配的内存进行了释放
2、所有的分支路径上是否释放应该释放的资源
3、宏里面有return语句,可能引起前面申请的内存无法释放
4、多个内存申请的内存指针写在一起,异常处理可能导致前面申请内存无法释放。
5、在一个函数申请的资源,传递在外部处理。
6、结构体内部指针指向的内存需释放。