Java內(nèi)存相關(guān)知識(shí)

Java內(nèi)存問(wèn)題排查和解決

內(nèi)存都有啥

  • 編譯后地址是邏輯地址蔚万,需要經(jīng)過(guò)編譯映射到物理內(nèi)存

  • MMU負(fù)責(zé)地址的轉(zhuǎn)換

  • 可用內(nèi)存 = 物理內(nèi)存 + 虛擬內(nèi)存(swap)

  • RES 實(shí)際內(nèi)存占用

  • 可用內(nèi)存 = free + buffers + cached

  • linux使用時(shí),迅速占滿(mǎn)內(nèi)存

  • 堆:JVM堆中的數(shù)據(jù)是共享的已卷,是占用內(nèi)存最大的一塊區(qū)域

  • 虛擬機(jī)棧:Java虛擬機(jī)棧闺魏,是基于線(xiàn)程的,用來(lái)服務(wù)字節(jié)碼指令的運(yùn)行

  • 程序計(jì)數(shù)器:當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的行號(hào)指示器

  • 元空間:方法區(qū)的位置,非堆

  • 本地內(nèi)存:其他的內(nèi)存占用空間

Java內(nèi)存管理基本概念:

內(nèi)存:

  • Java內(nèi)存
  • 操作系統(tǒng)

Java內(nèi)存:

  • Java堆內(nèi)存
  • 元空間(堆外)

Java堆內(nèi)存

  • JVM分配的Java內(nèi)存對(duì)象
  • 通常使用 -Xmx -Xms 控制大小

元空間

  • Metaspace默認(rèn)無(wú)上限
  • 原方法區(qū)在這里

內(nèi)存劃分:

  • JVM進(jìn)程內(nèi)存 = 堆內(nèi)內(nèi)存 + 堆外內(nèi)存
  • 堆外內(nèi)存 = 元空間 + CodeCache + 本地內(nèi)存
  • 堆外內(nèi)存和操作系統(tǒng)剩余內(nèi)存是此消彼長(zhǎng)的關(guān)系
  • 可分配的內(nèi)存大小 = 物理內(nèi)存 - SWAP

32位內(nèi)存限制4GB截亦,目前ZGC支持16TB內(nèi)存

控制參數(shù):

  • 堆 -Xms -XMx
  • 元空間 -XX:MaxMetaspaceSize -XX:MetaspaceSize
  • 棧: -Xss
  • 直接內(nèi)存: -XX:MaxDirectMemorySize
  • 其他堆外內(nèi)存無(wú)法控制

垃圾回收:

  • 自動(dòng)垃圾回收:JVM自動(dòng)檢測(cè)和釋放不再使用的內(nèi)存
  • Java運(yùn)行時(shí)JVM會(huì)有線(xiàn)程執(zhí)行GC却桶,不需要程序員顯示釋放對(duì)象
  • GC發(fā)生的時(shí)機(jī)由復(fù)雜的策略判斷,自動(dòng)觸發(fā),不受外部控制
  • 不同的垃圾回收算法亏钩,甚至不同的JVM版本,回收策略都不一樣

內(nèi)存問(wèn)題兩種形式:

  • 內(nèi)存溢出(OutOfMemoryError)OOM:
    • 堆是最常見(jiàn)的情況
    • 堆外內(nèi)存排查困難
  • 內(nèi)存泄漏(MemoryLeak)ML:
    • 分配的內(nèi)存沒(méi)有得到釋放
    • 內(nèi)存一直在增長(zhǎng),有OOM風(fēng)險(xiǎn)
    • GC回收時(shí)回收不掉
    • 能夠回收但很快又占滿(mǎn)

內(nèi)存問(wèn)題影響:

  • 發(fā)生OOM Error,應(yīng)用停止
  • 頻繁GC沦偎,GC時(shí)間長(zhǎng)谈火,GC線(xiàn)程時(shí)間片占用高
  • 服務(wù)卡頓,請(qǐng)求響應(yīng)時(shí)間邊長(zhǎng)

排查困難:

  • 問(wèn)題時(shí)間跨度大
  • 問(wèn)題解決耗費(fèi)精力
  • 現(xiàn)場(chǎng)保護(hù)意識(shí)不足

簡(jiǎn)單問(wèn)題場(chǎng)景:

  • 物理內(nèi)存不足
    • 主機(jī)物理內(nèi)存非常少
    • 主機(jī)上應(yīng)用進(jìn)程非常多
  • 給應(yīng)用JVM分配的內(nèi)存小
  • 錯(cuò)誤的引用方法荒揣,發(fā)生了內(nèi)存泄漏,沒(méi)有及時(shí)切斷與GC roots的關(guān)系
  • 并發(fā)量大,計(jì)算需要內(nèi)存大
  • 沒(méi)有控制取數(shù)范圍
  • 加載了非常多的Jar包
  • 對(duì)堆外內(nèi)存無(wú)限制的使用

