1. 程式人生 > >工作中遇到的java記憶體溢位異常(OutOfMemoryError)和棧溢位異常(StackOverflowError)

工作中遇到的java記憶體溢位異常(OutOfMemoryError)和棧溢位異常(StackOverflowError)

1.棧溢位異常(StackOverflowError)     形成原因:  死迴圈呼叫方法。        前幾天提了關於棧溢位的一個故障單。微服務A請求微服務B資源的一個方法變成了懶載入,懶載入方法中判斷當資源為空時就向微服務C請求資源,請求得到資源後,先快取,再通微服務A去更新資料庫{更新表結構時候還會向微服務B請求資源},然後再返回資源,當資源不為空時,則直接返回資源。但是當資源微服務A一直沒有匯入資源,上述過程就會形成一個環形結構,最後堆疊空間用完,造成棧溢位異常(StackOverflowError)。    解決方法:通知微服務之前加個判斷:資源為空時則不通知。2.記憶體溢位異常(OutOfMemoryError)    形成原因:        資源物件都快取在單粒類物件中,客戶端請求時需要做一些處理,所以處理之前要clone一下,由於物件層次太深,有一個深層次物件List<String> attribute 屬性沒有clone,而這個屬性在客戶端的每次請求中都會將list的符合條件的內容字串用“+”連線,再放入List,請求一定次數後最後導致List的大小大約達到了2M,最終導致了記憶體溢位(OutOfMemoryError)解決方法:徹底的深度clone。