JVM原理及內存溢出經典案列分析ppt課件_第1頁
JVM原理及內存溢出經典案列分析ppt課件_第2頁
JVM原理及內存溢出經典案列分析ppt課件_第3頁
JVM原理及內存溢出經典案列分析ppt課件_第4頁
JVM原理及內存溢出經典案列分析ppt課件_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、JVMJVM原理及內存溢出經典案列分析原理及內存溢出經典案列分析目錄構造目錄構造目錄目錄JVM根本概念JVM原理內存溢出景象內存溢出分析附錄JVM根本概念根本概念 JVM管理管理 java中的內存中的內存java虛擬機本人去管理的,他不想虛擬機本人去管理的,他不想C+需求本人去釋放?;\統(tǒng)地去講,需求本人去釋放?;\統(tǒng)地去講,java的內存分配分為兩的內存分配分為兩個部分,一個是數據堆,一個是棧。程序在運轉的時候個部分,一個是數據堆,一個是棧。程序在運轉的時候普通分配數據堆,把部分的暫時的變量都放進去,生命普通分配數據堆,把部分的暫時的變量都放進去,生命周期和進程有關系。但是假設程序員聲明了周期和

2、進程有關系。但是假設程序員聲明了static的變的變量,就直接在棧中運轉的,進程銷毀了,不一定會銷毀量,就直接在棧中運轉的,進程銷毀了,不一定會銷毀static變量。變量。 渣滓回收機制渣滓回收機制 關鍵為了保證關鍵為了保證java內存不會溢出,內存不會溢出,java中有渣滓回收中有渣滓回收機制。機制。 System.gc()即渣滓搜集機制是指即渣滓搜集機制是指jvm用于釋放那用于釋放那些不再運用的對象所占用的內存。些不再運用的對象所占用的內存。java言語并不要求言語并不要求jvm有有gc,也沒有規(guī)定,也沒有規(guī)定gc如何任務。渣滓搜集的目的在如何任務。渣滓搜集的目的在于去除不再運用的對象。于

3、去除不再運用的對象。gc經過確定對象能否被活動對經過確定對象能否被活動對象援用來確定能否搜集該對象象援用來確定能否搜集該對象JVMJVM根本概念根本概念 內存溢出和泄露內存溢出就是他要求分配的java虛擬機內存超出了系統(tǒng)能給他的,系統(tǒng)不能滿足需求,于是產生溢出內存走漏是指他向系統(tǒng)懇求分配內存進展運用(new),可是運用完了以后卻不歸還(delete),結果他懇求到的那塊內存他本人也不能再訪問,該塊已分配出來的內存也無法再運用,隨著效力器內存的不斷耗費,而無法運用的內存越來越多,系統(tǒng)也不能再次將它分配給需求的程序,產生泄露。不斷下去,程序也逐漸無內存運用,就會溢出。 JVM原理原理 內存區(qū)劃分

4、棧內存Stack:每個線程私有的。 堆內存Heap:一切線程公用的。 方法區(qū)Method Area:有點像以前常說的“進程代碼段,這里面存放了每個加載類的反射信息、類函數的代碼、編譯時常量等信息。 原生方法棧Native Method Stack:主要用于JNI中的原生代碼,平常很少涉及。JVM原理原理 JVM分代總結:分代總結: Eden Space (heap): 內存最初從這個線程池分配給大部內存最初從這個線程池分配給大部分對象。分對象。 Survivor Space (heap):用于保管在:用于保管在eden space內存內存池中經過渣滓回收后沒有被回收的對象。池中經過渣滓回收后沒

5、有被回收的對象。 Tenured Generation (heap):用于堅持曾經在:用于堅持曾經在 survivor space內存池中存在了一段時間的對象。內存池中存在了一段時間的對象。 Permanent Generation (non-heap): 保管虛擬機本人保管虛擬機本人的靜態(tài)的靜態(tài)(refective)數據,例如類數據,例如類class和方法和方法method對象。對象。Java虛擬機共享這些類數據。這個區(qū)域虛擬機共享這些類數據。這個區(qū)域被分割為只讀的和只寫的。被分割為只讀的和只寫的。 Code Cache (non-heap):HotSpot Java虛擬機包括一虛擬機包括一

6、個用于編譯和保管本地代碼個用于編譯和保管本地代碼native code的內存,叫的內存,叫做做“代碼緩存區(qū)代碼緩存區(qū)code cache。JVM原理原理JVMJVM分代分代JVM定義了兩個代,年輕代yong generation有時稱為“nursery托兒所和老年代(old generation)。年輕代包括 “Eden space伊甸園和兩個“survivor spaces。虛擬內存初始化的時候會把一切對象都分配到 Eden space,并且大部分對象也會在該區(qū)域被釋放。 當進展 minor GC的時候,VM會把剩下的沒有釋放的對象從Eden space挪動到其中一個survivor spa

7、ces當中。此外,VM也會把那些長期存活在survivor spaces 里的對象挪動到 老生代的“tenured space中。當 tenured generation 被填滿后,就會產生Full GC,Full GC會相對比較慢由于回收的內容包括了一切的 live形狀的對象。pemanet generation這個代包括了一切java虛擬機本身運用的相對比較穩(wěn)定的數據對象,比如類和對象方法等。JVM原理原理JVM搜集方式 一種稱為copying或scavenge,將一切依然生存的對象搬到另外一塊內存后,整塊內存就可回收。這種方法有效率,但需求有一定的空閑內存,拷貝也有開銷。這種方法用于mi

