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