少锁定Java对象池

自从我写任何东西以来已经有一段时间了,我一直在忙于我的新工作,该工作涉及在性能调整方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。

尽管Java随着时间的推移改进了GC算法,但垃圾回收打h一直是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.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php数据库postgresql,PHP 操作 PostgreSQL数据库

1.要让PHP支持PostgreSQL,就需要重新编译PHP;./configure --prefix/usr/local/php5 --with-apxs2/usr/local/apache2/bin/apxs --with-mysql/usr/local/mysql --with-config-file-path/usr/local/php5 --with-zlib --enable-mbstringall --with-mysql…

uestc summer training #2

A 增广 #include<bits/stdc.h> using namespace std; const int MAXN 1000000 10; vector<int> g[MAXN]; int a[MAXN], b[MAXN], sz[MAXN], cnt[MAXN]; bool mg[MAXN], vis[MAXN]; int n, m; bool dfs(int u, int f -1) {if (g[u].empty()) //如果当前数没有位…

mysql有实例名这个概念,MySQL的一些概念笔记

1.MySQL Server、MySQL实例、MySQL数据库MySQL数据库指的是实际存在的物理操作系统文件的集合&#xff0c;也可以指逻辑数据的集合。为了访问、处理数据&#xff0c;我们需要一个数据库管理系统&#xff0c;也就是MySQL Server(也称为MySQL服务器)。MySQL实例指的是MySQL进程及…

python基础学习笔记(十三)

re模块包含对 正则表达式。本章会对re模块主要特征和正则表达式进行介绍。 什么是正则表达式 正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串&#xff0c;可以匹配其自身。换包话说&#xff0c;正则表达式’python’ 可以匹配字符串’python’ 。你可以…

OD debug matlab,OllyDebug基本使用方法

OD是逆向过程中最好的动态调试工具&#xff0c;这次来记录学习笔记。(特别鸣谢石总)1、OD的工作界面最开始要学的就是界面的使用N了吧&#xff0c;这里分各个框来解释下&#xff1a;列举各个框用处&#xff1a;可以看到下面一框框东西&#xff1a;这些一时半会用不到&#xff0…

设计模式:策略

这次我想谈谈策略设计模式 。 通过这种方式&#xff0c;我开始撰写有关行为设计模式的文章。 这些模式表示对象之间的某些交互模式&#xff0c;以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的的实现时&#xff0c;应使用…

本地搭建WordPress (XAMPP环境)

1&#xff0c;XAMPP是一个流行的PHP开发环境&#xff0c;官网下载&#xff1a; https://www.apachefriends.org/zh_cn/index.html 然后安装。 官方介绍&#xff1a;XAMPP是最流行的PHP开发环境 XAMPP是完全免费且易于安装的Apache发行版&#xff0c;其中包含MariaDB、PHP和Pe…

CSS3 选择器——属性选择器

上一节在《CSS3选择器——基本选择器》中主要介绍了CSS3选择器的第一部分&#xff0c;这节主要和大家一起来学习CSS3选择器的第二部分——属性选择器。属性选择器早在CSS2中就被引入了&#xff0c;其主要作用就是对带有指定属性的HTML 元素设置样式。使用CSS3属性选择器&#x…

设计模式:生成器

有时需要在应用程序中创建一个复杂的对象。 一种解决方案是Factory模式&#xff0c;另一种是Builder设计模式。 在某些情况下&#xff0c;您甚至可以结合使用这两种模式。 但是在本文中&#xff0c;我想研究一下Builder设计模式 。 我需要说的第一件事是创造模式。 在什么情况…

css平行四边形与菱形变换

*以下技巧均源自于Lea Verou所著《CSS Secrets》 平行四边形 平行四边形的构造可以基于矩形通过skew()的变形属性进行斜向拉升得到&#xff08;skew所用的坐标系&#xff0c;纵向是X轴&#xff0c;横向是Y轴&#xff0c;与常见的坐标系相反&#xff09;。 <!DOCTYPE html&g…

设计模式:原型

创新设计模式之一是原型设计模式 。 尽管原型是创造模式&#xff0c;但它在概念上与其他模式有所不同。 我的意思是原型在某种意义上创造了自己。 我将在下面解释。 原型模式的所有魔力都基于Java Object的clone&#xff08;&#xff09;方法。 因此&#xff0c;让我们考虑一…

SecureCRT连接AWS EC2云主机密码登录

申请了亚马逊的EC2&#xff0c;要通过ssh 加密钥的形式登录&#xff0c;特别麻烦&#xff0c;而且感觉ssh登录AWS的云主机后好卡&#xff0c;这里是更改成用户名和密码的形式登录云主机&#xff0c;可以通过SecureCRT直接登录 1、首先通过ssh登录到EC2&#xff0c;类似于ssh -i…

母版页

一、母版页简介 使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页&#xff08;或一组页&#xff09;定义所需的外观和标准行为。 母版之所以称为母版&#xff0c;就是将大部分网页上固定内容&#xff0c;比如导航栏&#xff0c;版…

openLayers 4 canvas图例绘制,canvas循环添加图片,解决图片闪烁问题

一、问题来源&#xff1a; 接触Openlayers 一段时间了&#xff0c;最近做了一个农业产业系统&#xff0c;项目中涉及到产业图例&#xff0c;最后考虑用canvas来绘制图例图像。当中带图片的图例移动时&#xff0c;图片会实现闪烁留白情况。闪烁是因为绘制图片本身的复杂性&#…

Java DB嵌入式模式

Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 Java DB有两个部署选项&#xff1a; Embedded和Network Server 。 这篇文章是关于嵌入式部署或模式的。 1.嵌入式 在嵌入式模式下&…

清除浮动方法解析

清除浮动方法解析 清除浮动带来的额外影响 如果对于浮动不熟悉的同学&#xff0c;可以看看介绍float的文章。传送门&#xff1a;CSS float 我们知道&#xff0c;在一个父元素内如果遇到某个浮动元素&#xff0c;此时父元素的高度会发生塌陷。针对父元素高度塌陷的问题&#xff…

进程间的通信----管道

前提&#xff1a;本文是基于Linux系统下的学习 用户态的进程是如何组织的呢&#xff1f;所有的用户态进构成了一棵树。进程树。 进程树的树根是init.也就是1号进程。是用户态进程的祖宗进程。如何查看进程树&#xff1f;pstree 进程之间的关系 父子进程和兄弟进程查看进程的信息…

web项目启动时,自动执行代码的几种方式

在项目开发过程中&#xff0c;往往需要一些功能随着项目启动而优先启动&#xff0c;下面我总结几种方式&#xff08;非spring boot&#xff09; spring boot的参考 spring boot 学习之路9 (项目启动后就执行特定方法) 方式一&#xff1a; ServletContextListener监听器&#…

设计模式:状态

本文将介绍状态设计模式 。 它是行为设计模式之一 。 您无需了解许多理论即可了解模式的主要概念。 该文章将分为几个部分&#xff0c;在其中我将提供有关需要应用该模式的情况&#xff0c;它所具有的利弊以及用法示例的信息。 有时&#xff0c;当对象的内部状态更改时&#…

[UWP]了解模板化控件(9):UI指南

[UWP]了解模板化控件(9)&#xff1a;UI指南 原文:[UWP]了解模板化控件(9)&#xff1a;UI指南1. 使用TemplateSettings统一外观 TemplateSettings提供一组只读属性&#xff0c;用于在新建ControlTemplate时使用这些约定的属性。 譬如&#xff0c;修改HeaderedContentControl的Co…