java uuid 效率_java uuid第一次性能

在java中产生uuid的方式是使用java.util.UUID。

UUID.randomUUID().toString();

我在测试redis性能时,使用uuid产生测试数据,发现多线程测试redis的rpush接口的时候,性能老是上不去。 查看cpu利用率也不高,网卡流量也不大。就是tps上不去。但是如果用两台client去测,又可以达到更高的tps。

后来直接用jstack查看了下堆栈,发现大多数线程停留在:

java.lang.Thread.State: BLOCKED (on object monitor)

at java.security.SecureRandom.nextBytes(Unknown Source)

- waiting to lock <0x00000005ffe1c548> (a java.security.SecureRandom)

at java.util.UUID.randomUUID(Unknown Source)

原来uuid的生成遇到了性能瓶颈。于是我单独测试了下生成随机uuid的性能,发现无论是1个线程还是32个线程还是300个线程,它的tps只能到10万级别。 甚至是线程数越大,tps越低。tps在每个机器上都不一样,有的机器上测试tps只有5万。我们就以一台双核4G内存的虚拟机为例:

tps在 140000+

我们看randomUUID方法的javadoc的描述是: The UUID is generated using a cryptographically strong pseudo random number generator 也就是说uuid使用了一个强随机数,也也保证了uuid的不重复性。

public static UUID randomUUID() {

SecureRandom ng=numberGenerator;

if(ng == null)

numberGenerator=ng=new SecureRandom();

byte[] randomBytes=new byte[16];

ng.nextBytes(randomBytes);

return new UUID(randomBytes);

}

再看SecureRandom的javadoc Note: Depending on the implementation, the generateSeed and nextBytes methods may block as entropy is being gathered, for example, if they need to read from /dev/random on various unix-like operating systems.

也就是说SecureRandom的nextBytes方法,依赖随机数的产生,如果随机数不够了,它有可能就会堵塞在那边。 比如随机数的产生是读取unix类系统的/dev/random文件。

我们再去看有关/dev/random的信息:

Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random。他们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了。

这就是为什么会有/dev/urandom和/dev/random这两种不同的文件,后者在不能产生新的随机数时会阻塞程序,而前者不会(ublock),当然产生的随机数效果就不太好了,这对加密解密这样的应用来说就不是一种很好的选择。/dev/random会阻塞当前的程序,直到根据熵池产生新的随机字节之后才返回,所以使用/dev/random比使用/dev/urandom产生大量随机数的速度要慢。

jdk默认的是读取/dev/random文件产生强随机数,但是如果不是为了产生加密随机数,我们可以设置jdk读取/dev/urandom产生随机数,从而生成随机uuid。

在java启动项中增加-Djava.security.egd=file:/dev/./urandom 配置项(不能写作/dev/urandom,关于这个,网上有相关八卦历史~)

再去相同的机器上测试uuid的性能:

tps在 720000+

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

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

相关文章

第八周----补

这一周真不知道过得是什么&#xff0c;除了上课&#xff0c;感觉相当的混乱。 整个人每天都是处在消沉状态&#xff0c;连这次作业都没能很好的补上。 我的心情也像天气一样变得不稳定&#xff0c;一会晴天一会雨天的&#xff0c;更多的就是闷闷的感觉。 总会说事情很多忙的头晕…

SpringBoot:application.properties基本的参数配置

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

java method 注释_Java注解

Java注解注解概述3、注解3.1、注解&#xff0c;或者叫做注释类型&#xff0c;英文单词是&#xff1a;Annotation疑问&#xff1a;注解到底是干啥的&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;3.2、注解Ann…

盘点八个程序员必备的代码编辑器

一个好的代码编辑器不仅能使代码变得更美观&#xff0c;增强其可读性&#xff0c;同时也能迅速推进程序员的工作进程&#xff0c;延长代码的生命周期。 对于新手和有经验的程序员&#xff0c;推荐使用的代码编辑器也均有不同。小楼总结了一些好用的代码编辑器&#xff0c;还在纠…

C#OOP之二 变量和表达式

2.1 C#的基本语法 C#代码的外观和操作方式与C和Java非常相似。初看起来&#xff0c;其语法比较混乱&#xff0c; 不像书面英语和其他语言。但是&#xff0c;在C#编程中&#xff0c;使用的样式是比较清晰的&#xff0c;不用花太多的力气就可以编写出可读性很强的代码。 与其他语…

