在Linux系統(tǒng)使用過程中,你是否遇到過“內(nèi)存不足”的報(bào)錯?比如編譯Android源碼時,明明按教程操作,卻因物理內(nèi)存沒達(dá)到16G要求而編譯中斷?這正是Swap交換空間不足在“搞鬼”。今天不僅要帶大家搞懂Swap的核心作用,還會結(jié)合Android源碼編譯的實(shí)戰(zhàn)場景,給出針對性的擴(kuò)充方案,新手也能輕松上手~
一、什么是Swap?為什么非它不可?
1.通俗理解:內(nèi)存的“備用抽屜”
如果把物理內(nèi)存(RAM)比作電腦的“桌面”——常用文件隨手可及;那Swap交換空間就是“抽屜”:當(dāng)桌面堆滿文件(物理內(nèi)存占滿),系統(tǒng)會把暫時不用的文件(不活躍進(jìn)程數(shù)據(jù))放進(jìn)抽屜,騰出桌面給急需的任務(wù)。
2.三大核心作用,缺一不可
?應(yīng)急救急:物理內(nèi)存耗盡時,Swap臨時承接數(shù)據(jù),避免程序直接OOM(內(nèi)存溢出)崩潰,比如Android源碼編譯這類高內(nèi)存需求場景;
?支持休眠:系統(tǒng)休眠時,會把全部內(nèi)存數(shù)據(jù)寫入Swap,喚醒時再讀回內(nèi)存,沒有Swap就無法使用休眠功能;
?優(yōu)化性能:長期運(yùn)行的服務(wù)器中,Swap會緩存不常用進(jìn)程,讓物理內(nèi)存集中供給活躍程序,提升整體響應(yīng)速度。
3.實(shí)戰(zhàn)場景:Android源碼編譯的“內(nèi)存門檻”
Android源碼編譯是典型的高內(nèi)存消耗場景——官方推薦物理內(nèi)存≥16G,若你的Linux主機(jī)只有8G/12G物理內(nèi)存,編譯過程中會頻繁出現(xiàn)以下報(bào)錯:
Outof memory: Killed process12345(cc1plus) total-vm:1234567kB, anon-rss:876543kB, file-rss:0kB, shmem-rss:0kB
或直接提示“內(nèi)存不足,編譯中斷”。這時候無需更換硬件,通過擴(kuò)充Swap將“物理內(nèi)存+ Swap”的總可用內(nèi)存提升到16G以上,就能順利完成編譯。
二、擴(kuò)充Swap的兩種實(shí)用方法(附Android編譯場景適配)
在操作前,先搞清楚當(dāng)前Swap狀態(tài)——這是后續(xù)操作的基礎(chǔ)。
2.1前提:檢查當(dāng)前Swap狀態(tài)
打開終端,執(zhí)行以下命令,查看Swap的大小、是否啟用:
# 方法1:簡潔查看(h=人性化單位)free -h# 方法2:詳細(xì)查看Swap設(shè)備/文件swapon --show# 方法3:查看Swap使用情況cat/proc/swaps
輸出示例(8G物理內(nèi)存,無Swap時):
total used free shared buff/cache availableMem: 7.7Gi 1.2Gi 5.3Gi 245Mi 1.2Gi 6.1GiSwap: 0B 0B 0B # 無Swap空間,編譯Android會報(bào)錯
2.2方法一:文件方式(推薦!Android編譯首選)
適合沒有空閑磁盤分區(qū)的場景,直接創(chuàng)建文件作為Swap,靈活調(diào)整大小,完美適配Android編譯的臨時高內(nèi)存需求。
步驟1:創(chuàng)建適配Android編譯的Swap文件(關(guān)鍵?。?/span>
假設(shè)你的物理內(nèi)存是8G,需要創(chuàng)建8G Swap文件(總可用內(nèi)存達(dá)16G,滿足編譯要求),用fallocate命令快速創(chuàng)建:
# 創(chuàng)建8G的Swap文件(路徑/swapfile可自定義,大小根據(jù)物理內(nèi)存調(diào)整)sudofallocate -l 8G /swapfile
如果系統(tǒng)提示fallocate:未找到命令,改用dd命令(速度稍慢,但兼容性強(qiáng)):
# bs=1G 每次寫入1G,count=8 共寫入8次,總計(jì)8G(Android編譯推薦大?。?/span>sudoddif=/dev/zero of=/swapfile bs=1G count=8
注意:若物理內(nèi)存是12G,創(chuàng)建4G Swap即可(12+4=16G);物理內(nèi)存6G則創(chuàng)建10G Swap(6+10=16G),核心是讓“物理內(nèi)存+ Swap”≥16G。
步驟2:設(shè)置安全權(quán)限(避免敏感數(shù)據(jù)泄露)
Swap文件包含系統(tǒng)和編譯過程中的敏感數(shù)據(jù),必須設(shè)置為僅root可讀可寫:
sudochmod600 /swapfile
步驟3:格式化Swap文件(系統(tǒng)識別必備)
將創(chuàng)建的文件格式化為Swap格式,讓Linux系統(tǒng)能正常使用:
sudomkswap /swapfile
輸出提示Setting up swapspace version 1, size = 8 GiB表示成功。
步驟4:啟用新Swap文件(立即生效,無需重啟)
sudoswapon /swapfile
步驟5:設(shè)置開機(jī)自動掛載(編譯過程不中斷)
Android源碼編譯耗時久(可能數(shù)小時),若中途重啟,Swap會失效導(dǎo)致編譯中斷,需編輯/etc/fstab文件實(shí)現(xiàn)永久生效:
1.先備份fstab(防止改錯導(dǎo)致系統(tǒng)無法啟動):
sudocp/etc/fstab /etc/fstab.bak
1.編輯文件:
sudonano /etc/fstab
1.在文件末尾添加一行(復(fù)制粘貼即可):
/swapfile swap swap defaults 0 0
1.保存退出(nano編輯器按Ctrl+O→回車→Ctrl+X)。
步驟6:驗(yàn)證是否滿足Android編譯要求
再次執(zhí)行free -h,看到“Mem+Swap”≥16G即達(dá)標(biāo):
total used free shared buff/cache availableMem: 7.7Gi 1.3Gi 5.2Gi 250Mi 1.2Gi 6.0GiSwap: 8.0Gi 0B 8.0Gi # 總可用內(nèi)存達(dá)13.7Gi?不對!
補(bǔ)充說明:available是系統(tǒng)可分配給新進(jìn)程的內(nèi)存(含空閑內(nèi)存+可釋放緩存),實(shí)際編譯時,系統(tǒng)會動態(tài)使用物理內(nèi)存和Swap,只要“Swap +物理內(nèi)存總量”≥16G,就能避免OOM報(bào)錯。
2.3方法二:分區(qū)方式(適合有空閑磁盤分區(qū),性能更優(yōu))
如果你的硬盤有未分配的空閑分區(qū)(比如/dev/sda3,大小≥8G),可直接將分區(qū)設(shè)為Swap,讀寫速度比文件方式快,適合頻繁編譯Android源碼的場景。
簡要步驟:
1.查看空閑分區(qū):sudo fdisk -l(找到標(biāo)注free的分區(qū),確保大小≥8G,如/dev/sda3);
2.格式化分區(qū)為Swap:sudo mkswap /dev/sda3;
3.啟用分區(qū):sudo swapon /dev/sda3;
4.永久生效:編輯/etc/fstab,添加/dev/sda3 swap swap defaults 0 0;
5.驗(yàn)證:free -h確認(rèn)Swap大小≥8G,總內(nèi)存達(dá)標(biāo)。
三、Android編譯場景專屬注意事項(xiàng)(避坑必看)
1.Swap大小精準(zhǔn)匹配:
?核心原則:物理內(nèi)存(RAM)+ Swap ≥16G(Android源碼編譯最低要求);
?示例:8G RAM→8G Swap,12G RAM→4G Swap,16G RAM→無需擴(kuò)充(若編譯時仍卡頓,可加4-8G Swap)。
1.存儲介質(zhì)優(yōu)先選SSD:
Android編譯過程中會頻繁讀寫Swap,機(jī)械硬盤(HDD)速度慢,會導(dǎo)致編譯卡頓;SSD的讀寫速度是HDD的數(shù)倍,能大幅提升Swap響應(yīng)速度,避免編譯耗時翻倍。
2.編譯時關(guān)閉其他高內(nèi)存進(jìn)程:
擴(kuò)充Swap后,盡量關(guān)閉瀏覽器、虛擬機(jī)等占用內(nèi)存的程序,讓系統(tǒng)把物理內(nèi)存和Swap集中供給編譯進(jìn)程,進(jìn)一步減少卡頓和報(bào)錯概率。
3.如何刪除無用Swap?
若后續(xù)不再編譯Android源碼,可刪除Swap釋放磁盤空間:
# 臨時關(guān)閉Swapsudoswapoff /swapfile(或/dev/sda3)# 永久刪除:刪除/etc/fstab中的對應(yīng)行,再刪除文件/分區(qū)sudorm/swapfile
四、總結(jié)
Swap交換空間是Linux系統(tǒng)的“內(nèi)存救星”,尤其對于Android源碼編譯這類高內(nèi)存需求場景,無需升級硬件,通過文件或分區(qū)方式擴(kuò)充Swap,就能輕松突破內(nèi)存限制。關(guān)鍵要記?。焊鶕?jù)物理內(nèi)存精準(zhǔn)設(shè)置Swap大?。們?nèi)存≥16G),優(yōu)先用SSD存儲,設(shè)置開機(jī)自動掛載避免編譯中斷。
按照本文步驟操作后,再執(zhí)行Android源碼編譯命令,就能順利避開OOM報(bào)錯,讓編譯過程一路暢通~ 如果你在操作中遇到問題,歡迎在評論區(qū)留言交流!
-
Android
+關(guān)注
關(guān)注
12文章
3986瀏覽量
133070 -
Linux
+關(guān)注
關(guān)注
88文章
11628瀏覽量
217981 -
編譯
+關(guān)注
關(guān)注
0文章
688瀏覽量
34949
發(fā)布評論請先 登錄
升級BIOS時提示內(nèi)存不足怎么辦
紅米顯示內(nèi)存不足怎么處理
RAM內(nèi)存不足錯誤
虛擬內(nèi)存不足的原因
虛擬內(nèi)存不足怎么解決
需要了解Linux swap分區(qū)的擴(kuò)展
嵌入式Linux的Swap交換區(qū)剖析
植保無人機(jī)在農(nóng)業(yè)領(lǐng)域的應(yīng)用立竿見影 對于農(nóng)業(yè)生產(chǎn)的幫助成效卓著
手機(jī)內(nèi)存不足的清理方法
電腦和手機(jī)的內(nèi)存不足怎么辦
虛擬內(nèi)存不足的解決辦法

Linux Swap交換空間詳解:Android編譯內(nèi)存不足?這樣擴(kuò)充立竿見影
評論