我想知道爲什麼Spring 4+中的SimpleKeyGenerator不只是返回一個表示方法參數散列的Integer?由於返回的SimpleKey存儲了實際的方法參數,這導致了我的Web應用程序中過多的內存使用和垃圾收集,每兩天左右就會導致整個事件下降。 (其中一些參數是相當大的字符串集合。)之後我不得不恢復到我自己的KeyGenerator實現,這基本上是我在別處看到的代碼混雜體。爲什麼Spring 4的SimpleKey對象存儲方法參數?
我使用EhCache 2.9作爲緩存實現。
我想知道爲什麼Spring 4+中的SimpleKeyGenerator不只是返回一個表示方法參數散列的Integer?由於返回的SimpleKey存儲了實際的方法參數,這導致了我的Web應用程序中過多的內存使用和垃圾收集,每兩天左右就會導致整個事件下降。 (其中一些參數是相當大的字符串集合。)之後我不得不恢復到我自己的KeyGenerator實現,這基本上是我在別處看到的代碼混雜體。爲什麼Spring 4的SimpleKey對象存儲方法參數?
我使用EhCache 2.9作爲緩存實現。
從SimpleKeyGenerator
API文檔:
不同於
DefaultKeyGenerator
,沒有衝突將與由此類生成的密鑰發生。
如果SimpleKey
只會存儲哈希代碼,而不是實際的參數本身,這可能無法得到保證。哈希碼不是唯一的關鍵字,您可以擁有不同的對象(或本例中的參數組合),它們具有相同的哈希碼(實際上,這是不可避免的,因爲存在比可能的哈希碼更多的可能對象 - 請參閱pigeonhole principle )。
換句話說,如果沒有存儲參數本身,方法SimpleKey
不能正確實現 - 它需要調用所有參數的equals()
方法,而不僅僅是比較哈希碼。
另請參閱DefaultKeyGenerator
的API文檔 - 確實KeyGenerator
的實現僅存儲哈希代碼,並且由於可能發生衝突而導致不正確的行爲,因此不推薦使用。
如果這會導致內存使用率過高問題,請對緩存進行不同的配置,使其不會變得過大,或者確保不會將大對象傳遞到SimpleKeyGenerator
以生成密鑰。
感謝您的回覆!對於我的應用程序來說,無碰撞保證的內存使用要求是不值得的。如果沒有100%的保證,我認爲DefaultkeyGenerator可能已經被改進,使得碰撞機率更小。 –