回覆列表
-
1 # 程式猿開發日記
-
2 # 數字化與智慧化
1、把區域性變數定義在死迴圈裡面會造成棧溢位,諸如下面的定義:
while(true){
int x=1;
int arr[]= new int[10];
}
因為棧空間儲存區域性變數、引數等物件,棧是有預設深度的,我記得是128M(記憶問題,錯了請指出)。
2、把物件定義在起迴圈裡面會產生堆記憶體溢位,諸如下列定義:
while(true){
Person p = new Person();
}
物件的生成是佔時間和空間的,因為你的記憶體空間有限,早晚會產生堆空間記憶體溢位。
所以大家寫程式碼要養成良好習慣,不在特殊情況下,不要把區域性變數和物件定義在迴圈裡面。
如果是死迴圈,那有可能會產生記憶體溢位,而記憶體溢位一般有三種可能:
比如迴圈內一直建立物件放入到list中(保證物件一直被引用),那麼就會出現堆記憶體溢位OutOfMemoryError:Java heap space。
而如果javaweb中jsp檔案比較多或者第三方jar比較大超出了MaxPermSize設定,那麼就會出現永久代記憶體溢位OutOfMemoryError: PermGen space(java8中永久代被移除)。
而如果jvm佔用了伺服器的大量記憶體,那麼有可能出現無法建立新的執行緒錯誤OutOfMemoryError: unable to create new native thread 。
這三種記憶體溢位的情況,第一種和第三種都有可能出現在死迴圈中
在實際的開發中,通常的記憶體溢位,都是由於開發人員程式設計不當造成的。所以我們開發人員編寫程式碼應該合理使用記憶體,比如強軟弱虛引用的合理使用,自定義記憶體分配,以此來降低記憶體溢位出現的機率。