8、nor collection。另外一種稱為major collectiont,將活著的對象標志出來,然后搬遷到一同連成大塊的內存,其他內存就可以回收了。這種方法不需求占用額外的空間,但速度相對慢一些。 JVM原理原理渣滓回收器 Java的運用的是堆內存,java堆是一個運轉時數據區(qū),類的實例(對象)從中分配空間。Java虛擬機(JVM)的堆中儲存著正在運轉的運用程序所建立的一切對象,“渣滓回收也是主要是和堆內存Heap有關。 渣滓回收器的分代戰(zhàn)略是把內存區(qū)劃分為幾個代,然后為每個代分配一到多個內存區(qū)塊。當其中一個代用完了分配給他的內存后,JVM會在分配的內存區(qū)內執(zhí)行一個部分的GC也可以叫min

9、or collection操作,為了回收處于“dead形狀的對象所占用的內存。部分GC通常要不Full GC要快很多。JVM原理原理渣滓回收器 渣滓回收的概念就是JAVA虛擬機JVM回收那些不再被援用的對象內存的過程。普通我們以為正在被援用的對象形狀為“alive,而沒有被運用或者取不到援用屬性的對象形狀為“dead。渣滓回收是一個釋放處于dead形狀的對象的內存的過程。而渣滓回收的規(guī)那么和算法被動態(tài)的作用于運用運轉當中,自動回收。 JVM的渣滓回收器采用的是一種分代generational 回收戰(zhàn)略,用較高的頻率對年輕的對象(young generation)進展掃描和回收,這種叫做mino

10、r collection,而對老對象(old generation)的檢查回收頻率要低很多,稱為major collection。這樣就不需求每次GC都將內存中一切對象都檢查一遍,這種戰(zhàn)略有利于實時察看和回收。內存溢出景象內存溢出景象運轉場景。 1. 用戶并發(fā)測試,運轉分鐘,忽略思索時間。 2. 效力器內存分配 JAVA_OPTS=-Xms2048m -Xmx2048m -Xss512k -XX:PermSize=128m 3. 分鐘內到達內存分配最大值,從降到,后臺拋出內存溢出錯誤查看tomcat下的catalina.out日志。 Exception in thread pool-1-thr

11、ead-12 java.lang.OutOfMemoryError: GC overhead limit exceeded 這個內存溢出表示GC花了大量時間來回收無用對象時,回收的內存很小就拋出該異常。即回收效率不高最終導致內存溢出。內存溢出景象內存溢出景象運轉景象: jvisualvm監(jiān)控 消費者線程全是紅顏色(在阻塞形狀) 內存溢出景象內存溢出景象運轉景象: jconsole監(jiān)控 線程處于阻塞形狀 內存溢出分析內存溢出分析業(yè)務場景: 該mmsdk功能是記錄行為日志,屬于磁盤操作,當時為了減少主線程耗時,采用了消費者消費者方式,即主線程將需求記錄的數據添加到隊列中然后直接前往,消費者線程漸漸

12、從隊列中取出數據寫入到磁盤中。 根據上面的內存溢出信息可以知道是程序處置不過來,內存回收的速度跟不上增長的速度,也就是說回收的速度很低,gc回收效率極低,再根據該功能的業(yè)務場景,消費者消費者方式的特點-吞吐量優(yōu)先,問題一定出如今消費者這邊,由于消費者50個用戶不斷在不停的消費,將數據放入到隊列中,消費者20個不斷在消費,實際上應該不會有什么問題,那是什么情況導致消費慢呢?經過監(jiān)控程序運轉很快就發(fā)現了問題所在,那就是消費者線程對鎖的競爭非常猛烈,90%的時間都在搶鎖,那為什么搶鎖這么厲害呢?一定是一切線程都在搶一把鎖,也就是說synchronized鎖了一個共享變量。 內存溢出分析內存溢出分析代

13、碼分析: logs里面有30個BaseLoginfo對象,一個BaseLoginfo對象就是一條日志信息。每一個線程都要在這里循環(huán)30次,循環(huán)一次就要進入writeLog方法線程處于阻塞形狀。內存溢出分析內存溢出分析代碼分析: 進入eventService.writeLog()方法,如下所示: 這里可以看出來是把當前對象鎖住了,而eventService總共就一個對象,所以20個線程都會搶這一個鎖,那么為什么要鎖這里呢?進入這個方法,里面是將日志信息寫到文件中,20個線程,一個線程有30個對象每記錄一個日志信息到文件都要獲取鎖和翻開文件,寫入文件,封鎖文件,退出鎖,瓶頸就在這里,鎖競爭太猛烈導

14、致消費很慢,線程將一切時間都花在了搶鎖上面內存溢出分析內存溢出分析Eclipse Memory AnalyzerMAT: 步驟: 首先,對問題發(fā)生時辰的系統(tǒng)內存形狀獲取一個整體印象。 第二步,找到最有能夠導致內存泄露的元兇,通常也就是耗費內存最多的對象 接下來,進一步去查看這個內存耗費大戶的詳細情況,看看能否有什么異常的行為。內存溢出分析內存溢出分析內存鏡像文件分析: 內存鏡像文件導出jmap -F -dump:format=b,file=/home/middle/apache-tomcat-6.0.32/temp/heapdump-1349935865265.hprof 14621 一塊大內

15、存占用了51M內存溢出分析內存溢出分析內存鏡像文件分析: 53m的內存駐留在ThreadPoolExecutor對象中,內存溢出分析內存溢出分析內存鏡像文件分析: 8個線程在作業(yè),義務隊列長度為512代碼里面設置的長度為512內存溢出分析內存溢出分析內存鏡像文件分析: 隊列中保管了大量的UActionThread對象,內存到達53M內存溢出分析內存溢出分析內存鏡像文件分析: 進一步查看,隊列中保管了203個UActionThread對象,一個對象占用3.2k 總共占用了53mUActionThread對象內存溢出分析內存溢出分析內存鏡像文件分析: 一個UActionThread對象中有多個RunTimeInfo對

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論