今天安利一個由騰訊手機QQ團隊開源的強大的iOS內(nèi)存監(jiān)測組件OOMDetector:
鏈接:https://github.com/Tencent/OOMDetector? ? ?
OOMDetector是一個iOS內(nèi)存監(jiān)控組件,應用此組件可以幫助你輕松實現(xiàn)OOM監(jiān)控、大內(nèi)存分配監(jiān)控、內(nèi)存泄漏檢測等功能。
1.OOM監(jiān)控:監(jiān)控OOM,Dump引起爆內(nèi)存的堆棧
2.大內(nèi)存分配監(jiān)控:監(jiān)控單次大塊內(nèi)存分配,提供分配堆棧信息
3.內(nèi)存泄漏檢測:可檢測OC對象、Malloc堆內(nèi)存泄漏,提供泄漏堆棧信息
// 初始化,6s以下機型內(nèi)存觸頂閾值默認設(shè)置為300M,6s及以上機型內(nèi)存觸頂閾值默認設(shè)置為800M。
- (void)setupWithDefaultConfig;
// 開啟OOM監(jiān)控,默認在setupWithDefaultConfig方法中已經(jīng)開啟
-(void)startMaxMemoryStatistic:(double)overFlowLimit;
// 開啟單次大內(nèi)存分配監(jiān)控
-(BOOL)startSingleChunkMallocDetector:(size_t)threshholdInBytes callback:(ChunkMallocBlock)callback;
// 初始化內(nèi)存泄漏監(jiān)控器,記錄所有堆對象
- (void)setupLeakChecker;
// 執(zhí)行一次泄露檢測,建議在主線程調(diào)用,該操作會掛起所有子線程進行泄露檢測(該操作較耗時,平均耗時在1s以上,請限制調(diào)用頻率)
-(void)executeLeakCheck:(QQLeakCheckCallback)callback;
// 開啟堆內(nèi)存堆棧監(jiān)控,開啟后會實時記錄所有的內(nèi)存分配堆棧,并將多次重復調(diào)用的相同堆棧合并,如果合并后的size大于threshHoldInbytes,該分配堆棧將被輸出到log用于分析,log路徑Library/OOMDetector
-(BOOL)startMallocStackMonitor:(size_t)threshholdInBytes needAutoDumpWhenOverflow:(BOOL)needAutoDump dumpLimit:(double)dumpLimit sampleInterval:(NSTimeInterval)sampleInterval;
// 開啟VMStackMonitor用以監(jiān)控非直接通過malloc方式分配的內(nèi)存因為startVMStackMonitor:方法用到了私有API __syscall_logger會帶來app store審核不通過的風險,此方法默認只在DEBUG模式下生效,如果需要在RELEASE模式下也可用,請打開USE_VM_LOGGER_FORCEDLY宏,但是切記在提交appstore前將此宏關(guān)閉,否則可能會審核不通過
-(BOOL)startVMStackMonitor:(size_t)threshHoldInbytes;
@protocol QQOOMPerformanceDataDelegate // 在調(diào)用startMaxMemoryStatistic:開啟內(nèi)存觸頂監(jiān)控后會觸發(fā)此回調(diào),返回前一次app運行時單次生命周期內(nèi)的最大物理內(nèi)存數(shù)據(jù)
-(void)performanceData:(NSDictionary *)data completionHandler:(void (^)(BOOL))completionHandler; @end
@protocol QQOOMFileDataDelegate // 在出現(xiàn)單次大塊內(nèi)存分配、檢查到內(nèi)存泄漏且時、調(diào)用uploadAllStack方法時觸發(fā)此回調(diào)
-(void)fileData:(NSData *)data extra:(NSDictionary *)extra type:(QQStackReportType)type completionHandler:(void (^)(BOOL))completionHandler; @end
如果你遇到類似"Undefined symbols for architecture arm64: "std::__1::__next_prime(unsigned long)""的鏈接問題, 你可以做如下設(shè)置:
Build Settings -> Linking -> Other Linker Flags -> -lc++