ConcurrentHashMap和oscache等对象缓存有何区别

10-03-26 liujian1979
    

最近我做了个测试,测试结果如下:

在IBM笔记本T61下测试

启5个线程往Hashtable和ConcurrentHashMap里面写数据。每个线程并发随机写100,000个数据到Hashtable和ConcurrentHashMap里(键值是Integer),上一过程完成之后启5个线程并发随机从Hashtable和ConcurrentHashMap里(键值是Integer)读数据,每个线程读100,000条。

这一过程十次测试平均时间如下:

The average time(Run 10times) of ConcurrentHashMap is :690ms

The average time(Run 10times) of Hashtable is :834ms

结论:ConcurrentHashMap比Hashtable性能优化20.8%。

等存入过程完成之后,启100个线程并发随机从Hashtable和ConcurrentHashMap里(键值是Integer)读数据,每个线程读100,000条。

这一过程十次测试平均时间如下:

The average time(Run 10times) of concurrentHashMap is :2721

The average time(Run 10times) of Hashtable is :5870

结论:ConcurrentHashMap比Hashtable性能优化115.7%。

与大家分享下

疑问:

我理解的也可以把数据库中表以对象形式存入ConcurrentHashMap中可以看作是对象缓存吗?,那oscache等开源高速缓存只在分布式上有优势吗?比如几个JVM共用一个缓存? 请帮我解释下,谢谢!

    

banq
2010-03-26 14:47

ConXXMap是JDK的API,OSCAHE都是基于Map做的缓存。

缓存如果需要分布式,有很多文章要做,oscache没有ehcache快,有过测试,下面是两个分布式缓存比较:

缓存: Memcached和terracotta

xmuzyu
2010-03-26 22:08

2010年03月26日 11:45 "liujian1979"的内容
我理解的也可以把数据库中表以对象形式存入ConcurrentHashMap中可以看作是对象缓存吗?,那oscache等开源高速缓存只在分布式上有优势吗?比如几个JVM共用一个缓存? 请帮我解释下,谢谢! ...

缓存的实现会采用类似Map的结构,但是缓存要复杂的多。比如memcached以及其它的一些分布式系统会涉及到consistent hash,同时缓存的内部实现也会用到java中的Softreference,因为软引用只有在内存不够的时候,垃圾收集器才会回收,因此GC得时候,会首先清楚没有强引用的对象,至于软引用对象,要等回收完无强引用对象后内存还不够的情况下,才会回收,这样使得缓存对象的在内存待得尽量长久点,尽量增加命中率。