我正在編寫一個編解碼器來處理使用定製的有線協議通過TCP發送的消息。在解碼過程中,我創建了一些String
s,BigDecimal
s和日期。客戶端 - 服務器的訪問模式意味着它是很常見的客戶端發出請求,然後解碼上千響應消息,這會導致大量的重複String
S,BigDecimal
S等使用PermGen空間或roll-my-own實習生方法?
所以我創建了一個InternPool<T>
類,允許我實習每一類對象。在內部,池使用WeakHashMap<T, WeakReference<T>>
。例如:
InternPool<BigDecimal> pool = new InternPool<BigDecimal>();
...
// Read BigDecimal from in buffer and then intern.
BigDecimal quantity = pool.intern(readBigDecimal(in));
我的問題:我使用InternPool
爲BigDecimal
但我應該還可以考慮使用它String
,而不是String
的intern()
方法,我相信使用的PermGen空間?使用PermGen空間的優點是什麼?
@kts:如果我將byte []映射到BigDecimal,那麼一旦Intern池創建/返回了BigDecimal,byte []將不會被任何內容引用。假設byte []是底層WeakHashMap中的鍵,這將導致該條目被刪除,儘管正在使用相應的BigDecimal。 – Adamski 2010-05-19 12:32:14
WeakReference適合這個,還是應該使用'SoftReference'? GC的行爲不同,這聽起來像你試圖創建一種緩存;弱引用不適合用於此目的。看到我的答案在這裏,爲什麼一些原因:http://stackoverflow.com/questions/2861410/weakhashmap-iteration-and-garbage-collection/2862174#2862174 – 2010-05-19 14:58:57
@Adamski我會只使用BigDecimal SoftReference和ReferenceQueue一旦BigDecimal入隊,從地圖中刪除'byte []'s。 (可能需要BiMap)。這可以避免構建冗餘的BigDecimal對象,從而節省內存/ gc運行時和執行時間(只需構造一次)。 – KitsuneYMG 2010-05-19 15:11:50