已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1 什么是 Visual VM? 1.1 Visual VM簡介 VisualVM 提供在 Java 虛擬機 (Java Virutal Machine, JVM) 上運行的 Java 應用程序的詳細信息。在 VisualVM 的圖形用戶界面中,您可以方便、快捷地查看多個 Java 應用程序的相關信息。(摘自官方) 簡單說來,VisualVM是一種集成了多個JDK命令行工具的可視化工具,它能為您提供強大的分析能力。所有這些都是免費的!它囊括的命令行工具包括jstat, JConsole, jstack, jmap 和 jinfo,這些工具與JDK的標準版本是一致的。 可以使用VisualVM生成和分析海量數(shù)據(jù)、跟蹤內(nèi)存泄漏、監(jiān)控垃圾回收器、執(zhí)行內(nèi)存和CPU分析,同時它還支持在MBeans上進行瀏覽和操作。盡管VisualVM自身要在JDK6這個版本上運行,但是JDK1.4以上版本的程序它都能監(jiān)控。1.2 如何獲取VisualVM VisualVM的一個最大好處就是,它已經(jīng)在你的JDK bin目錄里了,只要你使用的是JDK1.6 Update7之后的版本。點擊一下jvisualvm.exe圖標它就可以運行了。 這里是VisualVM 的官方網(wǎng)站:,資料很全,同時提供VisualVM最近版本下載。2 Visual VM實戰(zhàn) 2.1 開啟Visual VM之旅 如果你使用的是JDK是1.6Update7之后的版本,那么Visual VM已經(jīng)包含在bin目錄下了,否則需要去官方下載。 2.1.1 啟動問題 如果你在windows上使用Visual VM,需要做的只是點一下jvisualvm.exe,就能啟動它;綠色,好用。但是Visual VM所在的分區(qū)如果是NTFS格式,那么第一個問題就出現(xiàn)了:sun對NTFS格式的硬盤支持有問題!但可通過參數(shù)可避免,并完成啟動。步驟如下: 1. 創(chuàng)建一個visualvm.exe的快捷方式 2. 在“目標”中添加如下參數(shù) -XX:+PerfBypassFileSystemCheck2.1.2 界面簡介 Visual VM啟動成功!可以看到Visual VM的界面了。通過Visual VM可以看到本機運行中的所有Java應用。你會發(fā)現(xiàn)根本不需要在VisualVM 里為Java應用程序注冊,它們就會自動顯示出來。甚至還可以在導航欄里查看到遠程的Java應用。導航欄即為Applications,其中分為Local(本地Java應用)和Remote(遠程Java應用)。 2.1.3 安裝插件 Visual VM有很多好用的插件,步驟如下: 1. 點擊Tools - Plugins2. 推薦安裝全部插件 2.2 監(jiān)控本地Java應用 Visual VM本身就是一個Java應用,所以打開Visual VM看到的第一個可監(jiān)控應用就是Visual VM本身;可以用它熱熱身,小試下牛刀。在Visual VM可視化界面中可以監(jiān)控到Visual VM本身的內(nèi)存使用情況、線程情況、Jvm啟動參數(shù)、cpu消耗情況、垃圾回收情況等很多參數(shù)。當然如果在本地啟一個Tomcat一樣可以看到這些參數(shù),可以方便我們在本地對JVM進行調(diào)優(yōu)。但是且接如果你是在windows下起應用,如果你的Java應用是在NTFS格式的盤附上,記得加參數(shù):-XX:+PerfBypassFileSystemCheck 2.2.1 使用Visual VM監(jiān)測內(nèi)存泄漏、解決內(nèi)存溢出問題 內(nèi)存泄露、溢出的異同同:都會導致應用程序運行出現(xiàn)問題,性能下降或掛起。異:1)內(nèi)存泄露是導致內(nèi)存溢出的原因之一;內(nèi)存泄露積累起來將導致內(nèi)存溢出。2) 內(nèi)存泄露可以通過完善代碼來避免;內(nèi)存溢出可以通過調(diào)整配置來減少發(fā)生頻率,但無法徹底避免。 監(jiān)測內(nèi)存泄漏 內(nèi)存泄漏是指程序中間動態(tài)分配了內(nèi)存,但在程序結束時沒有釋放這部分內(nèi)存,從而造成那部分內(nèi)存不可用的情況,重啟計算機可以解決,但也有可能再次發(fā)生內(nèi)存泄露,內(nèi)存泄露和硬件沒有關系,它是由軟件設計缺陷引起的。 內(nèi)存泄漏可以分為4類: 1) 常發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到,每次被執(zhí)行的時候都會導致一塊內(nèi)存泄漏。 2) 偶發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會發(fā)生。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測試環(huán)境和測試方法對檢測內(nèi)存泄漏至關重要。 3) 一次性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只會被執(zhí)行一次,或者由于算法上的缺陷,導致總會有一塊僅且一塊內(nèi)存發(fā)生泄漏。比如,在類的構造函數(shù)中分配內(nèi)存,在析構函數(shù)中卻沒有釋放該內(nèi)存,所以內(nèi)存泄漏只會發(fā)生一次。4) 隱式內(nèi)存泄漏。程序在運行過程中不停的分配內(nèi)存,但是直到結束的時候才釋放內(nèi)存。嚴格的說這里并沒有發(fā)生內(nèi)存泄漏,因為最終程序釋放了所有申請的內(nèi)存。但是對于一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內(nèi)存也可能導致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。每隔一段時間給所監(jiān)測的Java應用來一個heap dump,如下面三圖所示:對比上面三個截圖,發(fā)現(xiàn)似乎有個東西在急速飆升,仔細一看是這個對象:org.eclipse.swt.graphics.Image 在第一章圖中這個還沒排的上,第二次dump已經(jīng)上升到5181個,第三次就是7845個了。漲速相當快,而且和任務管理器里面看到的GDI數(shù)量增漲一致,就是它了。問題到這兒就比較清楚了,回到代碼里面仔細一看可以發(fā)現(xiàn),是某個地方反復的用圖片來創(chuàng)建Image對象導致的,改掉以后搞定問題。到這里其實我想說的是,Java使用起來其實要比C+更容易導致內(nèi)存泄漏。對于C+來說,每一個申請的對象都必須明確釋放,任何沒有釋放的對象都會導致memleak,這是不可饒恕的,而且這類問題已經(jīng)有很多工具和方法來解決。但是到了Java里面情況就不同了,對于Java程序員來說對象都是不需要也無法主動銷毀的,所以一般的思路是:隨用隨new,用完即丟。很多對象具體的生命周期可能連寫代碼的人自己也不清楚,或者不需要清楚,只知道某個時刻垃圾收集器會去做的,不用管。但很可能某個對象在“用完即丟”的時候在另一個不容易發(fā)現(xiàn)的地方被保存了一個引用,那么這個對象就永遠不會被回收。更加糟糕的是整個程序從設計之初就沒有考慮過對象回收的問題,對于C+程序員來說memleak必然是一個設計錯誤,但是對Java程序員來說這只是一個疏忽,而且似乎沒有什么好的辦法來避免。今天看到的這個問題是因為GDI泄漏會造成嚴重后果才被重視,但如果僅僅是造成內(nèi)存泄漏,那這個程序可能得連續(xù)跑上個十天半個月才會發(fā)現(xiàn)問題。最后就是,對于c+,錯誤的代碼在測試階段就可以快速的偵測出哪怕一個byte的memleak并加以改正,但是對于java程序,理論上沒有哪個工具能夠知道是不是有泄漏,因為除了作者自己以外沒有人能夠知道一個被引用的對象是不是應該被銷毀,只有通過大量的,長期的壓力測試才能發(fā)現(xiàn)問題,這是很危險的一件事情。 解決內(nèi)存溢出問題1、java.lang.OutOfMemoryError: PermGen space JVM管理兩種類型的內(nèi)存,堆和非堆。堆是在JVM啟動時創(chuàng)建;非堆是留給JVM自己用的,用來存放類的信息的。它和堆不同,運行期內(nèi)GC不會釋放空間。如果web app用了大量的第三方jar或者應用有太多的class文件而恰好MaxPermSize設置較小,超出了也會導致這塊內(nèi)存的占用過多造成溢出,或者tomcat熱部署時侯不會清理前面加載的環(huán)境,只會將context更改為新部署的,非堆存的內(nèi)容就會越來越多。PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現(xiàn)PermGen space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產(chǎn)生此錯誤信息了。如上圖所示,PermGen在程序運行一段時間后超出了我們指定的128MB,通過Classes視圖看到,Java在運行的同時加載了大量的類到內(nèi)存中。PermGen會存儲Jar或者Class的描述信息;所以在class大量增加的同時PermGen超出了我們指定的范圍。為了讓應用穩(wěn)定,我們需要探尋新的PermGen范圍。檢測時段時候后(如下圖)發(fā)現(xiàn)PermGen在145MB左右穩(wěn)定,那么我們就得到了穩(wěn)定的新參數(shù);這樣PermGen內(nèi)存溢出的問題得到解決。2、java.lang.OutOfMemoryError: Java heap space 第一種情況是個補充,主要存在問題就是出現(xiàn)在這個情況中。其默認空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。如果內(nèi)存剩余不到40,JVM就會增大堆到Xmx設置的值,內(nèi)存剩余超過70,JVM就會減小堆到Xms設置的值。所以服務器的Xmx和Xms設置一般應該設置相同避免每次GC后都要調(diào)整虛擬機堆的大小。假設物理內(nèi)存無限大,那么JVM內(nèi)存的最大值跟操作系統(tǒng)有關,一般32位機是1.5g到3g之間,而64位的就不會有限制了。 注意:如果Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內(nèi)存或者操作系統(tǒng)的最大限制都會引起服務器啟動不起來。垃圾回收GC的角色,JVM調(diào)用GC的頻度還是很高的,主要兩種情況下進行垃圾回收:一個是當應用程序線程空閑;另一個是java內(nèi)存堆不足時,會不斷調(diào)用GC,若連續(xù)回收都解決不了內(nèi)存堆不足的問題時,就會報out of memory錯誤。因為這個異常根據(jù)系統(tǒng)運行環(huán)境決定,所以無法預期它何時出現(xiàn)。根據(jù)GC的機制,程序的運行會引起系統(tǒng)運行環(huán)境的變化,增加GC的觸發(fā)機會。為了避免這些問題,程序的設計和編寫就應避免垃圾對象的內(nèi)存占用和GC的開銷。顯示調(diào)用System.GC()只能建議JVM需要在內(nèi)存中對垃圾對象進行回收,但不是必須馬上回收。一個是并不能解決內(nèi)存資源耗空的局面,另外也會增加GC的消耗。如上圖所示,used heap的折線圖呈峰狀,說明垃圾對象及時被回收了,內(nèi)存得以釋放。如果used heap的值只增不減說明存在內(nèi)存泄漏了,如果超過heap size的值,會報內(nèi)存溢出的錯誤。 如何避免內(nèi)存泄漏、溢出1) 盡早釋放無用對象的引用。好的辦法是使用臨時變量的時候,讓引用變量在退出活動域后自動設置為null,暗示垃圾收集器來收集該對象,防止發(fā)生內(nèi)存泄露。2) 程序進行字符串處理時,盡量避免使用String,而應使用StringBuffer。因為每一個String對象都會獨立占用內(nèi)存一塊區(qū)域,如:1. Stringstr=aaa; 2. Stringstr2=bbb; 3. Stringstr3=str+str2; 4. /假如執(zhí)行此次之后str,str2再不被調(diào)用,那么它們就會在內(nèi)存中等待GC回收; 5. /假如程序中存在過多的類似情況就會出現(xiàn)內(nèi)存錯誤;String str = aaa; String str2 = bbb; String str3 = str + str2; / 假如執(zhí)行此次之后str , str2再不被調(diào)用,那么它們就會在內(nèi)存中等待GC回收; / 假如程序中存在過多的類似情況就會出現(xiàn)內(nèi)存錯誤; 3) 盡量少用靜態(tài)變量。因為靜態(tài)變量是全局的,GC不會回收。4) 避免集中創(chuàng)建對象尤其是大對象,如果可以的話盡量使用流操作。 JVM會突然需要大量內(nèi)存,這時會觸發(fā)GC優(yōu)化系統(tǒng)內(nèi)存環(huán)境; 一個案例如下:1. /使用jspsmartUpload作文件上傳,運行過程中經(jīng)常出現(xiàn)java.outofMemoryError的錯誤, 2. /檢查之后發(fā)現(xiàn)問題:組件里的代碼 3. m_totalBytes=m_request.getContentLength(); 4. m_binArray=newbytem_totalBytes; 5. /totalBytes這個變量得到的數(shù)極大,導致該數(shù)組分配了很多內(nèi)存空間,而且該數(shù)組不能及時釋放。 6. /解決辦法只能換一種更合適的辦法,至少是不會引發(fā)outofMemoryError的方式解決。 7. /參考:/blog/more.asp?name=hongrui&id=3747/ 使用jspsmartUpload作文件上傳,運行過程中經(jīng)常出現(xiàn)java.outofMemoryError的錯誤, / 檢查之后發(fā)現(xiàn)問題:組件里的代碼 m_totalBytes = m_request.getContentLength(); m_binArray = new bytem_totalBytes; / totalBytes這個變量得
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年在線直播分成協(xié)議
- 二零二五年度股東分紅分紅權繼承與轉讓合同3篇
- 2025年借殼上市協(xié)議書關鍵決策審批流程
- 2025年供銷合同解除協(xié)議
- 2025年蝦池承包及養(yǎng)殖品種改良合作協(xié)議3篇
- 二零二五年度植筋工程勞務分包合同3篇
- 2025年度行政合同中行政主體法律地位與執(zhí)行保障4篇
- 2025年度教育培訓項目居間服務合同協(xié)議4篇
- 二零二五年藍牙耳機品牌授權與區(qū)域保護合同3篇
- 二零二五年電力公司檢修工固定期限勞務派遣協(xié)議3篇
- GB/T 15593-2020輸血(液)器具用聚氯乙烯塑料
- 2023年上海英語高考卷及答案完整版
- 西北農(nóng)林科技大學高等數(shù)學期末考試試卷(含答案)
- 金紅葉紙業(yè)簡介-2 -紙品及產(chǎn)品知識
- 《連鎖經(jīng)營管理》課程教學大綱
- 《畢淑敏文集》電子書
- 頸椎JOA評分 表格
- 員工崗位能力評價標準
- 定量分析方法-課件
- 朱曦編著設計形態(tài)知識點
- 110kV變電站工程預算1
評論
0/150
提交評論