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.pswp.cn/news/271900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271900.shtml
英文地址,請注明出處:http://en.pswp.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…