第一對所有的代碼包括頁面中的java代碼都進行一遍徹底的回顧檢查,
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的天心網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
1.對那些靜態(tài)(static)的對象要特別留神,特別是類型為Map,List,Set的,靜態(tài)的變量會一直駐存在內(nèi)存中,生命周期比較長,不會被垃圾器回收。
2.對于代碼,要審查是否生成了大量的冗余的對象,還有一些邏輯業(yè)務(wù)處理的類,
算法是否過于復(fù)雜,調(diào)整算法,對于代碼認真審查,再仔細重構(gòu)一遍代碼,能提高代碼質(zhì)量,提高程序運行穩(wěn)定性。
3.Java中的內(nèi)存溢出大都是因為棧中的變量太多了。其實內(nèi)存有的是。建議不用的盡量設(shè)成null以便回收,多用局部變量,少用成員變量。
1),變量所包含的對象體積較大,占用內(nèi)存較多。
2),變量所包含的對象生命周期較長。
3),變量所包含的對象數(shù)據(jù)穩(wěn)定。
4),該類的對象實例有對該變量所包含的對象的共享需求。
4.在我的程序中對靜態(tài)變量的優(yōu)化后,使程序占用內(nèi)存量至少提升了5k-10k。所以也不容忽視。
第二還有就是String類相關(guān)的東西:
1.字符串累加的時候一定要用StringBuffer的append方法,不要使用+操作符連接兩個字符串。差別很大。而且在循環(huán)或某些重復(fù)執(zhí)行的動作中不要去創(chuàng)建String對象,因為String對象是要用StringBuffer對象來處理的,一個String對象應(yīng)該是產(chǎn)生了 3個對象(大概是這樣:))。
2.字符串length()方法來取得字符串長度的時候不要把length放到循環(huán)中,可以在循環(huán)外面對其取值。(包括vector的size方法)。特別是循環(huán)次數(shù)多的時候,盡量把length放到循環(huán)外面。
int size = xmlVector.size();
for (int i = 2; i size; i++) {
。。。
}
3 寫代碼的時候處理內(nèi)存溢出
try{
//do sth
....
}catch (outofmemoryerror e){//可以用一個共通函數(shù)來執(zhí)行.
system.out.print (“no memory! ”);
system.gc();
//do sth again
....
}
4.對于頻繁申請內(nèi)存和釋放內(nèi)存的操作,還是自己控制一下比較好,但是System.gc()的方法不一定適用,最好使用finallize強制執(zhí)行或者寫自己的finallize方法。 Java 中并不保證每次調(diào)用該方法就一定能夠啟動垃圾收集,它只不過會向JVM發(fā)出這樣一個申請,到底是否真正執(zhí)行垃圾收集,一切都是個未知數(shù)。
問題一:內(nèi)存溢出的解決方法 內(nèi)存溢出雖然很棘手,但也有相應(yīng)的解決辦法,可以按照從易到難,一步步的解決。第一步,就是修改JVM啟動參數(shù),直接增加內(nèi)存。這一點看上去似乎很簡單,但很容易被忽略。JVM默認可以使用的內(nèi)存為64M,Tomcat默認可以使用的內(nèi)存為128MB,對于稍復(fù)雜一點的系統(tǒng)就會不夠用。在某項目中,就因為啟動參數(shù)使用的默認值,經(jīng)常報“OutOfMemory”錯誤。因此,-Xms,-Xmx參數(shù)一定不要忘記加。第二步,檢查錯誤日志,查看“OutOfMemory”錯誤前是否有其它異?;蝈e誤。在一個項目中,使用兩個數(shù)據(jù)庫連接,其中專用于發(fā)送短信的數(shù)據(jù)庫連接使用DBCP連接池管理,用戶為不將短信發(fā)出,有意將數(shù)據(jù)庫連接用戶名改錯,使得日志中有許多數(shù)據(jù)庫連接異常的日志,一段時間后,就出現(xiàn)“OutOfMemory”錯誤。經(jīng)分析,這是由于DBCP連接池BUG引起的,數(shù)據(jù)庫連接不上后,沒有將連接釋放,最終使得DBCP報“OutOfMemory”錯誤。經(jīng)過修改正確數(shù)據(jù)庫連接參數(shù)后,就沒有再出現(xiàn)內(nèi)存溢出的錯誤。查看日志對于分析內(nèi)存溢出是非常重要的,通過仔細查看日志,分析內(nèi)存溢出前做過哪些操作,可以大致定位有問題的模塊。第三步,安排有經(jīng)驗的編程人員對代碼進行走查和分析,找出可能發(fā)生內(nèi)存溢出的位置。重點排查以下幾點:? 檢查代碼中是否有死循環(huán)或遞歸調(diào)用。? 檢查是否有大循環(huán)重復(fù)產(chǎn)生新對象實體。? 檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。? 檢查List、MAP等 *** 對象是否有使用完后,未清除的問題。List、MAP等 *** 對象會始終存有對對象的引用,使得這些對象不能被GC回收。第四步,使用內(nèi)存查看工具動態(tài)查看內(nèi)存使用情況。某個項目上線后,每次系統(tǒng)啟動兩天后,就會出現(xiàn)內(nèi)存溢出的錯誤。這種情況一般是代碼中出現(xiàn)了緩慢的內(nèi)存泄漏,用上面三個步驟解決不了,這就需要使用內(nèi)存查看工具了。內(nèi)存查看工具有許多,比較有名的有:Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等。它們的基本工作原理大同小異,都是監(jiān)測Java程序運行時所有對象的申請、釋放等動作,將內(nèi)存管理的所有信息進行統(tǒng)計、分析、可視化。開發(fā)人員可以根據(jù)這些信息判斷程序是否有內(nèi)存泄漏問題。一般來說,一個正常的系統(tǒng)在其啟動完成后其內(nèi)存的占用量是基本穩(wěn)定的,而不應(yīng)該是無限制的增長的。持續(xù)地觀察系統(tǒng)運行時使用的內(nèi)存的大小,可以看到在內(nèi)存使用監(jiān)控窗口中是基本規(guī)則的鋸齒形的圖線,如果內(nèi)存的大小持續(xù)地增長,則說明系統(tǒng)存在內(nèi)存泄漏問題。通過間隔一段時間取一次內(nèi)存快照,然后對內(nèi)存快照中對象的使用與引用等信息進行比對與分析,可以找出是哪個類的對象在泄漏。通過以上四個步驟的分析與處理,基本能處理內(nèi)存溢出的問題。當(dāng)然,在這些過程中也需要相當(dāng)?shù)慕?jīng)驗與敏感度,需要在實際的開發(fā)與調(diào)試過程中不斷積累。
問題二:為什么點開查看代碼就彈出內(nèi)存溢出 請優(yōu)化代碼,找出內(nèi)存溢出的原因。代碼正常的話,一般計算機的內(nèi)存都是夠用的。
正常的工作表 里面沒有VBA代碼的話 擴展名為XLSX
如果有 通常為XLS 也或許是你添加了控件之類的
才會出現(xiàn) 隱私警告
此工作簿包含AC.....什么控件和宏 不能通過什么檢查
也或許是不小心觸動了 工作表的什么事件
沒有關(guān)系的
解決方法
1 另存 保存的時候選擇否 另存為啟用宏的
2 如果你不另存的話 點擊右鍵 進入VBE界面 看到小菜單 有你各表名稱的里面 只要看到有能刪除的文字都刪除
問題三:內(nèi)存溢出錯誤怎么解決 你好,內(nèi)存溢出可能是病毒作怪,也有可能是程序錯誤. 內(nèi)存溢出是指系統(tǒng)內(nèi)存全部被占用,沒有可用內(nèi)存分配給新啟動的任務(wù)的情況,通常不會導(dǎo)致系統(tǒng)崩潰。 可以擴展一條內(nèi)存,或者增大虛擬內(nèi)存的大小 下面以在Windows XP下轉(zhuǎn)移虛擬內(nèi)存所在盤符為例介紹虛擬內(nèi)存的設(shè)置方法: 一、手動設(shè)置虛擬內(nèi)存 在默認狀態(tài)下,是讓系統(tǒng)管理虛擬內(nèi)存的,但是系統(tǒng)默認設(shè)置的管理方式通常比較保守,在自動調(diào)節(jié)時會造成頁面文件不連續(xù),而降低讀寫效率,工作效率就顯得不高,于是經(jīng)常會出現(xiàn)“內(nèi)存不足”這樣的提示,下面就讓我們自已動手來設(shè)置它吧。 ①用右鍵點擊桌面上的“我的電腦”圖標(biāo),在出現(xiàn)的右鍵菜單中選擇“屬性”選項打開“系統(tǒng)屬性”窗口。在窗口中點擊“高級”選項卡,出現(xiàn)高級設(shè)置的對話框. ②點擊“性能”區(qū)域的“設(shè)置”按鈕,在出現(xiàn)的“性能選項”窗口中選擇“高級”選項卡,打開其對話框。 ③在該對話框中可看到關(guān)于虛擬內(nèi)存的區(qū)域,點擊“更改”按鈕進入“虛擬內(nèi)存”的設(shè)置窗口。選擇一個有較大空閑容量的分區(qū),勾選“自定義大小”前的復(fù)選框,將具體數(shù)值填入“初始大 二、量身定制虛似內(nèi)存 1.普通設(shè)置法 根據(jù)一般的設(shè)置方法,虛擬內(nèi)存交換文件最小值、最大值同時都可設(shè)為內(nèi)存容量的1.5倍,但如果內(nèi)存本身容量比較大,比如內(nèi)存是512MB,那么它占用的空間也是很可觀的。所以我們可以這樣設(shè)定虛擬內(nèi)存的基本數(shù)值:內(nèi)存容量在256MB以下,就設(shè)置為1.5倍;在512MB以上,設(shè)置為內(nèi)存容量的一半;介于256MB與512MB之間的設(shè)為與內(nèi)存容量相同值。 2.精準設(shè)置法 由于每個人實際操作的應(yīng)用程序不可能一樣,比如有些人要運行3DMAX、Photoshop等這樣的大型程序,而有些人可能只是打打字、玩些小游戲,所以對虛擬內(nèi)存的要求并不相同,于是我們就要因地制宜地精確設(shè)置虛擬內(nèi)存空間的數(shù)值。 ①先將虛擬內(nèi)存自定義的“初始大小”、“最大值”設(shè)為兩個相同的數(shù)值,比如500MB; ②然后依次打開“控制面板→管理工具→性能”,在出現(xiàn)的“性能”對話框中,展開左側(cè)欄目中的“性能日志和警報”,選中其下的“計數(shù)器日志”,在右側(cè)欄目中空白處點擊右鍵,選擇右鍵菜單中的“新建日志設(shè)置”選項; ③在彈出的對話框“名稱”一欄中填入任意名稱,比如“虛擬內(nèi)存測試”。在出現(xiàn)窗口中點擊“添加計數(shù)器”按鈕進入下一個窗口; ④在該窗口中打開“性能對象”的下拉列表,選擇其中的“Paging File”,勾選“從列表中選擇計數(shù)器”,并在下方的欄目中選擇“%Usage Peak”;勾選“從列表中選擇范例”,在下方的欄目中選擇“_Total”,再依次點擊“添加→關(guān)閉”結(jié)束 ⑥在右側(cè)欄目中可以發(fā)現(xiàn)多了一個“虛擬內(nèi)存測試”項目,如果該項目為紅色則說明還沒有啟動,點擊該項,選擇右鍵菜單中的“啟動”選項即可 接下來運行自己常用的一些應(yīng)用程序,運行一段時間后,進入日志文件所在的系統(tǒng)分區(qū)下默認目錄“PerfLogs”,找到“虛擬內(nèi)存測試_000001.csv”并用記事本程序打開它,在該內(nèi)容中,我們查看每一欄中倒數(shù)第二項數(shù)值,這個數(shù)值是虛擬內(nèi)存的使用比率,找到這項數(shù)值的最大值,比如圖中的“46”,用46%乘以500MB(前面所設(shè)定的虛擬內(nèi)存數(shù)值),得出數(shù)值為230MB。 用該數(shù)值可以將初始大小設(shè)為230MB,而最大值可以根據(jù)磁盤空間大小自由設(shè)定,一般建議將它設(shè)置為最小值的2到3倍。這樣我們就可以將虛擬內(nèi)存打造得更精準,使自己的愛機運行得更加流暢、更具效率......
問題四:內(nèi)存不足、內(nèi)存溢出的原因和解決方法? 引起內(nèi)存不足、內(nèi)存溢出的 原因 有很多種,常見的有以下幾種:
1.內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);
2. *** 類中有對對象的引用,使用完后未清空,使得JVM不能回收;
3.代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)的對象實體;
4.使用的第三方軟件中的BUG;
5.啟動參數(shù)內(nèi)存值設(shè)定的過小;
內(nèi)存溢出的解決方案 :
第一步 ,修改JVM啟動參數(shù),直接增加內(nèi)存。(-Xms,-Xmx參數(shù)一定不要忘記加。)
第二步 ,檢查錯誤日志,查看“OutOfMemory”錯誤前是否有其它異?;蝈e誤。
第三步 ,對代碼進行走查和分析,找出可能發(fā)生內(nèi)存溢出的位置。
重點排查以下幾點:
1.檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。
2.檢查代碼中是否有死循環(huán)或遞歸調(diào)用。
3.檢查是否有大循環(huán)重復(fù)產(chǎn)生新對象實體。
4.檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。
5.檢查List、MAP等 *** 對象是否有使用完后,未清除的問題。List、MAP等 *** 對象會始終存有對對象的引用,使得這些對象不能被GC回收。
第四步 ,使用內(nèi)存查看工具動態(tài)查看內(nèi)存使用情況。
問題五:內(nèi)存溢出是什么意思?如何解決? 內(nèi)存溢出已經(jīng)是軟件開發(fā)歷史上存在了近40年的“老大難”問題,象在“紅色代碼”病毒事件中表現(xiàn)的那樣,它已經(jīng)成為黑客攻擊企業(yè)網(wǎng)絡(luò)的“罪魁禍首”。 如在一個域中輸入的數(shù)據(jù)超過了它的要求就會引發(fā)數(shù)據(jù)溢出問題,多余的數(shù)據(jù)就可以作為指令在計算機上運行。據(jù)有關(guān)安全小組稱,操作系統(tǒng)中超過50%的安全漏洞都是由內(nèi)存溢出引起的,其中大多數(shù)與微軟的技術(shù)有關(guān)。
程序做的不好,用完內(nèi)存不知道把內(nèi)存釋放給其他的程序或者系統(tǒng)實用,一段時間后由于此程序占用大量的內(nèi)存而使得其他程序或者系統(tǒng)沒有足夠的內(nèi)存使用而出現(xiàn)速度狂慢嘩硬盤燈狂閃的現(xiàn)象,這就是內(nèi)存益處.解決的方法就是重起電腦.可能是你安裝的某個程序,比如說什么小游戲造成的.
問題六:java內(nèi)存溢出怎么解決 第一對所有的代碼包括頁面中的java代碼都進行一遍徹底的回顧檢查,
1.對那些靜態(tài)(static)的對象要特別留神,特別是類型為Map,List,Set的,靜態(tài)的變量會一直駐存在內(nèi)存中,生命周期比較長,不會被垃圾器回收。
2.對于代碼,要審查是否生成了大量的冗余的對象,還有一些邏輯業(yè)務(wù)處理的類,
算法是否過于復(fù)雜,調(diào)整算法,對于代碼認真審查,再仔細重構(gòu)一遍代碼,能提高代碼質(zhì)量,提高程序運行穩(wěn)定性。
3.Java中的內(nèi)存溢出大都是因為棧中的變量太多了。其實內(nèi)存有的是。建議不用的盡量設(shè)成null以便回收,多用局部變量,少用成員變量。
1),變量所包含的對象體積較大,占用內(nèi)存較多。
2),變量所包含的對象生命周期較長。
3),變量所包含的對象數(shù)據(jù)穩(wěn)定。
4),該類的對象實例有對該變量所包含的對象的共享需求。
4.在我的程序中對靜態(tài)變量的優(yōu)化后,使程序占用內(nèi)存量至少提升了5k-10k。所以也不容忽視。
第二還有就是String類相關(guān)的東西:
1.字符串累加的時候一定要用StringBuffer的append方法,不要使用+操作符連接兩個字符串。差別很大。而且在循環(huán)或某些重復(fù)執(zhí)行的動作中不要去創(chuàng)建String對象,因為String對象是要用StringBuffer對象來處理的,一個String對象應(yīng)該是產(chǎn)生了 3個對象(大概是這樣:))。
2.字符串length()方法來取得字符串長度的時候不要把length放到循環(huán)中,可以在循環(huán)外面對其取值。(包括vector的size方法)。特別是循環(huán)次數(shù)多的時候,盡量把length放到循環(huán)外面。
int size = xmlVector.size();
for (int i = 2; i 問題七:為什么excel不能運行代碼,顯示內(nèi)存溢出 有很多種原因,首先應(yīng)檢查的是你的變量范圍...
再者檢查引用數(shù)組的時候是否索引出現(xiàn)負數(shù)等
最好把代碼貼出來
問題八:EXCEL查看代碼是顯示“內(nèi)存溢出” 請優(yōu)化代碼,找出內(nèi)存溢出的原因。代碼正常的話,一般計算機的內(nèi)存都是夠用的。
正常的工作表 里面沒有VBA代碼的話 擴展名為XLSX
如果有 通常為XLS 也或許是你添加了控件之類的
才會出現(xiàn) 隱私警告
此工作簿包含AC.....什么控件和宏 不能通過什么檢查
也或許是不小心觸動了 工作表的什么事件
沒有關(guān)系的
解決方法
1 另存 保存的時候選擇否 另存為啟用宏的
2 如果你不另存的話 點擊右鍵 進入VBE界面 看到小菜單 有你各表名稱的里面 只要看到有能刪除的文字都刪除
問題九:java代碼修改,使其占有更少的內(nèi)存空間,解決內(nèi)存溢出問題 參加下面的代碼,核心思想是分段進行處理
yuncode/code/c_536068414a11b54
問題十:java中舉個內(nèi)存溢出的例子,以及如何解決這個問題的 有實例代碼就最好啦 List list = new ArrayList();
while(1==1) {
list.add(xxxxxxxxxxxxxxx);
}
1、為什么會發(fā)生內(nèi)存泄漏
Java如何檢測內(nèi)在泄漏呢?我們需要一些工具進行檢測,并發(fā)現(xiàn)內(nèi)存泄漏問題,不然很容易發(fā)生down機問題。
編寫java程序最為方便的地方就是我們不需要管理內(nèi)存的分配和釋放,一切由jvm來進行處理,當(dāng)java對象不再被應(yīng)用時,等到堆內(nèi)存不夠用時,jvm會進行垃圾回收,清除這些對象占用的堆內(nèi)存空間,如果對象一直被應(yīng)用,jvm無法對其進行回收,創(chuàng)建新的對象時,無法從Heap中獲取足夠的內(nèi)存分配給對象,這時候就會導(dǎo)致內(nèi)存溢出。而出現(xiàn)內(nèi)存泄露的地方,一般是不斷的往容器中存放對象,而容器沒有相應(yīng)的大小限制或清除機制。容易導(dǎo)致內(nèi)存溢出。
當(dāng)服務(wù)器應(yīng)用占用了過多內(nèi)存的時候,如何快速定位問題呢?現(xiàn)在,Eclipse MAT的出現(xiàn)使這個問題變得非常簡單。EclipseMAT是著名的SAP公司貢獻的一個工具,可以在Eclipse網(wǎng)站下載到它,完全免費的。
要定位問題,首先你需要獲取服務(wù)器jvm某刻內(nèi)存快照。jdk自帶的jmap可以獲取內(nèi)存某一時刻的快照,導(dǎo)出為dmp文件后,就可以用Eclipse MAT來分析了,找出是那個對象使用內(nèi)存過多。
2、內(nèi)存泄漏的現(xiàn)象:
常常地,程序內(nèi)存泄漏的最初跡象發(fā)生在出錯之后,在你的程序中得到一個OutOfMemoryError。這種典型的情況發(fā)生在產(chǎn)品環(huán)境中,而在那里,你希望內(nèi)存泄漏盡可能的少,調(diào)試的可能性也達到最小。也許你的測試環(huán)境和產(chǎn)品的系統(tǒng)環(huán)境不盡相同,導(dǎo)致泄露的只會在產(chǎn)品中暴露。這種情況下,你需要一個低負荷的工具來監(jiān)聽和尋找內(nèi)存泄漏。同時,你還需要把這個工具同你的系統(tǒng)聯(lián)系起來,而不需要重新啟動他或者機械化你的代碼。也許更重要的是,當(dāng)你做分析的時候,你需要能夠同工具分離而使得系統(tǒng)不會受到干擾。
一個OutOfMemoryError常常是內(nèi)存泄漏的一個標(biāo)志,有可能應(yīng)用程序的確用了太多的內(nèi)存;這個時候,你既不能增加JVM的堆的數(shù)量,也不能改變你的程序而使得他減少內(nèi)存使用。但是,在大多數(shù)情況下,一個OutOfMemoryError是內(nèi)存泄漏的標(biāo)志。一個解決辦法就是繼續(xù)監(jiān)聽GC的活動,看看隨時間的流逝,內(nèi)存使用量是否會增加,如果有,程序中一定存在內(nèi)存泄漏。
3、發(fā)現(xiàn)內(nèi)存泄漏
1. jstat -gc pid
可以顯示gc的信息,查看gc的次數(shù),及時間。
其中最后五項,分別是young gc的次數(shù),young gc的時間,full gc的次數(shù),full gc的時間,gc的總時間。
2.jstat -gccapacity pid
可以顯示,VM內(nèi)存中三代(young,old,perm)對象的使用和占用大小,
如:PGCMN顯示的是最小perm的內(nèi)存使用量,PGCMX顯示的是perm的內(nèi)存最大使用量,
PGC是當(dāng)前新生成的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量。
其他的可以根據(jù)這個類推,OC是old內(nèi)純的占用量。
3.jstat -gcutil pid
統(tǒng)計gc信息統(tǒng)計。
4.jstat -gcnew pid
年輕代對象的信息。
5.jstat -gcnewcapacity pid
年輕代對象的信息及其占用量。
6.jstat -gcold pid
old代對象的信息。
7.stat -gcoldcapacity pid
old代對象的信息及其占用量。
8.jstat -gcpermcapacity pid
perm對象的信息及其占用量。
9.jstat -class pid
顯示加載class的數(shù)量,及所占空間等信息。
10.jstat -compiler pid
顯示VM實時編譯的數(shù)量等信息。
11.stat -printcompilation pid
當(dāng)前VM執(zhí)行的信息。
一些術(shù)語的中文解釋:
S0C:年輕代中第一個survivor(幸存區(qū))的容量(字節(jié))
S1C:年輕代中第二個survivor(幸存區(qū))的容量(字節(jié))
S0U:年輕代中第一個survivor(幸存區(qū))目前已使用空間(字節(jié))
S1U:年輕代中第二個survivor(幸存區(qū))目前已使用空間(字節(jié))
EC:年輕代中Eden(伊甸園)的容量(字節(jié))
EU:年輕代中Eden(伊甸園)目前已使用空間(字節(jié))
OC:Old代的容量(字節(jié))
OU:Old代目前已使用空間(字節(jié))
PC:Perm(持久代)的容量(字節(jié))
PU:Perm(持久代)目前已使用空間(字節(jié))
YGC:從應(yīng)用程序啟動到采樣時年輕代中g(shù)c次數(shù)
YGCT:從應(yīng)用程序啟動到采樣時年輕代中g(shù)c所用時間(s)
FGC:從應(yīng)用程序啟動到采樣時old代(全gc)gc次數(shù)
FGCT:從應(yīng)用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT:從應(yīng)用程序啟動到采樣時gc用的總時間(s)
NGCMN:年輕代(young)中初始化(最小)的大小(字節(jié))
NGCMX:年輕代(young)的最大容量(字節(jié))
NGC:年輕代(young)中當(dāng)前的容量(字節(jié))
OGCMN:old代中初始化(最小)的大小(字節(jié))
OGCMX:old代的最大容量(字節(jié))
OGC:old代當(dāng)前新生成的容量(字節(jié))
PGCMN:perm代中初始化(最小)的大小(字節(jié))
PGCMX:perm代的最大容量(字節(jié))
PGC:perm代當(dāng)前新生成的容量(字節(jié))
S0:年輕代中第一個survivor(幸存區(qū))已使用的占當(dāng)前容量百分比
S1:年輕代中第二個survivor(幸存區(qū))已使用的占當(dāng)前容量百分比
E:年輕代中Eden(伊甸園)已使用的占當(dāng)前容量百分比
O:old代已使用的占當(dāng)前容量百分比
P:perm代已使用的占當(dāng)前容量百分比
S0CMX:年輕代中第一個survivor(幸存區(qū))的最大容量(字節(jié))
S1CMX:年輕代中第二個survivor(幸存區(qū))的最大容量(字節(jié))
ECMX:年輕代中Eden(伊甸園)的最大容量(字節(jié))
DSS:當(dāng)前需要survivor(幸存區(qū))的容量(字節(jié))(Eden區(qū)已滿)
TT:持有次數(shù)限制
MTT:最大持有次數(shù)限制
如果定位內(nèi)存泄漏問題我一般使用如下命令:
Jstat -gcutil15469 2500 70
[root@ssss logs]# jstat -gcutil 15469 1000 300
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 1.46 26.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 46.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 47.04 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 65.19 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 67.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 87.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 88.03 4.61 30.14 35 0.872 0 0.000 0.872
1.48 0.00 5.56 4.62 30.14 36 0.874 0 0.000 0.874
1000 代表多久間隔顯示一次,
100 代表顯示一次。
S0 — Heap上的 Survivor space 0 區(qū)已使用空間的百分比
S1 — Heap上的 Survivor space 1 區(qū)已使用空間的百分比
E — Heap上的 Eden space 區(qū)已使用空間的百分比
O — Heap上的 Old space 區(qū)已使用空間的百分比
P — Perm space 區(qū)已使用空間的百分比
YGC — 從應(yīng)用程序啟動到采樣時發(fā)生 Young GC 的次數(shù)
YGCT– 從應(yīng)用程序啟動到采樣時 Young GC 所用的時間(單位秒)
FGC — 從應(yīng)用程序啟動到采樣時發(fā)生 Full GC 的次數(shù)
FGCT– 從應(yīng)用程序啟動到采樣時 Full GC 所用的時間(單位秒)
GCT — 從應(yīng)用程序啟動到采樣時用于垃圾回收的總時間(單位秒)
如果有大量的FGC就要查詢是否有內(nèi)存泄漏的問題了,圖中的FGC數(shù)量就比較大,并且執(zhí)行時間較長,這樣就會導(dǎo)致系統(tǒng)的響應(yīng)時間較長,如果對jvm的內(nèi)存設(shè)置較大,那么執(zhí)行一次FGC的時間可能會更長。
如果為了更好的證明FGC對服務(wù)器性能的影響,我們可以使用java visualVM來查看一下:
從上圖可以發(fā)現(xiàn)執(zhí)行FGC的情況,下午3:10分之前是沒有FGC的,之后出現(xiàn)大量的FGC。
上圖是jvm堆內(nèi)存的使用情況,下午3:10分之前的內(nèi)存回收還是比較合理,但是之后大量內(nèi)存無法回收,最后導(dǎo)致內(nèi)存越來越少,導(dǎo)致大量的full gc。
下面我們在看看大量full GC對服務(wù)器性能的影響,下面是我用loadrunner對我們項目進行壓力測試相應(yīng)時間的截圖:
從圖中可以發(fā)現(xiàn)有,在進行full GC后系統(tǒng)的相應(yīng)時間有了明顯的增加,點擊率和吞吐量也有了明顯的下降。所以java內(nèi)存泄漏對系統(tǒng)性能的影響是不可忽視的。
3、定位內(nèi)存泄漏
當(dāng)然通過上面幾種方法我們可以發(fā)現(xiàn)java的內(nèi)存泄漏問題,但是作為一名合格的高級工程師,肯定不甘心就把這樣的結(jié)論交給開發(fā),當(dāng)然這也的結(jié)論交給開發(fā),開發(fā)也很難定位問題,為了更好的提供自己在公司的地位,我們必須給開發(fā)工程師提供更深入的測試結(jié)論,下面就來認識一下MemoryAnalyzer.exe。java內(nèi)存泄漏檢查工具利器。
首先我們必須對jvm的堆內(nèi)存進行dump,只有拿到這個文件我們才能分析出jvm堆內(nèi)存中到底存了些什么內(nèi)容,到底在做什么?
MemoryAnalyzer的用戶我在這里就不一一說明了,我的博客里也有說明,下面就展示我測試的成功圖:
其中深藍色的部分就為內(nèi)存泄漏的部分,java的堆內(nèi)存一共只有481.5M而內(nèi)存泄漏的部分獨自占有了336.2M所以本次的內(nèi)存泄漏很明顯,那么我就來看看那個方法導(dǎo)致的內(nèi)存泄漏:
從上圖我們可以發(fā)現(xiàn)紅線圈著的方法占用了堆內(nèi)存的67.75%,如果能把這個測試結(jié)果交給開發(fā),開發(fā)是不是應(yīng)該很好定位呢。所以作為一名高級測試工程師,我們需要學(xué)習(xí)的東西太多。
雖然不確定一定是內(nèi)存泄漏,但是可以準確的告訴開發(fā)問題出現(xiàn)的原因,有一定的說服力。
內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運行要用到的內(nèi)存大于虛擬機能提供的最大內(nèi)存。為了解決Java中內(nèi)存溢出問題,我們首先必須了解Java是如何管理內(nèi)存的。Java的內(nèi)存管理就是對象的分配和釋放問題。在Java中,內(nèi)存的分配是由程序完成的,而內(nèi)存的釋放是由垃圾收集器(Garbage Collection,GC)完成的,程序員不需要通過調(diào)用GC函數(shù)來釋放內(nèi)存,因為不同的JVM實現(xiàn)者可能使用不同的算法管理GC,有的是內(nèi)存使用到達一定程度時,GC才開始工作,也有定時執(zhí)行的,有的是中斷式執(zhí)行GC。但GC只能回收無用并且不再被其它對象引用的那些對象所占用的空間。Java的內(nèi)存垃圾回收機制是從程序的主要運行對象開始檢查引用鏈,當(dāng)遍歷一遍后發(fā)現(xiàn)沒有被引用的孤立對象就作為垃圾回收。引起內(nèi)存溢出的原因有很多種,常見的有以下幾種:l 內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);l 集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;l 代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)的對象實體;l 使用的第三方軟件中的BUG;l 啟動參數(shù)內(nèi)存值設(shè)定的過?。?/p>
網(wǎng)站題目:java內(nèi)存溢出定位代碼 java內(nèi)存溢出定位代碼怎么用
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/hgessh.html