java异步多线程 判断线程状态_java多线程和异步回调

在实际开发过程中遇到的多线程情况不多&#xff0c;但是在生产环境中多线程是最基本的情况&#xff0c;java面试时也会考到&#xff0c;所以看看多线程的知识还是很有必要的。Thread&#xff0c;Runnable&#xff0c;Callable&#xff0c;Future&#xff0c;FutureTask,Executo…

C#调用API弹出打印机属性对话框

调用api弹出打印机属性对话框 Author:vitoriatangFrom:Internet.NET Framework封装了很多关于打印的对话框&#xff0c;比如说PrintDialog, PageSetupDialog. 但是有的时候我们还需要关心打印机属性对话框&#xff0c;那么就可以调用API来解决这个问题。有几个API函数与之相关P…

Java中异常

首先我们要知道RuntimeException与Exception之间的关系与他们分别的含义&#xff1a; ①在Java中异常的基类为Throwable&#xff0c;他有两个子类Exception与Errors&#xff0c;同时RuntimeException就是Exception的子类&#xff1b; ②RuntimeException&#xff0c;即运行时异…

第九周作业

你最喜欢做什么--兴趣问题清单•根据迄今为止已有的经历&#xff0c;你真正喜欢从事的工作是什么&#xff1f;动漫设计师或者网页设计师•休暇时间你最爱从事的活动是什么&#xff1f;看动漫•什么令你精疲力尽&#xff1f;什么能激发你的活力&#xff1f;看动漫•你是重视质量…

SQLServer数据库获取重复记录中日期最新的记录

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

循环的时候去删除集合中的元素 java.util.ConcurrentModificationException

使用for循环&#xff0c;删除集合中的元素&#xff0c;会报错 java.util.ConcurrentModificationException 只能通过迭代器 iterator删除 1&#xff1a;在while循环中使用iterator迭代器删除集合中元素 2:在for循环中使用iterator迭代器删除集合中元素 3&#xff1a;使用for循…

jquery ajax load

jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法。 load() 方法从服务器加载数据&#xff0c;并把返回的数据放入被选元素中。 语法&#xff1a; $(selector).load(URL,data,callback); $("button").click(function(){$("#div1").load(&qu…

计算机网络硬件设备组成笔记

网络是计算机或类似计算机的网络设备的集合&#xff0c;它们之间通过各种传输介质进行连接。无论设备之间如何连接&#xff0c;网络都是将来自于其中一台网络设备上的数据&#xff0c;通过传输介质传输到另外一台网络设备上。 本节将基于这个过程讲解网络的组成。 网卡 网卡也被…

java记事本复制粘贴_Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能...

这篇文字将要学习以下知识点&#xff1a;1.如何给JButton按钮添加鼠标点击事件监听器#1.addMouseListener(MouseListener l) 给JButton添加一个鼠标点击监听器l2.文本区控件JTextArea 中的方法(剪切&#xff0c;复制&#xff0c;粘贴&#xff0c;删除&#xff0c;全选 功能的…

学习进度条07

第八周所花时间28小时代码量 50博客量7篇了解到的知识点 java中swing控件可以用来设置图形化界面&#xff0c;让界面更加好看&#xff1b; 可以引用相关的包和类&#xff0c;来改变图形化的界面&#xff0c;让界面更加美观。 转载于:https://www.cnblogs.com/Daddy/p/5427670.h…

迭代器(Iterator)遍历的两种方法(for和while)

一般遍历list的时候&#xff0c;我们习惯下面的写法,但这种写法有缺陷&#xff0c;不能及时释放iterator的内存 while循环遍历 Test public void testIteratorWhile(){ArrayList<String> lists new ArrayList<>();lists.add("A");lists.add("B&…

硬件:断路器、接触器、继电器基础知识

在电力系统中&#xff0c;断路器、接触器、继电器似乎都是耳熟能详的家伙&#xff0c;但很多一知半解的&#xff0c;却也搞不清这些东西究竟有什么不同&#xff0c;又有什么联系&#xff0c;今天我们就一起讲一讲。 首先说相同的吧&#xff01; 当然&#xff0c;无可非议的&…

java pem,如何验证Java中的PEM格式证书

I have PEM format file, How can verify the signature in Java, as I followed http://download.oracle.com/javase/tutorial/security/apisign/versig.html but found that Java doesnt support PEM解决方案You can read a certificate in a PEM file using BouncyCastles P…