中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的JCStress如何使用

發布時間:2022-02-23 15:58:13 來源:億速云 閱讀:201 作者:iii 欄目:開發技術

這篇文章主要講解了“Java的JCStress如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java的JCStress如何使用”吧!

前言

如果要研究高并發,一般會借助高并發工具來進行測試。JCStress(Java Concurrency Stress)它是OpenJDK中的一個高并發測試工具,它可以幫助我們研究在高并發場景下JVM,類庫以及硬件等狀況。

JCStress學起來很簡單,而且官方也提供了許多高并發場景下的測試用例,只要引入一個jar包,即可運行研究。

如何使用JCStress

此演示用maven工程,首先需要引入jar包,核心包是必須要的,樣例包非必須要,此是為了演示其中的例子。

<dependencies>
    <!-- jcstress 核心包 -->
    <dependency>
        <groupId>org.openjdk.jcstress</groupId>
        <artifactId>jcstress-core</artifactId>
        <version>0.3</version>
    </dependency>
    <!-- jcstress測試用例包 -->
    <dependency>
        <groupId>org.openjdk.jcstress</groupId>
        <artifactId>jcstress-samples</artifactId>
        <version>0.3</version>
    </dependency>
</dependencies>

先寫一個簡單測試用例,一些注解不明白可以先不管,后面會講解。此樣例會在高并發下調用actor1和actor2方法各一次,按照正常邏輯,x最后的值要么是-1要么是5,如果actor2方法內的2行代碼發生了指令重排序,就會導致x的值可能為0。

配置程序的主類,org.openjdk.jcstress.Main是JCStress自帶的一個啟動類;然后可以配置-t參數設置需要測試的類,當然 -t 后面也可以指定包名,表示執行指定包下的所有測試類。如果不指定-t參數,默認會掃描項目下所有包的類。

Java的JCStress如何使用

運行程序,結果顯示,x的值出現了0,-1,5三種結果,其中值為0不是我期待的,但是它在高并發下確實出現了,雖然相比其他值(幾十萬次)出現的概率(200多次)很低。

Java的JCStress如何使用

有些人會說用jmeter工具不也可以測試高并發,但是它們的側重點還是不一樣的,jmeter側重對于接口整體的響應速度等進行測試,而JCStress框架能對某塊邏輯代碼進行高并發測試,更加側重JVM,類庫等領域的研究。

而且,JCStress會考慮不同JVM參數設置下的測試,而且自動幫我們設置,例如上圖所示[-XX:-TieredCompilation]。

除了命令行窗口顯示的測試結果之外,還會在項目所在的目錄下生成 results文件夾,生成測試結果文檔,其中index.html是測試總覽,其他html文件是每個測試類的報告,結合結果數據結構可視化圖形更加容易理解。

Java的JCStress如何使用

Java的JCStress如何使用

Java的JCStress如何使用

JCStress 注解說明

@JCStressTest

標記一個類為并發測試的類,它有一個org.openjdk.jcstress.annotations.Mode枚舉類型的屬性value。Mode.Continuous模式表示會運行幾個Actor,Ariter線程,并收集統計結果。Mode.Termination模式代表運行具有阻塞/循環操作的單個Actor,看是否響應Singal信號。

@State

標記一個類是有狀態的,即擁有可以讀寫的數據,例如上例的x和falg。State類只能是public的,不能是內部類(可以是靜態內部類),并且得有一個默認構造方法。

@Outcome

描述測試的結果,它有3個屬性,id屬性為一個字符串數組,表示接收的結果,支持正則表達式;expect表示對觀測結果的期望,它的值是一個枚舉值;desc屬性指定一個易于人類理解的對結果的描述。@Outcomes注解可以組合多個結果注解。

@Actor

@Actor是一個中心測試注解,它標記的方法會被一個特定的線程調用,每一個對象的方法只能被調用一次。多個Actro方法調用順序是不保證的,它們是并發執行的,方法可以拋出異常并且會導致測試失敗。Actor方法所在的類必須有State或者Result注解。

@Arbiter

它的作用其實和@Actor差不多,但是Arbiter標記的方法調用是在所有@Actor標記的方法調用之后,所以它標記的方法一般作為收集最后的結果來使用。

@Signal

此注解也是標記方法的,但是它是在JCStressTest的Termination模式下工作的,它的調用是在所有Actor之后。

@Result

它標記的類被作為測試結果的類,JCStress自帶的org.openjdk.jcstress.infra.results包下就有大量的測試結果類,不同的類可以用來保持不同的結果。例如I_Result類有一個int類型的變量r1;II_Result類有2個int類型的變量r1和r2。

JCStress 插件

有一個插件集成了JCStress和Gradle,我們只需要在build.gradle中引入此插件,即可使用插件命令來進行測試。插件依賴為jcstress-gradle-plugin。

build.gradle文件如下,不同版本的插件集成了默認的JCStress版本,當然我們也可以自定義更改,如下最后一行所示。

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'jcstress'

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.github.erizo.gradle:jcstress-gradle-plugin:0.8.1'
    }
}


ext {
    jcstressVersion = '0.7'
}

repositories {
    jcenter()
}

dependencies {
    compile "org.openjdk.jcstress:jcstress-core:${jcstressVersion}"
}

jcstress {
    jcstressDependency "org.openjdk.jcstress:jcstress-core:${jcstressVersion}"
}

然后在項目即可編寫測試類,例如還是上面那個例子,最后我們在項目根目錄下執行 gradle jcstress,即可顯示測試結果。也可以通過參數指定要測試的類,例如 gradle jcstress --tests "TestInstructionReorder"

感謝各位的閱讀,以上就是“Java的JCStress如何使用”的內容了,經過本文的學習后,相信大家對Java的JCStress如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 宁都县| 瑞金市| 康定县| 拉萨市| 昭平县| 辽宁省| 楚雄市| 章丘市| 雷波县| 专栏| 西平县| 沙雅县| 马鞍山市| 太保市| 濮阳县| 石阡县| 汉阴县| 林甸县| 福建省| 兴城市| 淮安市| 黑龙江省| 蒙城县| 拜泉县| 德钦县| 乡城县| 阳信县| 萝北县| 长宁区| 安国市| 林周县| 太仓市| 泾川县| 南充市| 集贤县| 黔西县| 高碑店市| 射洪县| 湖口县| 广元市|