只針對JAVA來說
記憶體洩露本意是申請的記憶體空間沒有被正確釋放,導致後續程式裡這塊記憶體被永遠佔用(不可達),而且指向這塊記憶體空間的指標不再存在時,這塊記憶體也就永遠不可達了,記憶體空間就這麼一點點被蠶食,借用別人的比喻就是:比如有10張紙,本來一人一張,畫完自己擦了還回去,別人可以繼續畫,現在有個壞蛋要了紙不擦不還,然後還跑了找不到人了,如此就只剩下9張紙給別人用了,這樣的人多起來後,最後大家一張紙都沒有了。
記憶體溢位是指儲存的資料超出了指定空間的大小,這時資料就會越界,舉例來說,常見的溢位,是指在棧空間裡,分配了超過陣列長度的資料,導致多出來的資料覆蓋了棧空間其他位置的資料,這種情況發生時,可能會導致程式出現各種難排查的異常行為,或是被有心人利用,修改特定位置的變數資料達到溢位攻擊的目的。而Java中的記憶體溢位,一般指【OOM:發生位置】這種Error,它更像是一種記憶體空間不足時發生的錯誤,並且也不會導致溢位攻擊這種問題,舉例來說,堆裡能存10個數,分了11個數進去,堆就溢位了1個數,JVM會檢測、避免、報告這種問題,所以雖然實際上JVM規避了記憶體溢位帶來的問題,但在概念上來說,它確實是溢位才導致的,只是Java程式設計師在看到這個問題時,腦袋裡的反應會是“記憶體不夠了,咋回事,是不是又是哪個大物件沒釋放”之類,而不是像C程式設計師“我X被攻擊了/程式咋寫的搞溢位了”(這段是我臆想的)。同時對於Java來說,傳統意義的溢位攻擊也無法奏效,因為Java的陣列會檢查下標,對超出陣列下標的賦值會報ArrayOutOfIndex錯誤。
而記憶體洩露的話,個人意見在Java裡是不存在的,gc採用根搜尋演算法時,不可達的物件會被回收,gc是會搜尋回收這些空間的,由於程式設計師個人問題,沒用的物件不回收但可達,這種情況能不能界定為記憶體洩露,我覺得是個哲學問題(物件可達,但空間被佔用了,物件也不再使用了),個人覺得是不能界定為記憶體洩露的。
答完,個人水平有限,如果有錯漏希望大家隨意指正指教,多謝
只針對JAVA來說
記憶體洩露本意是申請的記憶體空間沒有被正確釋放,導致後續程式裡這塊記憶體被永遠佔用(不可達),而且指向這塊記憶體空間的指標不再存在時,這塊記憶體也就永遠不可達了,記憶體空間就這麼一點點被蠶食,借用別人的比喻就是:比如有10張紙,本來一人一張,畫完自己擦了還回去,別人可以繼續畫,現在有個壞蛋要了紙不擦不還,然後還跑了找不到人了,如此就只剩下9張紙給別人用了,這樣的人多起來後,最後大家一張紙都沒有了。
記憶體溢位是指儲存的資料超出了指定空間的大小,這時資料就會越界,舉例來說,常見的溢位,是指在棧空間裡,分配了超過陣列長度的資料,導致多出來的資料覆蓋了棧空間其他位置的資料,這種情況發生時,可能會導致程式出現各種難排查的異常行為,或是被有心人利用,修改特定位置的變數資料達到溢位攻擊的目的。而Java中的記憶體溢位,一般指【OOM:發生位置】這種Error,它更像是一種記憶體空間不足時發生的錯誤,並且也不會導致溢位攻擊這種問題,舉例來說,堆裡能存10個數,分了11個數進去,堆就溢位了1個數,JVM會檢測、避免、報告這種問題,所以雖然實際上JVM規避了記憶體溢位帶來的問題,但在概念上來說,它確實是溢位才導致的,只是Java程式設計師在看到這個問題時,腦袋裡的反應會是“記憶體不夠了,咋回事,是不是又是哪個大物件沒釋放”之類,而不是像C程式設計師“我X被攻擊了/程式咋寫的搞溢位了”(這段是我臆想的)。同時對於Java來說,傳統意義的溢位攻擊也無法奏效,因為Java的陣列會檢查下標,對超出陣列下標的賦值會報ArrayOutOfIndex錯誤。
而記憶體洩露的話,個人意見在Java裡是不存在的,gc採用根搜尋演算法時,不可達的物件會被回收,gc是會搜尋回收這些空間的,由於程式設計師個人問題,沒用的物件不回收但可達,這種情況能不能界定為記憶體洩露,我覺得是個哲學問題(物件可達,但空間被佔用了,物件也不再使用了),個人覺得是不能界定為記憶體洩露的。
答完,個人水平有限,如果有錯漏希望大家隨意指正指教,多謝