我們都知道,Java憑借JVM有一套自動回收對象的機制,能自動進行內存管理,但這不是一勞永逸的方法,內存泄露和內存溢出還是會時時侵擾java編程人員!先來看下內存相應的概念!

內存泄露:內存中的無用對象因為引用存在,對象遲遲不能回收,導致內存占用越來越高,最終導致內存溢出; 比較常見的場景是生命周期短的對象已經不再需要,但是生命周期比較長的對象有著短周期的對象引用,導致內存泄露;

內存溢出:程序想要獲取內存的時候,已經沒有新的內存可供使用,這時就爆出了out of memory ,內存溢出又分為堆溢出和棧溢出!

JAVA中的內存溢出和內存泄露是什么?

堆溢出常見關鍵字有java.lang.OutOfMemoryError: Java heap space

棧溢出常見關鍵字java.lang.StackOverflowError

內存泄露的本質就是無用對象的持續增長,比如說:

1,靜態類對象中存儲其他對象,因為static的聲明周期長,放入這些對象的其他對象遲遲得不到釋放;

2,諸如數據庫連接等網絡,io連接,必須要顯式的close掉,否則也容易泄露;

3,單例模式初始化對象時,引用其他的對象引用,也將導致對象不能釋放;

如何避免內存泄露呢?長周期的對象中盡量不要引用短周期的對象,或者及時釋放;可以經常使用jstack等內存工具監控內存的增長情況,及時進行處理!

JAVA中的內存溢出和內存泄露是什么?

內存泄露如果不是很嚴重,一時半會兒也發現不了,發展下去通常會變成情節嚴重的內存溢出!

我們知道堆主要用來放對象,棧用來存放對象引用,堆棧溢出通常是不同的原因導致的!

堆溢出常見的情景如下:

1,堆內存分配過小:可通過-Xms2048m -Xmx2048m調整堆內存

2,線程數過大,超過了操作系統限制

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

JAVA中的內存溢出和內存泄露是什么?

棧溢出常見情景如下:

遞歸調用方法,會創建大量棧幀,直至溢出!

無論是堆棧溢出還是泄露,幾乎都是代碼編寫不嚴謹引起,最主要的是注意不要大量創建對象或者線程,并注意及時釋放!