java 產生一個Java的記憶體洩露

Coding-lover發表於2015-10-20

我有過一個面試,被問到如何產生一個Java記憶體洩露。不用說,我感到相當傻,甚至如何產生一個的線索都沒有。

那麼怎麼才能產生一個記憶體洩露呢?

解決方案

在純Java中,有一個很好的方式可以產生真正的記憶體洩露(通過執行程式碼使物件不可訪問但仍存在於記憶體中):

  1. 應用產生一個長時間執行的執行緒(或者使用一個執行緒池加速洩露)。
  2. 執行緒通過一個(可選的自定義)類載入器載入一個類。
  3. 該類分配大記憶體(例如,new byte[1000000]),賦值給一個強引用儲存在靜態欄位中,再將它自身的引用儲存到ThreadLocal中。分配額外的記憶體是可選的(洩露類例項就夠了),但是這樣將加速洩露工作。
  4. 執行緒清除所有自定義類的或者類載入器載入的引用。
  5. 重複上面步驟。

這樣是有效的,因為ThreadLocal持有物件的引用,物件持有類的引用,接著類持有類載入器的引用。反過來,類載入器持有所有已載入類的引用。這會使洩露變得更加嚴重,因為很多JVM實現的類和類載入都直接從持久帶(permgen)分配記憶體,因而不會被GC回收。

轉載自:產生一個Java的記憶體洩露

相關文章