內存溢出 內存泄漏 StackOverflowError

  • 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();
        }
    }
    

    結果:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lbmlEUCV-1590418824934)(C:\Users\apple\AppData\Roaming\Typora\typora-user-images\image-20200519122335276.png)]

2.內存溢出(OOM)

  • 定義:內存溢出(Out Of Memory)是指系統已經不能再分配出你所需要的空間,比如你需要100M的空間,系統只剩90M了,這就叫內存溢出。
  • 常見原因:
    1. 內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
    2. 集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
    3. 代碼中存在死循環或循環產生過多重複的對象實體;
    4. 使用的第三方軟件中的BUG;
    5. 啓動參數內存值設定的過小;
  • 常見的解決方法:
    • 修改JVM啓動參數,直接增加內存。(-Xms,-Xmx參數一定不要忘記加。)
    • 檢查錯誤日誌,查看“OutOfMemory”錯誤前是否有其它異常或錯誤。
    • 對代碼進行走查和分析,找出可能發生內存溢出的位置。
    • 使用內存查看工具動態查看內存使用情況。

3.內存泄漏

  • 定義:指程序中動態分配內存給一些臨時對象,但是對象不會被GC所回收,它始終佔用內存。即被已無用。可能導致內存泄漏,虛擬機寧願拋出OOM也不會去回收指向的對象。內存泄漏次數多了就會導致內存溢出。

    一般我們所說的內存泄漏指的是堆內存的泄露,C++/C中有free函數可以釋放內存,java中有垃圾回收機制不用程序員自己手動調用釋放,但是如果這塊內存因爲某些原因無法釋放,就不能再用了,此時就可以說這塊內存泄漏了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章