主旨:避免full cg
減少FUll CG:
老年代采用并發(fā)收集器 ----
設(shè)置-Xms -Xmx一樣,避免堆伸縮導(dǎo)致的full cg。
加大新生代體積,讓對(duì)象停留在新生代
通過 -XX:MaxTenuringThreshold 調(diào)大對(duì)象進(jìn)入老年代的年齡,讓對(duì)象停留在新生代
提高M(jìn)etaspaceSize,因?yàn)镸etaspaceSize過小會(huì)觸發(fā)full gc
使用MaxTenuringThreshold設(shè)置在新生代存貨多少次才進(jìn)入老年區(qū)
設(shè)置-XX:MaxMetaspaceSize調(diào)整元數(shù)據(jù)控件,避免占用其他軟件的內(nèi)存使用。
survivor占用率100%的問題:
利用-XX:SurvivorRatio參數(shù)設(shè)置survivor區(qū)的大小
Survivor區(qū)占用量超過50% 會(huì)將多余值放到老年區(qū):
通過TargetSurvivorRatio:80%設(shè)置 當(dāng)占用量超過80%的時(shí)候才進(jìn)入老年區(qū)
大對(duì)象:
jmap -histo:live 20954:查看存活的對(duì)象的具體情況,找出占用大內(nèi)存的對(duì)象,大內(nèi)存會(huì)導(dǎo)致gc
如何大內(nèi)存對(duì)象找出具體代碼位置?通過MAT分析故障
內(nèi)存泄漏:
內(nèi)存泄漏的原因:http://www.itdecent.cn/p/54b5da7c6816
jvm監(jiān)控:jvisualvm
輸出dump:使用jconsole
使用jmap分析內(nèi)存中對(duì)象和生成dump
tomcat調(diào)優(yōu)
https://juejin.cn/post/6844903586111963144
異步io
同步io在處理請(qǐng)求的時(shí)候,由于io的處理需要時(shí)間,所以處理該請(qǐng)求的進(jìn)程被迫阻塞自己來(lái)等待io處理,linux系統(tǒng)對(duì)于如果進(jìn)程主動(dòng)阻塞自己則直接剝奪cpu使用權(quán),于是當(dāng)另外一個(gè)請(qǐng)求過來(lái)的時(shí)候,linux系統(tǒng)會(huì)重新分配一個(gè)進(jìn)程給他。當(dāng)上一個(gè)進(jìn)程的io處理好后,cpu需要切換到上一個(gè)進(jìn)程去處理。試想,如果有幾百個(gè)請(qǐng)求,那么就需要?jiǎng)?chuàng)建幾百個(gè)進(jìn)程,同時(shí)因?yàn)閕o的處理以及處理好,cpu需要不斷的在這些進(jìn)程之間切換,cpu進(jìn)程切換本身需要時(shí)間,當(dāng)在幾百個(gè)進(jìn)程之間切換的時(shí)候會(huì)放大這種時(shí)間問題。
異步io解決的問題就是cpu進(jìn)程切換導(dǎo)致的時(shí)間浪費(fèi)問題,解決的思路就是一個(gè)進(jìn)程可以處理幾百個(gè)連接,解決的辦法就是非阻塞io,非阻塞io是指當(dāng)遇到uo處理的時(shí)候,系統(tǒng)會(huì)把當(dāng)前socket的對(duì)應(yīng)的回調(diào)函數(shù)處理給保存到一個(gè)紅黑樹上,而進(jìn)程現(xiàn)在就可以去做別的事情了(處理其他請(qǐng)求),會(huì)有另外一個(gè)進(jìn)程專門處理io完畢問題,一旦有io處理完畢,這個(gè)進(jìn)程就從紅黑樹上找到對(duì)應(yīng)的socket.毀回調(diào)函數(shù),并處理。