記因PHP的記憶體溢位導致的事故之解決

2022-05-10 18:42:06 字數 1235 閱讀 9921

如果對您有用記得關注,更多乾貨。

今天上午剛到公司,就有同事在公司群裡反映某個計畫任務出現問題了。我就懷著刨根問底的心,去檢視了log。發現挺有意思的乙個問題,php記憶體溢位導致指令碼執行失敗。那就一起來看個究竟吧!

首先檢視了計畫任務的log

從報錯資訊字面意思可以看出,允許的134217728 bytes的記憶體已經用盡,還要試圖分配12961640 bytes

記憶體。給你(當前指令碼)分配的記憶體你已經用完了,你還想問系統要記憶體。系統這時想對你說:

地主家也沒有餘糧啊(借用葛優大爺的一句話)

模擬一下"案發現場"

分析"事故"原因

指令碼一次性讀取了大量的資料(可能是讀的檔案,可能是讀取的資料庫)

如下圖: 往杯子(分配給當前指令碼的記憶體)裡面倒數水(log檔案的資料),杯子容量(記憶體)不夠用

解決方案

a. 既然杯子小 就換個大杯子(增大給指令碼分配的記憶體)治標不治本:ini_set('memory_limit','100m');

b. 把水分批次倒入杯子中(迴圈,分段讀取資料,讀資料庫的話可以用limit)

看看結果

分段讀取也是可以解決問題滴

其他優化方案

漢字轉拼音的導致的記憶體溢位

上班來得第乙個任務就是把漢字轉化為拼音 主要用於搜尋名字 在網上收到了pinyin4j的開源庫,並且找了一下使用示例,感覺寫得蠻好的,就採用了他的方法,如下 public static setgetpinyin string src catch badhanyupinyinoutputformatc...

集群間同步導致的記憶體溢位 二

現在網路發展這麼迅速,傳統的程式架構已經不適合這個高速發展的時代了,現在基本上都是分布式,微服務,它們之間的端點都是用集群來搭建的,有的訊息佇列,像kafka,註冊中心,像zookeeper都是集群化,更別說快取 redis mysql了,更得集群化啊,其實前面那篇文章用nginx也與集群化相識,比...

記一次記憶體溢位(PermGen Space)的坑

環境 jdk1.6 使用技術 urlclassloader 事件描述 使用urlclassloader類載入器,實現熱部署。定時任務載入jar包,任務執行300次左右就會報 permgen space 分析過程 1.檢視記憶體使用情況 jmap heap pid jdk8以後檢視元空間大小 jsta...