




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、最近大家對(duì)性能測(cè)試的內(nèi)存監(jiān)控挺感興趣的,有好多文章都是關(guān)于內(nèi)存泄露的。 剛剛做完了一個(gè)項(xiàng)目的性能測(cè)試, “有幸”也遇到了內(nèi)存泄露的案例, 所以在此 和大家分享一下。主要從以下幾部分來說明, 關(guān)于內(nèi)存和內(nèi)存泄露、 溢出的概念, 區(qū)分內(nèi)存泄露和 內(nèi)存溢出;內(nèi)存的區(qū)域劃分,了解 GC回收機(jī)制;重點(diǎn)關(guān)注如何去監(jiān)控和發(fā)現(xiàn)內(nèi) 存問題;此外分析出問題還要如何解決內(nèi)存問題。面就開始本篇的內(nèi)容第一部分 概念眾所周知,java中的內(nèi)存java虛擬機(jī)自己去管理的,他不想 C+需要自己去釋 放?;\統(tǒng)地去講, java 的內(nèi)存分配分為兩個(gè)部分,一個(gè)是數(shù)據(jù) 堆,一個(gè)是棧。 程序在運(yùn)行的時(shí)候一般分配數(shù)據(jù)堆, 把局部的臨時(shí)的
2、變量都放進(jìn)去, 生命周期和 進(jìn)程有關(guān)系。 但是如果程序員聲明了 static 的變量, 就直接在 棧中運(yùn)行的, 進(jìn) 程銷毀了,不一定會(huì)銷毀 static 變量。另外為了保證 java 內(nèi)存不會(huì)溢出, java 中有垃圾回收機(jī)制。 System.gc() 即垃 圾收集機(jī)制是指 jvm 用于釋放那些不再使用的對(duì)象所占用的內(nèi)存。 java 語言并 不要求jvm有g(shù)c,也沒有規(guī)定gc如何工作。 垃圾收集的目的在于清除不再使 用的對(duì)象。gc通過確定對(duì)象是否被活動(dòng)對(duì)象引用來確定是否收集該對(duì)象。 而其中,內(nèi)存溢出就是你要求分配的 java 虛擬機(jī)內(nèi)存超出了系統(tǒng)能給你的,系 統(tǒng)不能滿足需求,于是產(chǎn)生溢出。內(nèi)存
3、泄漏是指你向系統(tǒng)申請(qǐng)分配內(nèi)存進(jìn)行使用 (new),可是使用完了以后卻不歸 還(delete),結(jié)果你申請(qǐng)到的那塊內(nèi)存你自己也不能再訪問,該塊已分 配出來的 內(nèi)存也無法再使用,隨著服務(wù)器內(nèi)存的不斷消耗,而無法使用的內(nèi)存越來越多, 系統(tǒng)也不能再次將它分配給需要的程序,產(chǎn)生泄露。一直下去,程序也逐漸 無 內(nèi)存使用,就會(huì)溢出。第二部分 原理JAVA垃圾回收及對(duì)內(nèi)存區(qū)劃分在 Java 虛擬機(jī)規(guī)范中,提及了如下幾種類型的內(nèi)存空間:棧內(nèi)存(Stack):每個(gè)線程私有的。堆內(nèi)存(Heap :所有線程公用的。方法區(qū)(Method Area):有點(diǎn)像以前常說的“進(jìn)程代碼段”,這里面存 放了每個(gè)加載類的反射信息、類
4、函數(shù)的代碼、編譯時(shí)常量等信息。原生方法棧( Native Method Stack ):主要用于 JNI 中的原生代碼,平 時(shí)很少涉及。而 Java 的使用的是堆內(nèi)存, java 堆是一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū),類的實(shí)例 (對(duì)象)從中 分配空間。Java虛擬機(jī)(JVM)的堆中儲(chǔ)存著正在運(yùn)行的應(yīng)用程序所建立的所有對(duì) 象,“垃圾回收”也是主要是和堆內(nèi)存(Heap有關(guān)。垃圾回收的概念就是JAVA虛擬機(jī)(JVM回收那些不再被引用的對(duì)象內(nèi)存的過程。 一般我們認(rèn)為正在被引用的對(duì)象狀態(tài)為“ alive ”,而沒有被應(yīng) 用或者取不到引 用屬性的對(duì)象狀態(tài)為“ dead”。垃圾回收是一個(gè)釋放處于” dead”狀態(tài)的對(duì)象的
5、內(nèi)存的過程。而垃圾回收的規(guī)則和算法被動(dòng)態(tài)的作用于應(yīng)用 運(yùn)行當(dāng)中,自動(dòng)回 收。JVM的垃圾回收器采用的是一種分代(gen eratio nal)回收策略,用較高的頻率對(duì)年輕的對(duì)象 (young generation) 進(jìn)行掃描和回收,這種叫做 minor collection ,而對(duì)老對(duì)象 (old generation) 的檢查回收頻率要低很多,稱為 major collection。這樣就不需要每次GC都將內(nèi)存中所有對(duì)象都檢查一遍,這種策略有利于實(shí)時(shí)觀察和回收。(Sun JVM 1.3 有兩種最基本的內(nèi)存收集方式:一種稱為 copying 或 scavenge, 將所有仍然生存的對(duì)象搬到另外
6、一塊內(nèi)存后, 整塊內(nèi)存就可回收。這種方法有效 率,但需要有一定的空閑內(nèi)存,拷貝也有開銷。這種方法用于 minor collection 。 另外一種稱為mark-compact,將活著的對(duì)象標(biāo)記出來,然后搬遷到一起連成大 塊的內(nèi)存,其他內(nèi)存就可以回收了。這種方法不 需要占用額外的空間,但速度 相對(duì)慢一些。這種方法用于 major collection. )一些對(duì)象被創(chuàng)建出來只是擁有短暫的生命周期,比如 iterators 和本地變量。另外一些對(duì)象被創(chuàng)建是擁有很長(zhǎng)的生命周期,比如高持久化對(duì)象等。然后為每個(gè)代分配一到多個(gè)內(nèi)JVM會(huì)在分配的內(nèi)存區(qū)內(nèi)執(zhí)垃圾回收器的分代策略是把內(nèi)存區(qū)劃分為幾個(gè)代,存區(qū)塊
7、。當(dāng)其中一個(gè)代用完了分配給他的內(nèi)存后, 行一個(gè)局部的GC(也可以叫minor collection )操作,為了回收處于“ dead” 狀態(tài)的對(duì)象所占用的內(nèi)存。局部 GC通常要不Full GC要快很多。JVM定義了兩個(gè)代,年輕代(yong gen eration )(有時(shí)稱為“ n ursery ”托兒所) 和老年代(old gen eratio n)。年輕代包括 “ Eden space (伊甸園)”和兩個(gè)“survivor spaces ”。虛擬內(nèi)存初始化的時(shí)候會(huì)把所有對(duì)象都分配到 Eden space,并且大部分對(duì)象也會(huì)在該區(qū)域被釋放。當(dāng)進(jìn)行minor GC的時(shí)候,VM會(huì)把剩下的沒有釋放
8、的對(duì)象從 Eden space 移動(dòng)到其中一個(gè) survivor spaces 當(dāng) 中。此外,VM也會(huì)把那些長(zhǎng)期存活在survivor spaces里的對(duì)象移動(dòng)到 老生代的“ tenured ” space 中。當(dāng) tenured gen eratio n 被填滿后,就會(huì)產(chǎn)生 Full GC,F(xiàn)ull GC 會(huì)相對(duì)比較慢因?yàn)榛厥盏膬?nèi)容包括了所有的 live 狀態(tài)的對(duì)象。 pemanet generation 這個(gè)代包括了所有 java 虛擬機(jī)自身使用的相對(duì)比較穩(wěn)定的 數(shù)據(jù)對(duì)象,比如類和對(duì)象方法等。關(guān)于代的劃分,可以從下圖中獲得一個(gè)概況:lenurcdLdcnspacesVirtualVirtu
9、alVirtualYoungPerm如果垃圾回收器影響了系統(tǒng)的性能,或者成為系統(tǒng)的瓶頸,你可以通過自定義各個(gè)代的大小來優(yōu)化它的性能。使用JConsole,可以方便的查看到當(dāng)前應(yīng)用所配置的垃圾回收器的各個(gè)參數(shù)。想要獲得更詳細(xì)的參數(shù),可以參考以下調(diào)優(yōu)介紹:Tuning Garbage collectio n with the 5.0 HotSpot VMhttp:/java.s un .com/docs/hotspot/gc/i ndex.html最后,總結(jié)一下各區(qū)內(nèi)存:Eden Space (heap):內(nèi)存最初從這個(gè)線程池分配給大部分對(duì)象。Survivor Space (heap):用于保存在
10、eden space內(nèi)存池中經(jīng)過垃圾回收后沒有 被回收的對(duì)象。Tenured Generation (heap):用于保持已經(jīng)在 survivor space內(nèi)存池中存在了一段時(shí)間的對(duì)象。Permanent Generation (non-heap):保存虛擬機(jī)自己的靜態(tài) (refective) 數(shù)據(jù),例如類(class )和方法(method)對(duì)象。Java虛擬機(jī)共享這些類數(shù)據(jù)。這個(gè)區(qū) 域被分割為只讀的和只寫的,Code Cache (non-heap):HotSpot Java虛擬機(jī)包括一個(gè)用于編譯和保存本地代碼(n ative code )的內(nèi)存,叫做“代碼緩存區(qū)”(code cache
11、)第三部分 監(jiān)控(工具發(fā)現(xiàn)問題)談到內(nèi)存監(jiān)控工具,JConsole是必須要介紹的,它是一個(gè)用JAVA寫的GUI程序, 用來監(jiān)控VM并可監(jiān)控遠(yuǎn)程的VM易用且功能強(qiáng)大。具體 可監(jiān)控JAVA內(nèi)存、 JAVA CPU使用率、線程執(zhí)行情況、加載類概況等,Jconsole需要在JVM參數(shù)中配置端口才能使用。由于是GUI程序,界面可視化,這里就不做詳細(xì)介紹,具體幫助支持文檔請(qǐng)參閱性能測(cè)試JConsole使用方法總結(jié): npi n/km/test/DocLib/性能測(cè)試輔助工具JConsole的使用方法.aspx或者參考SUN官網(wǎng)的技術(shù)文檔:http:/Java.su n. com/j2se/1.5.0/do
12、cs/guide/ma nageme nt/jcon sole.html http:/Java.s un .com/javase/6/docs/tech no tes/tools/share/jco nsole.html在實(shí)際測(cè)試某一個(gè)項(xiàng)目時(shí),內(nèi)存出現(xiàn)泄露現(xiàn)象。起初在性能測(cè)試的1個(gè)小時(shí)中,并不明顯,而在穩(wěn)定性測(cè)試的時(shí)候才發(fā)現(xiàn),應(yīng)用的HSF調(diào)用在經(jīng)過幾個(gè)小時(shí) 運(yùn)行后,就出現(xiàn)性能明顯下降的情況。在服務(wù)日志中報(bào)大量HSF超時(shí),但所調(diào)用系 統(tǒng)沒有任何超時(shí)日志,并且壓力應(yīng)用的load都很低。經(jīng)過查看日志后,認(rèn)為 應(yīng) 用可能存在內(nèi)存泄漏。通過jeon sole以及jmap工具進(jìn)行分析發(fā)現(xiàn),確實(shí)存在 內(nèi)存泄
13、漏問題,其中PS Old Gen最終達(dá)到占用100%的占用。如圖所示:從上圖可以看到,雖然每次Full GC JVM內(nèi)存會(huì)有部分回收,但回收并不徹底, 不可回收的內(nèi)存對(duì)象會(huì)越來越多,這樣便會(huì)出現(xiàn)以上的一個(gè)趨勢(shì)。在Full GC無法回收的對(duì)象越來越多時(shí),最終已使用內(nèi)存達(dá)到系統(tǒng)分配的內(nèi)存最大值,系統(tǒng)最后無內(nèi)存可分配,最終down機(jī)。第四部分 分析經(jīng)過開發(fā)和架構(gòu)師對(duì)應(yīng)用的分析, 查看此時(shí)內(nèi)存隊(duì)列, 看哪個(gè)對(duì)象占用數(shù)據(jù)最多, 再利用 jmap 命令,對(duì)線程數(shù)據(jù)分析,如下所示:num #instances #bytes class name1: 92480562: 92480313: 92480684:
14、 1542111前三個(gè) instances665860032 com.taobao.matrix.mc.domain.*295936992 com.taobao.matrix.*147969088 java.util.*堵塞37010664 java.util.Date不斷增加, 指代的是同一個(gè)代碼邏輯, 異步分發(fā)的問題,消息,回收多次都無法回收成功。導(dǎo)致內(nèi)存溢出 此外,對(duì)應(yīng)用的性能單獨(dú)做了壓測(cè), 他的性能只能支撐到一半左右, 故發(fā)送消息的TPS應(yīng)用肯定無法處理過來,導(dǎo)致消息堆積,而 JAVA垃圾回收期認(rèn)為這些都是有用的對(duì)象,導(dǎo)致內(nèi)存堆積,直至系統(tǒng)崩潰。調(diào)優(yōu)方法 由于具體調(diào)優(yōu)方法涉及到應(yīng)用的配置信息, 故在此暫不列出, 可以參考性能測(cè)試 小組發(fā)布的性能測(cè)試調(diào)優(yōu)寶典第四部分 總結(jié)內(nèi)存溢出主要是由于代
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廣西南寧三中中考物理模擬試卷(一)(含解析)
- 湖南女子學(xué)院《微積分BⅡ》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇省泰州市醫(yī)藥高新區(qū)達(dá)標(biāo)名校2024-2025學(xué)年普通高中4月教育教學(xué)質(zhì)量監(jiān)測(cè)考試英語試題含答案
- 天津現(xiàn)代職業(yè)技術(shù)學(xué)院《服裝與服飾》2023-2024學(xué)年第二學(xué)期期末試卷
- 武夷學(xué)院《中國舞蹈史》2023-2024學(xué)年第二學(xué)期期末試卷
- 沈陽醫(yī)學(xué)院《病原微生物學(xué)與免疫學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇省南通市通州區(qū)海安縣2025屆普通高中第一次聯(lián)考高三英語試題含解析
- 河北省省級(jí)示范高中聯(lián)合體2024-2025學(xué)年4月高三階段性檢測(cè)試題考試英語試題含解析
- 河北省石家莊市行唐縣第三中學(xué)2025年高考前模擬英語試題試卷含解析
- (二模)呂梁市2025年高三第二次模擬考試政治試卷(含答案詳解)
- 鋼棚搭建安全合同(2篇)
- 《公路橋梁掛籃設(shè)計(jì)與施工技術(shù)指南》
- 浙江省【高等職業(yè)技術(shù)教育招生考試】-商業(yè)類(電子商務(wù))-職業(yè)技能理論知識(shí)(一)(答案版)
- 人教版歷史2024年第二學(xué)期期末考試七年級(jí)歷史試卷(含答案)
- 中班故事活動(dòng)《小馬過河》 課件
- 中國國新基金管理有限公司招聘筆試題庫2024
- DB34∕T 2839-2017 模塑聚苯板薄抹灰外墻外保溫系統(tǒng)
- 認(rèn)知障礙患者進(jìn)食問題評(píng)估與處理
- 血管活性藥物靜脈輸注護(hù)理
- Nikon尼康D3100中文說明書
- Module 3 Unit-7 Chinese Zodiac Signs(Period 4)(解密中國十二生肖)
評(píng)論
0/150
提交評(píng)論