网站建设需要哪些人,销售型网站建设基本要素,企业管理网站建设,创网科技有限公司怎么样java 对象锁定自从我写任何东西以来已经有一段时间了#xff0c;我一直在忙于我的新工作#xff0c;其中涉及在性能调优方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。 尽管Java随着时间的推移已改进了GC算法#xff0c;但垃圾回收打ic一直是Java的主… java 对象锁定 自从我写任何东西以来已经有一段时间了我一直在忙于我的新工作其中涉及在性能调优方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。 尽管Java随着时间的推移已改进了GC算法但垃圾回收打ic一直是Java的主要难题。 Azul是开发无暂停GC的市场领导者但Azul JVM并非免费 创建过多的临时/垃圾对象并不能很好地工作因为它为GC创建了工作并且将对延迟产生负面影响。 过多的垃圾也不能在多核系统上正常工作因为它会导致缓存污染。 那么我们应该如何解决呢 垃圾少编码 仅当您知道需要多少个对象并预先分配它们时这才有可能但是实际上很难找到。 但是即使您成功做到了也必须担心另一个问题 您可能没有足够的内存来容纳所需的所有对象 您还必须处理并发 那么上述问题的解决方案是什么 有一种对象池设计模式可以解决以上两个问题。 它使您可以指定池中所需的许多对象并处理并发请求以服务所请求的对象。 对象池一直是许多具有低延迟要求的应用程序的基础。 Flyweight设计模式是对象池的一种风格。 上面的两种模式都将帮助我们避免创建对象。 太好了因此现在减少了GC工作并且理论上我们的应用程序性能应该得到改善。 实际上不会那样做因为对象池/ Flyweight必须处理并发并且由于并发问题而失去了避免对象创建而获得的任何优势。 处理并发的最常见方法是什么 对象池是一个典型的生产者/消费者问题可以使用以下技术来解决 同步这是在JDK 1.5之前处理并发的唯一方法。 Apache编写了一个基于同步的出色的对象池 API 锁 Java在JDK 1.5之后增加了对并发编程的出色支持。 已经有一些使用锁来开发对象池的工作例如 furious-objectpool 无锁我找不到使用完全无锁技术构建的任何实现但是furious-objectpool使用ArrayBlocking队列和ConcurrentLinked队列的混合 衡量绩效 在此测试中我创建了一个包含100万个对象的池并且这些对象可以通过不同的池实现进行访问这些对象将从池中取出并返回到池中。 该测试首先从1个线程开始然后增加线程数以衡量不同池在争用情况下的执行情况 X轴–螺纹数 Y轴–以毫秒为单位的时间–越短的时间越好 该测试包括来自Apache的池Furious池和基于ArrayBlocking的池 Apache的性能最差并且随着线程数量的增加性能会进一步下降。 原因是Apache池基于大量使用“同步” 其他两个基于Furious和ArrayBlocking的池的性能更好但是随着争用的增加它们两者的速度也会降低。 当12个线程试图访问该池时基于ArrayBlocking队列的池对于100万个项目大约需要1000毫秒。 内部使用Arrayblocking队列的愤怒池大约需要1975 ms。 我必须进行更详细的调查以找出为什么Furious花费双倍的时间因为它也是基于ArrayBlocking队列的。 数组阻塞队列的性能不错但这是一种基于锁定的方法。 如果可以实现无锁池我们将获得哪种类型的性能 锁免费游泳池 实现无锁池不是不可能的但是有点困难因为您必须处理多个生产者和消费者。 我将实现一个混合池该池将在生产者端使用锁定而在消费者端使用非阻塞技术。 让我们看一些数字 我使用新的实现FastPool进行了相同的测试它比ArayBlocking队列快了30。 30的改善还不错它绝对可以帮助我们实现延迟目标。 是什么让快速池快速 我使用了两种技术来使其快速运行 生产者是基于锁的–使用锁来管理多个生产者这与“数组阻止”队列相同因此没什么大不了的。 立即发布已发布项目–在使用便宜的内存屏障释放锁之前它会发布元素。 这会有所收获 消费者不受阻碍–使用CAS来实现这一目标消费者永远不会因生产者而受到阻碍。 数组阻止队列阻止使用者因为它对生产者和使用者使用相同的锁 线程局部以保持值的局部性–线程局部用于获取最后使用的值这在很大程度上减少了争用。 如果您有兴趣查看代码则可以使用 FastObjectPool.java 参考来自Are you ready博客的JCG合作伙伴 Ashkrit Sharma的Lockless Java Object Pool 。 翻译自: https://www.javacodegeeks.com/2013/07/lock-less-java-object-pool.htmljava 对象锁定