免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java基礎(chǔ)惡補(bǔ) -- 內(nèi)存泄露、內(nèi)存溢出 -- lsl 很不錯(cuò)的哦!
本資源引自: Java基礎(chǔ)惡補(bǔ)——內(nèi)存泄露、內(nèi)存溢出_酃←小︶ㄣ黑↓_新浪博客
http://blog.sina.com.cn/s/blog_4fb1c0fc0100lcmy.html
----------------------------------------------------------------------------------------------------------------------------
Java基礎(chǔ)惡補(bǔ)——內(nèi)存泄露、內(nèi)存溢出
要點(diǎn)
內(nèi)存泄露是指程序中間動(dòng)態(tài)分配了內(nèi)存,但在程序結(jié)束時(shí)沒有釋放這部分內(nèi)存,從而造成那部分內(nèi)存不可用的情況,重啟計(jì)算機(jī)可以解決,但也有可能再次發(fā)生內(nèi)存泄露,內(nèi)存泄露和硬件沒有關(guān)系,它是由軟件設(shè)計(jì)缺陷引起的。
內(nèi)存泄漏可以分為4類:1) 常發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏。
2) 偶發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會(huì)發(fā)生。常發(fā)性和偶發(fā)性是相對(duì)的。對(duì)于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測(cè)試環(huán)境和測(cè)試方法對(duì)檢測(cè)內(nèi)存泄漏至關(guān)重要。
3) 一次性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊僅且一塊內(nèi)存發(fā)生泄漏。比如,在類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存,所以內(nèi)存泄漏只會(huì)發(fā)生一次。
4) 隱式內(nèi)存泄漏。程序在運(yùn)行過程中不停的分配內(nèi)存,但是直到結(jié)束的時(shí)候才釋放內(nèi)存。嚴(yán)格的說這里并沒有發(fā)生內(nèi)存泄漏,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存。但是對(duì)于一個(gè)服務(wù)器程序,需要運(yùn)行幾天,幾周甚至幾個(gè)月,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。
內(nèi)存溢出類型:
1) java.lang.OutOfMemoryError: PermGen space
PermGen space 的全稱是 Permanent Generation space, 是指內(nèi)存的永久保存區(qū)域。這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時(shí)就會(huì)被放到PermGen space中,它和存放類實(shí)例(Instance)的Heap區(qū)域不同,GC不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理。
JVM由XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;
JVM由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。
該錯(cuò)誤常見場(chǎng)合:
a) 應(yīng)用中有很多Class,web服務(wù)器對(duì)JSP進(jìn)行pre compile時(shí)。
b) Webapp下用了大量的第三方j(luò)ar, 其大小超過了JVM默認(rèn)的大小(4M)時(shí)。
2) java.lang.OutOfMemoryError: Java heap space
在JVM中如果98%的時(shí)間是用于GC且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?div style="height:15px;">
JVM初始分配的內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64;
JVM最大分配的內(nèi)存由-Xmx指定,默認(rèn)是物理內(nèi)存的1/4。
JVM內(nèi)存的最大值跟操作系統(tǒng)有很大的關(guān)系。32位處理器雖然可控內(nèi)存空間有4GB,但是具體的操作系統(tǒng)會(huì)給一個(gè)限制,這個(gè)限制一般是2GB-3GB(一般來說Windows系統(tǒng)下為1.5G-2G,Linux系統(tǒng)下為2G-3G),而64bit以上的處理器就不會(huì)有限制了。
注意:如果Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內(nèi)存或者操作系統(tǒng)的最大限制都會(huì)引起服務(wù)器啟動(dòng)不起來。
該錯(cuò)誤常見場(chǎng)合:
a) Web上傳文件時(shí)。
b) 開啟大型文件或從數(shù)據(jù)庫中一次取了太多的數(shù)據(jù)。
相關(guān)問題
1. Q: Java中會(huì)存在內(nèi)存泄漏嗎?
A:  Java中也存在內(nèi)存泄露。
當(dāng)被分配的對(duì)象可達(dá)但已無用(未對(duì)作廢數(shù)據(jù)內(nèi)存單元的引用置null)即會(huì)引起。
如:
Java代碼 
Vector v=new Vector(10);
for (int i=1;i<100; i ) {
Object o=new Object();
v.add(o);
o=null;
}
// 此時(shí),所有的Object對(duì)象都沒有被釋放,因?yàn)樽兞縱引用這些對(duì)象。
// 對(duì)象加入到Vector后,還必須從Vector中刪除,最簡(jiǎn)單釋放方法就是將Vector對(duì)象設(shè)置為null。
2. Q: 內(nèi)存泄露、溢出的異同?
A: 同:都會(huì)導(dǎo)致應(yīng)用程序運(yùn)行出現(xiàn)問題,性能下降或掛起。
異:
1) 內(nèi)存泄露是導(dǎo)致內(nèi)存溢出的原因之一;內(nèi)存泄露積累起來將導(dǎo)致內(nèi)存溢出。
2) 內(nèi)存泄露可以通過完善代碼來避免;內(nèi)存溢出可以通過調(diào)整配置來減少發(fā)生頻率,但無法徹底避免。
3. 如何檢測(cè)內(nèi)存泄露?
A: 可以通過一些性能監(jiān)測(cè)分析工具,如 JProfiler、Optimizeit Profiler。
4. Q: 如何避免內(nèi)存泄露、溢出?
A: 1) 盡早釋放無用對(duì)象的引用。
好的辦法是使用臨時(shí)變量的時(shí)候,讓引用變量在退出活動(dòng)域后自動(dòng)設(shè)置為null,暗示垃圾收集器來收集該對(duì)象,防止發(fā)生內(nèi)存泄露。
2) 程序進(jìn)行字符串處理時(shí),盡量避免使用String,而應(yīng)使用StringBuffer。
因?yàn)槊恳粋€(gè)String對(duì)象都會(huì)獨(dú)立占用內(nèi)存一塊區(qū)域,如:
Java代碼 
String str = "aaa";
String str2 = "bbb";
String str3 = str   str2;
// 假如執(zhí)行此次之后str , str2再不被調(diào)用,那么它們就會(huì)在內(nèi)存中等待GC回收;
// 假如程序中存在過多的類似情況就會(huì)出現(xiàn)內(nèi)存錯(cuò)誤;
3) 盡量少用靜態(tài)變量。
因?yàn)殪o態(tài)變量是全局的,GC不會(huì)回收。
4) 避免集中創(chuàng)建對(duì)象尤其是大對(duì)象,如果可以的話盡量使用流操作。
JVM會(huì)突然需要大量?jī)?nèi)存,這時(shí)會(huì)觸發(fā)GC優(yōu)化系統(tǒng)內(nèi)存環(huán)境; 一個(gè)案例如下:
Java代碼 
// 使用jspsmartUpload作文件上傳,運(yùn)行過程中經(jīng)常出現(xiàn)java.outofMemoryError的錯(cuò)誤,
// 檢查之后發(fā)現(xiàn)問題:組件里的代碼
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
// totalBytes這個(gè)變量得到的數(shù)極大,導(dǎo)致該數(shù)組分配了很多內(nèi)存空間,而且該數(shù)組不能及時(shí)釋放。
// 解決辦法只能換一種更合適的辦法,至少是不會(huì)引發(fā)outofMemoryError的方式解決。
// 參考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747
5) 盡量運(yùn)用對(duì)象池技術(shù)以提高系統(tǒng)性能。
生命周期長(zhǎng)的對(duì)象擁有生命周期短的對(duì)象時(shí)容易引發(fā)內(nèi)存泄漏,
例如,
大集合對(duì)象擁有大數(shù)據(jù)量的業(yè)務(wù)對(duì)象的時(shí)候,可以考慮分塊進(jìn)行處理,
然后解決一塊釋放一塊的策略。
6) 不要在經(jīng)常調(diào)用的方法中創(chuàng)建對(duì)象,尤其是忌諱在循環(huán)中創(chuàng)建對(duì)象。
可以適當(dāng)?shù)氖褂胔ashtable,vector 創(chuàng)建一組對(duì)象容器,
然后從容器中去取那些對(duì)象,而不用每次new之后又丟棄。
7) 優(yōu)化配置。
5. Q: 內(nèi)存溢出的解決方案?
A: 一是從代碼層面進(jìn)行優(yōu)化完善,盡量避免該情況發(fā)生;
二是調(diào)整優(yōu)化服務(wù)器配置:
1) 設(shè)置-Xms、-Xmx相等;
2) 設(shè)置NewSize、MaxNewSize相等;
3) 設(shè)置Heap size, PermGen space:
Tomcat 的配置示例:修改 %TOMCAT_HOME%/bin/catalina.bat or catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
Cmd代碼 
set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java內(nèi)存泄露 - 心靈花園 - JavaEye技術(shù)網(wǎng)站
java內(nèi)存泄露
Java 程序里的內(nèi)存泄漏
java list 占用內(nèi)存不釋放
Java系統(tǒng)中內(nèi)存泄漏測(cè)試方法的研究
C 內(nèi)存模型,我們常說的堆棧究竟指什么?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服