回覆列表
  • 1 # 程式猿開發日記

    如果是死迴圈,那有可能會產生記憶體溢位,而記憶體溢位一般有三種可能:

    比如迴圈內一直建立物件放入到list中(保證物件一直被引用),那麼就會出現堆記憶體溢位OutOfMemoryError:Java heap space。

    而如果javaweb中jsp檔案比較多或者第三方jar比較大超出了MaxPermSize設定,那麼就會出現永久代記憶體溢位OutOfMemoryError: PermGen space(java8中永久代被移除)。

    而如果jvm佔用了伺服器的大量記憶體,那麼有可能出現無法建立新的執行緒錯誤OutOfMemoryError: unable to create new native thread 。

    這三種記憶體溢位的情況,第一種和第三種都有可能出現在死迴圈中

    在實際的開發中,通常的記憶體溢位,都是由於開發人員程式設計不當造成的。所以我們開發人員編寫程式碼應該合理使用記憶體,比如強軟弱虛引用的合理使用,自定義記憶體分配,以此來降低記憶體溢位出現的機率。

  • 2 # 數字化與智慧化

    1、把區域性變數定義在死迴圈裡面會造成棧溢位,諸如下面的定義:

    while(true){

    int x=1;

    int arr[]= new int[10];

    }

    因為棧空間儲存區域性變數、引數等物件,棧是有預設深度的,我記得是128M(記憶問題,錯了請指出)。

    2、把物件定義在起迴圈裡面會產生堆記憶體溢位,諸如下列定義:

    while(true){

    Person p = new Person();

    }

    物件的生成是佔時間和空間的,因為你的記憶體空間有限,早晚會產生堆空間記憶體溢位。

    所以大家寫程式碼要養成良好習慣,不在特殊情況下,不要把區域性變數和物件定義在迴圈裡面。

  • 中秋節和大豐收的關聯?
  • 普通考生和自主招生有什麼區別?