使用Java构建高伸缩性组件
2009-12-21 00:00:00 来源:WEB开发网核心提示: 我们做了一次基准测试来比较ConcurrentLinkedQueue(JSR166y)和Mos-Queue的性能,结果在图3中显示,使用Java构建高伸缩性组件(6),对于大量线程来说,Mos-Queue的性能优于JDK ConcurrentLinkedQueue,一般来说,这些原则通常很有帮助
我们做了一次基准测试来比较ConcurrentLinkedQueue(JSR166y)和Mos-Queue的性能。结果在图3中显示。对于大量线程来说,Mos-Queue的性能优于JDK ConcurrentLinkedQueue。
图3. 性能比较:ConcurrentLinkedQueue和Mos-Queue
更多有关Mos-Queue的信息参见Mozes和Shavit的论文《An Optimistic Approach to Lock-Free FIFO Queues》。
减少内存分配
Java虚拟机拥有一套强大、有效的内存管理体系。垃圾回收器能够压缩现有对象,以确保在垃圾回收之后Java堆里没有空隙。因为空闲空间在垃圾回收之后都是连续的,所以内存分配不多是增加了一个指针而已。
这对多线程应用同样有效,如果内存使用不敏感的话。JVM为每一个线程分配了一个线程范围的缓存。在内存分配时,线程范围的缓存首先被使用。只有在线程范围的缓存被耗尽之后才会使用全局堆。
在线程范围内分配内存对应用性能非常有益,但是如果分配过于频繁,则会不起作用。根据我们的经验,线程范围的缓存在分配频率高的情况下会很快耗尽。
如果在循环中需要暂时性的对象,则线程范围的类会比较有益。如果我们在线程本地对象中存储临时对象,我们可以在每一次循环迭代中重用它。虽然,线程本地类会增加额外的负担,但是大多数时候都比在内存中频繁分配内存要好。
图 4.性能比较:线程本地和分配
结论
在本文中,我们介绍了使用Java创建高扩展性组件的几个重要原则。一般来说,这些原则通常很有帮助,但是它们无法替代谨慎的测试和性能调优。
[]
赞助商链接