少锁定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,一经查实,立即删除!

相关文章

Java (数组的遍历,for循环的使用)

/*多行注释的快捷键&#xff1a;Ctrlshift/ 快速格式化代码快捷键&#xff1a;Ctrlshiftf 自动导入一个包&#xff1a;Ctrlshifto */ package test_1;public class Day_2 {public static void main(String args[]) {//一个九九乘法表的实现int c 0;for (int a 1; a < 9; a…

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

1.要让PHP支持PostgreSQL&#xff0c;就需要重新编译PHP&#xff1b;./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…

开始学习前端开发吧

据说最好的输入是输出&#xff0c;所以听我讲给你听我学到的东西吧。 学习前端入门时&#xff0c;无论在哪儿都告诉我们&#xff0c;要学习HTML CSS JS。google之&#xff0c;得到html是超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称…

Java 8 Lambda演练

在工作中&#xff0c;我做了关于Java 8项目lambda的演示&#xff0c;当然还有一些简单的代码来说明其中的一些要点。 Java 8的总体原因是&#xff1a; 更简洁的代码&#xff08;适用于只有一种方法和集合的类&#xff09;。 “我们希望代码的读者在到达lambda表达式的“实质”…

虚拟机vmnet0、vmnet1和vmnet8的区别

vmnet0&#xff0c;实际上就是一个虚拟的网桥 vmnet0&#xff0c;实际上就是一个虚拟的网桥&#xff0c;这个网桥有很若干个端口&#xff0c;一个端口用于连接你的Host&#xff0c;一个端口用于连接你的虚拟机&#xff0c;他们的位置是对等的&#xff0c;谁也不是谁的网关。所以…

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进程及…

OpenHFT Java Lang项目

OpenHFT / Java Lang从Apache 2.0库开始&#xff0c;提供Java Chronicle使用的低级功能&#xff0c;而无需持久存储到文件中。 这允许对数据进行可序列化和反序列化&#xff0c;以及对本机空间&#xff08;堆外&#xff09;中的内存的随机访问。它支持使用对象池写入和读取可枚…

spring cloud-spring boot 文档信息

官网&#xff1a; spring boot springcloud 学习资源 使用IDEA创建SpringBoot项目 Spring Boot教程 https://blog.csdn.net/forezp/article/details/70341818 Spring Cloud教程 http://blog.csdn.net/forezp/article/details/70148833 Spring Cloud教程 http://blog.csdn.net…

python基础学习笔记(十三)

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

OD debug matlab,OllyDebug基本使用方法

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

设计模式:策略

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

css 学习整理

1、 background-attachment :fixed 属性防止背景图片这种滚动&#xff0c;它默认值是 scroll&#xff0c;也就是说&#xff0c;在默认的情况下&#xff0c;背景会随文档滚动2、font-weight 属性设置文本的粗细&#xff08;关键字 100 ~ 900 为字体指定了 9 级加粗度。如果一个字…

php抓取网页中的内容

以下就是几种常用的用php抓取网页中的内容的方法。1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g…

本地搭建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…

php中的thumb函数,phpcms v9 thumb(缩略图) 函数说明

打开phcmsc/libs/functions/global.func.PHP文件&#xff0c;找到如下代码&#xff1a;$width_t || $height>$height_t) return $imgurl;$newimgurl dirname($imgurl_replace)./thumb_.$width._.$height._.basename($imgurl_replace);if(file_exists($upload_path.$newimgu…

CSS3 选择器——属性选择器

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

设计模式:生成器

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

Hadoop(5)--java编写hdfs程序

1、hdfs系统会把用到的数据存储在core-site.xml中由hadoop.tmp.dir指定&#xff0c;而这个值默认位于/tmp/hadoop-${user.name}下面&#xff0c; 由于/tmp目录在系统重启时候会被删除&#xff0c;所以应该修改目录位置。 修改core-site.xml(在所有站点上都修改) <property&g…

oracle10g服务安装图解,Oracle 10G服务器安装图解

Oracle 10G服务器安装图解Oracle 10g 在window 下的安装概述1.数据库概述Oracle 应用服务器 10g 是集成的、基于标准的软件平台&#xff0c;Oracle Application Server 10g 是继 Oracle9i Application Server (Oracle9iAS) Release 2.0 version 9.0.2 和 version 9.0.3 之后的最…