1. 程式人生 > >hashCode竟然不是根據物件記憶體地址生成的?還對記憶體洩漏與偏向鎖有影響?

hashCode竟然不是根據物件記憶體地址生成的?還對記憶體洩漏與偏向鎖有影響?

## 起因 起因是群裡的一位童鞋突然問了這麼問題: > 如果重寫 equals 不重寫 hashcode 會有什麼影響? 這個問題從上午10:45 開始陸續討論,到下午15:39 接近尾聲 (忽略這形同虛設的馬賽克) ![](https://img2020.cnblogs.com/other/1583165/202008/1583165-20200805085600528-1292307269.jpg) 這是一個好問題,更是一個高頻基礎面試題,我還曾經專門寫過一篇文章 [Java equals 和 hashCode 的這幾個問題可以說明白嗎](https://dayarch.top/p/java-equals-hashcode.html), 主要說明了以下內容 隨著討論的進行,問題慢慢集中在記憶體溢位和記憶體洩漏的問題上 ## 記憶體溢位 VS 記憶體洩漏 這兩個詞在中文解釋上有些相似,至少給我的第一感覺,他們的差別是這樣的(有人和我一樣嗎?) ![](https://img2020.cnblogs.com/other/1583165/202008/1583165-20200805085603874-1231465510.png) 記憶體溢位:Out of Memory (OOM) ,這個大家都很熟悉了,理解起來也很簡單,就是記憶體不夠用了(啤酒【物件】太多,杯子【記憶體】裝不下了) > 那啥是記憶體洩漏呢? 記憶體洩漏:**Memory Leak** 特意查了一下 Leak 的字典含義,解釋1的直白翻譯是【通常是由於`錯誤`或`失誤`,從一個`開口` `進入`或逃脫】 ![](https://img2020.cnblogs.com/other/1583165/202008/1583165-20200805085604973-982216407.png) 所以程式中的記憶體洩漏我的理解更多是:由於程式的編寫錯誤暴漏出一些 **開口**,導致一些物件**進入**這寫開口,最終**導致相關問題**,進一步說白了,程式有漏洞,不當的呼叫就會出問題 所以接下來我們主要來看看 Java 記憶體洩漏,以及問題的起因 hashCode 和記憶體洩漏到底有哪些關係 ## 記憶體洩漏 咱也是一個有身份證的人,不能總講大白話,相對官方的記憶體洩漏解釋是這樣滴: > 記憶體洩漏說明的是這樣一種情況:堆中存在一些不再使用的物件,但垃圾收集器無法將它們從記憶體中刪除(垃圾收集器定期刪除未引用的物件,但從不收集仍在引用的物件),因此對它們進行了不必要的維護 這句話略顯抽象,一張圖你就能明白 ![](https://img2020.cnblogs.com/other/1583165/202008/1583165-20200805085607366-1796928736.png) 如果有用的、但垃圾收集器又不能刪除的物件增多,就像下圖這樣,那麼就會逐漸導致記憶體溢位(OOM)了 ![](https://img2020.cnblogs.com/other/1583165/202008/1583165-20200805085609834-1102570003.png) 所以也可以總結為,OOM 的原因之一可能是記憶體洩漏導致的 ### 記憶體洩漏會帶來哪些問題 記憶體洩漏,會導致真正可用記憶體變少,在沒達到 OOM 的這個過程中,就會出現奇奇怪怪的問題 1. 當應用程式長時間連續執行時,效能會嚴重下降,畢竟可用記憶體變小 3. 自發的和奇怪的應用程式崩潰 4. 應用程式偶爾會耗盡連線物件(這個經常聽說吧) 4. 最終的結果是 OOM **所以也可以反過來推理,如果發生上述問題,有可能程式的某些地方發生了記憶體洩漏** > 那常見的哪些情形可能會引起記憶體洩漏呢?又有哪些解決辦法呢? ## 會引起記憶體洩漏的常見情形與相應解決辦法 ### 靜態成員變數的亂用 直接來看一個例子 ```java @Slf4j public class StaticTest { public sta