垃圾回收器:

  • CMS:將在Java14正式移除
  • G1:主流應(yīng)用的垃圾回收器
  • ZGC 大容量(16TB),低延遲(10ms)的垃圾回收器

可達(dá)性分析法:

  • Reference Chain
  • 可達(dá)性分析法
  • GC過(guò)程:找到活躍的對(duì)象,然后清理其他的

引用級(jí)別:

  • 強(qiáng)引用:屬于最普通最強(qiáng)硬的一種存在,只有在和GC Roots斷絕關(guān)系時(shí),才會(huì)被消滅掉
  • 軟引用:只有在內(nèi)存不足時(shí),系統(tǒng)則會(huì)回收軟引用獨(dú)享
  • 弱引用:當(dāng)JVM進(jìn)行垃圾回收時(shí),無(wú)論內(nèi)存是否充足,都會(huì)回收被弱引用關(guān)聯(lián)的對(duì)象
  • 虛引用:虛引用主要用來(lái)跟蹤對(duì)象被垃圾回收的活動(dòng)

對(duì)象何時(shí)提升(Promotion)

  • 常規(guī)提升 對(duì)象夠老
  • 分配擔(dān)保 Survivor空間不夠戳杀,老年代擔(dān)保
  • 大對(duì)象直接在老年代分配
  • 動(dòng)態(tài)對(duì)象年齡判定

瞬時(shí)態(tài)和歷史態(tài)

  • 瞬時(shí)態(tài):
    • 指當(dāng)時(shí)發(fā)生的快照類(lèi)型的元素
    • 體積大
  • 歷史態(tài)
    • 指按照頻率抓取的
    • 有固定監(jiān)控項(xiàng)的資源變動(dòng)

預(yù)防措施:

  • 減少創(chuàng)建大對(duì)象的頻率:比如byte數(shù)組的傳遞
  • 不要緩存太多的堆內(nèi)存數(shù)據(jù):使用guava的weak引用模式
  • 查詢(xún)的范圍一定要可控:如分庫(kù)分表中間件;ES等有同樣問(wèn)題
  • 用完的資源一定要close掉:可以使用新的try-with-resources語(yǔ)法
  • 少用intern:字符串太長(zhǎng),且無(wú)法復(fù)用,就會(huì)造成內(nèi)存泄漏
  • 合理的Session超時(shí)時(shí)間
  • 少用第三方本地代碼,使用Java方案替代
  • 合理的池大小
  • XML(SAX/DOM)、JSON解析時(shí)要注意對(duì)象大小

總結(jié):

  • 問(wèn)題發(fā)現(xiàn):
    1. 確保加入了日志和自動(dòng)轉(zhuǎn)儲(chǔ)參數(shù)
    2. 確定物理內(nèi)存足夠:free
    3. 確定Java進(jìn)程內(nèi)存足夠:jmap
    4. 確定主機(jī)環(huán)境徐钠,剩余內(nèi)存大小
    5. 查看Glog和其他日志
    6. 使用jstack對(duì)線(xiàn)程進(jìn)行摸底
    7. 對(duì)堆外內(nèi)存進(jìn)行排查
    8. 保留現(xiàn)場(chǎng)
  • 采取措施
  • 重復(fù)觀察
  • 問(wèn)題解決
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市矮固,隨后出現(xiàn)的幾起案子档址,更是在濱河造成了極大的恐慌尼摹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儿咱,死亡現(xiàn)場(chǎng)離奇詭異搔体,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梁钾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)绳泉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人姆泻,你說(shuō)我怎么就攤上這事零酪。” “怎么了拇勃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵四苇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我方咆,道長(zhǎng)蛔琅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任峻呛,我火速辦了婚禮罗售,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钩述。我一直安慰自己寨躁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布牙勘。 她就那樣靜靜地躺著职恳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪方面。 梳的紋絲不亂的頭發(fā)上放钦,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天休溶,我揣著相機(jī)與錄音如孝,去河邊找鬼。 笑死犹撒,一個(gè)胖子當(dāng)著我的面吹牛横腿,可吹牛的內(nèi)容都是我干的颓屑。 我是一名探鬼主播斤寂,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揪惦!你這毒婦竟也來(lái)了遍搞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤器腋,失蹤者是張志新(化名)和其女友劉穎溪猿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纫塌,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡再愈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了护戳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垂睬,死狀恐怖媳荒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驹饺,我是刑警寧澤钳枕,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站赏壹,受9級(jí)特大地震影響鱼炒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝌借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一昔瞧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菩佑,春花似錦自晰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瞧哟,卻和暖如春混巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勤揩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工咧党, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨亡。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓凿傅,卻偏偏與公主長(zhǎng)得像缠犀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聪舒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345