堆棧溢出和內(nèi)存泄漏的區(qū)別?
棧溢出Java的內(nèi)存結(jié)構(gòu)中,棧的大小不是無限的。大量的方法調(diào)用過程,導致不斷壓棧最終將棧內(nèi)存占滿,產(chǎn)生StackOverflowError錯誤,程序直接終止運行。產(chǎn)生棧溢出的場景:比如不合理(遞歸太深)的遞歸調(diào)用。
內(nèi)存溢出
創(chuàng)建了大量線程、對象,導致垃圾回收器來不及回收,分配的堆內(nèi)存被占滿,產(chǎn)OutOfMemoryError錯誤。產(chǎn)生棧溢出的場景:比如死循環(huán)中創(chuàng)建對象。
內(nèi)存泄漏
當很多對象使用之后已經(jīng)沒有再使用的必要而沒有置為null,導致垃圾回收器無法對其回收,造成內(nèi)存資源的大量浪費,給系統(tǒng)帶來很多不穩(wěn)定因素。