- StackOverflowError
- 內存溢出
- 內存泄漏
1. StackOverflowError
-
定義:函數調用棧幀太深了,注意代碼中是否有了循環調用方法而無法退出的情況
-
原因:StackOverflowError 是一個java中常出現的錯誤:在jvm運行時的數據區域中有一個java虛擬機棧,當執行java方法時會進行壓棧彈棧的操作。在棧中會保存局部變量,操作數棧,方法出口等等。jvm規定了棧的最大深度,當執行時棧的深度大於了規定的深度,就會拋出StackOverflowError錯誤
-
例子:
public class Test { public static void main(String[] args) { f(); } private static void f() { System.out.println("8888"); f(); } }
結果:
2.內存溢出(OOM)
- 定義:內存溢出(Out Of Memory)是指系統已經不能再分配出你所需要的空間,比如你需要100M的空間,系統只剩90M了,這就叫內存溢出。
- 常見原因:
- 內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
- 集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
- 代碼中存在死循環或循環產生過多重複的對象實體;
- 使用的第三方軟件中的BUG;
- 啓動參數內存值設定的過小;
- 常見的解決方法:
- 修改JVM啓動參數,直接增加內存。(-Xms,-Xmx參數一定不要忘記加。)
- 檢查錯誤日誌,查看“OutOfMemory”錯誤前是否有其它異常或錯誤。
- 對代碼進行走查和分析,找出可能發生內存溢出的位置。
- 使用內存查看工具動態查看內存使用情況。
3.內存泄漏
-
定義:指程序中動態分配內存給一些臨時對象,但是對象不會被GC所回收,它始終佔用內存。即被已無用。可能導致內存泄漏,虛擬機寧願拋出OOM也不會去回收指向的對象。內存泄漏次數多了就會導致內存溢出。
一般我們所說的內存泄漏指的是堆內存的泄露,C++/C中有free函數可以釋放內存,java中有垃圾回收機制不用程序員自己手動調用釋放,但是如果這塊內存因爲某些原因無法釋放,就不能再用了,此時就可以說這塊內存泄漏了。