我正在编写一个编解码器,以处理使用定制线路协议(protocol)通过TCP发送的消息。在解码过程中,我创建了许多String
,BigDecimal
和日期。客户端-服务器访问模式意味着客户端发出请求然后解码成千上万的响应消息是很常见的,这会导致大量重复 String
,BigDecimal
等。
因此,我创建了一个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空间有什么优势? 最佳答案
JVM的String.intern()
池可能会更快。 AFAIK,它是用 native 代码实现的,因此,与使用WeakHashMap
和WeakReference
实现的池相比,它应该更快并且使用更少的空间。您需要做一些仔细的基准测试以确认这一点。
但是,除非您有大量的长期重复对象,否则我怀疑(在permGen中还是在您自己的池中)进行实习会产生很大的不同。而且,如果唯一对象与重复对象的比率太低,则实习将只会增加 Activity 对象的数量(使GC花费更长的时间),并且由于实习的开销而降低性能,依此类推。因此,我也主张对“实习生”与“无实习生”方法进行基准测试。