我們都知道,Java憑借JVM有一套自動回收對象的機(jī)制,能自動進(jìn)行內(nèi)存管理,但這不是一勞永逸的方法,內(nèi)存泄露和內(nèi)存溢出還是會時(shí)時(shí)侵?jǐn)_java編程人員!先來看下內(nèi)存相應(yīng)的概念!

內(nèi)存泄露:內(nèi)存中的無用對象因?yàn)橐么嬖冢瑢ο筮t遲不能回收,導(dǎo)致內(nèi)存占用越來越高,最終導(dǎo)致內(nèi)存溢出; 比較常見的場景是生命周期短的對象已經(jīng)不再需要,但是生命周期比較長的對象有著短周期的對象引用,導(dǎo)致內(nèi)存泄露;

內(nèi)存溢出:程序想要獲取內(nèi)存的時(shí)候,已經(jīng)沒有新的內(nèi)存可供使用,這時(shí)就爆出了out of memory ,內(nèi)存溢出又分為堆溢出和棧溢出!

JAVA中的內(nèi)存溢出和內(nèi)存泄露是什么?

堆溢出常見關(guān)鍵字有java.lang.OutOfMemoryError: Java heap space

棧溢出常見關(guān)鍵字java.lang.StackOverflowError

內(nèi)存泄露的本質(zhì)就是無用對象的持續(xù)增長,比如說:

1,靜態(tài)類對象中存儲其他對象,因?yàn)閟tatic的聲明周期長,放入這些對象的其他對象遲遲得不到釋放;

2,諸如數(shù)據(jù)庫連接等網(wǎng)絡(luò),io連接,必須要顯式的close掉,否則也容易泄露;

3,單例模式初始化對象時(shí),引用其他的對象引用,也將導(dǎo)致對象不能釋放;

如何避免內(nèi)存泄露呢?長周期的對象中盡量不要引用短周期的對象,或者及時(shí)釋放;可以經(jīng)常使用jstack等內(nèi)存工具監(jiān)控內(nèi)存的增長情況,及時(shí)進(jìn)行處理!

JAVA中的內(nèi)存溢出和內(nèi)存泄露是什么?

內(nèi)存泄露如果不是很嚴(yán)重,一時(shí)半會兒也發(fā)現(xiàn)不了,發(fā)展下去通常會變成情節(jié)嚴(yán)重的內(nèi)存溢出!

我們知道堆主要用來放對象,棧用來存放對象引用,堆棧溢出通常是不同的原因?qū)е碌模?/p>

堆溢出常見的情景如下:

1,堆內(nèi)存分配過小:可通過-Xms2048m -Xmx2048m調(diào)整堆內(nèi)存

2,線程數(shù)過大,超過了操作系統(tǒng)限制

3.java.lang.OutOfMemoryError:PermGenspace:老年代溢出,可通過-XX:MaxPermSize=128m -XXermSize=128m調(diào)整

JAVA中的內(nèi)存溢出和內(nèi)存泄露是什么?

棧溢出常見情景如下:

遞歸調(diào)用方法,會創(chuàng)建大量棧幀,直至溢出!

無論是堆棧溢出還是泄露,幾乎都是代碼編寫不嚴(yán)謹(jǐn)引起,最主要的是注意不要大量創(chuàng)建對象或者線程,并注意及時(shí)釋放!