今天組里的一個(gè)算法里面出現(xiàn)很?chē)?yán)重的內(nèi)存泄漏問(wèn)題,通過(guò)一些手段解決了。記錄一下。
背景
- 對(duì)于C語(yǔ)言的內(nèi)存泄漏來(lái)講,一般就是alloc出來(lái)的對(duì)象沒(méi)有free。一般而言,推薦的寫(xiě)法就是自己alloc,自己free。在這段代碼里面出現(xiàn)了一些不好的C語(yǔ)言的寫(xiě)法,導(dǎo)致內(nèi)存的alloc和free沒(méi)有出現(xiàn)對(duì)稱,這是代碼作者的習(xí)慣導(dǎo)致的。
- 代碼里面出現(xiàn)了結(jié)構(gòu)體里面alloc新對(duì)象的寫(xiě)法,而且非常的隱蔽,導(dǎo)致查找工作很困難。
工具包
- xcode
以前只用xcode做過(guò)一些ios項(xiàng)目的開(kāi)發(fā),因?yàn)閛c或者swift有著比較完善的ARC,所以都沒(méi)主要到還有內(nèi)存泄漏檢測(cè)工具。
解決方式
- 使用xcode打開(kāi)項(xiàng)目
-
command+i
打開(kāi)Instruments
image.png -
選擇Leaks
image.png
里面有內(nèi)存分配以及內(nèi)存泄漏情況,可用于內(nèi)存分析和優(yōu)化參照。
- 點(diǎn)擊紅色開(kāi)始運(yùn)行程序
image.png
如果沒(méi)有泄漏,內(nèi)存會(huì)是平緩的一根線。如果是泄漏就是一條向上走的線,這個(gè)和Android Studio提供的內(nèi)存分析工具很像。可以看出我這里是有內(nèi)存泄漏的。
-
分享沒(méi)存泄漏位置,定位代碼
image.png
右邊會(huì)有一個(gè)調(diào)用棧,就可以定位到內(nèi)存泄漏的位置了,進(jìn)而就可以很快解決了。
背景
- 不管是什么語(yǔ)言,只要一不小心就會(huì)出現(xiàn)內(nèi)存泄漏問(wèn)題。不過(guò)對(duì)于有GC的語(yǔ)言來(lái)講相對(duì)安全,但同樣的,出現(xiàn)了也相對(duì)不好解決。解決這類問(wèn)題的核心就是找到內(nèi)存泄漏的位置,一個(gè)靠譜的內(nèi)存分析工具就非常重要了。
推薦幾個(gè)常用的內(nèi)存分析工具:- top 指令。 在Linux或者mac上面可以快速定位泄漏的程序和程度
- Golang 使用 內(nèi)置的runtime/pprof即可。
deno
就是用的這個(gè)。 - Android 使用Android Studio可以做一定的內(nèi)存分析。使用
Memory Profiler
工具加上LeakCanary
是最好的選擇。 - Node.js 使用
heapdump
+devtool
- 前端js 使用chrome內(nèi)存分析工具即可。
- Java 主要是對(duì)垃圾回收和內(nèi)存做分析。使用
JConsole
可是看見(jiàn)內(nèi)存情況,再加上JVM自帶的一些指令,就可以很好的看見(jiàn)內(nèi)存的分配和回收情況,然后做進(jìn)一步優(yōu)化。
這幾塊每一個(gè)都有很大的含金量,希望能帶來(lái)一些思考,避免每天只寫(xiě)業(yè)務(wù)代碼,忽視了程序內(nèi)在的執(zhí)行。畢竟優(yōu)化比做功能難太多。