您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java的JCStress如何使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java的JCStress如何使用”吧!
如果要研究高并發(fā),一般會借助高并發(fā)工具來進(jìn)行測試。JCStress(Java Concurrency Stress)它是OpenJDK中的一個(gè)高并發(fā)測試工具,它可以幫助我們研究在高并發(fā)場景下JVM,類庫以及硬件等狀況。
JCStress學(xué)起來很簡單,而且官方也提供了許多高并發(fā)場景下的測試用例,只要引入一個(gè)jar包,即可運(yùn)行研究。
此演示用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>
先寫一個(gè)簡單測試用例,一些注解不明白可以先不管,后面會講解。此樣例會在高并發(fā)下調(diào)用actor1和actor2方法各一次,按照正常邏輯,x最后的值要么是-1要么是5,如果actor2方法內(nèi)的2行代碼發(fā)生了指令重排序,就會導(dǎo)致x的值可能為0。
配置程序的主類,org.openjdk.jcstress.Main
是JCStress自帶的一個(gè)啟動類;然后可以配置-t參數(shù)設(shè)置需要測試的類,當(dāng)然 -t 后面也可以指定包名,表示執(zhí)行指定包下的所有測試類。如果不指定-t參數(shù),默認(rèn)會掃描項(xiàng)目下所有包的類。
運(yùn)行程序,結(jié)果顯示,x的值出現(xiàn)了0,-1,5三種結(jié)果,其中值為0不是我期待的,但是它在高并發(fā)下確實(shí)出現(xiàn)了,雖然相比其他值(幾十萬次)出現(xiàn)的概率(200多次)很低。
有些人會說用jmeter工具不也可以測試高并發(fā),但是它們的側(cè)重點(diǎn)還是不一樣的,jmeter側(cè)重對于接口整體的響應(yīng)速度等進(jìn)行測試,而JCStress框架能對某塊邏輯代碼進(jìn)行高并發(fā)測試,更加側(cè)重JVM,類庫等領(lǐng)域的研究。
而且,JCStress會考慮不同JVM參數(shù)設(shè)置下的測試,而且自動幫我們設(shè)置,例如上圖所示[-XX:-TieredCompilation]。
除了命令行窗口顯示的測試結(jié)果之外,還會在項(xiàng)目所在的目錄下生成 results文件夾,生成測試結(jié)果文檔,其中index.html是測試總覽,其他html文件是每個(gè)測試類的報(bào)告,結(jié)合結(jié)果數(shù)據(jù)結(jié)構(gòu)可視化圖形更加容易理解。
@JCStressTest
標(biāo)記一個(gè)類為并發(fā)測試的類,它有一個(gè)org.openjdk.jcstress.annotations.Mode枚舉類型的屬性value。Mode.Continuous模式表示會運(yùn)行幾個(gè)Actor,Ariter線程,并收集統(tǒng)計(jì)結(jié)果。Mode.Termination模式代表運(yùn)行具有阻塞/循環(huán)操作的單個(gè)Actor,看是否響應(yīng)Singal信號。
@State
標(biāo)記一個(gè)類是有狀態(tài)的,即擁有可以讀寫的數(shù)據(jù),例如上例的x和falg。State類只能是public的,不能是內(nèi)部類(可以是靜態(tài)內(nèi)部類),并且得有一個(gè)默認(rèn)構(gòu)造方法。
@Outcome
描述測試的結(jié)果,它有3個(gè)屬性,id屬性為一個(gè)字符串?dāng)?shù)組,表示接收的結(jié)果,支持正則表達(dá)式;expect表示對觀測結(jié)果的期望,它的值是一個(gè)枚舉值;desc屬性指定一個(gè)易于人類理解的對結(jié)果的描述。@Outcomes注解可以組合多個(gè)結(jié)果注解。
@Actor
@Actor是一個(gè)中心測試注解,它標(biāo)記的方法會被一個(gè)特定的線程調(diào)用,每一個(gè)對象的方法只能被調(diào)用一次。多個(gè)Actro方法調(diào)用順序是不保證的,它們是并發(fā)執(zhí)行的,方法可以拋出異常并且會導(dǎo)致測試失敗。Actor方法所在的類必須有State或者Result注解。
@Arbiter
它的作用其實(shí)和@Actor差不多,但是Arbiter標(biāo)記的方法調(diào)用是在所有@Actor標(biāo)記的方法調(diào)用之后,所以它標(biāo)記的方法一般作為收集最后的結(jié)果來使用。
@Signal
此注解也是標(biāo)記方法的,但是它是在JCStressTest的Termination模式下工作的,它的調(diào)用是在所有Actor之后。
@Result
它標(biāo)記的類被作為測試結(jié)果的類,JCStress自帶的org.openjdk.jcstress.infra.results包下就有大量的測試結(jié)果類,不同的類可以用來保持不同的結(jié)果。例如I_Result類有一個(gè)int類型的變量r1;II_Result類有2個(gè)int類型的變量r1和r2。
有一個(gè)插件集成了JCStress和Gradle,我們只需要在build.gradle中引入此插件,即可使用插件命令來進(jìn)行測試。插件依賴為jcstress-gradle-plugin。
build.gradle文件如下,不同版本的插件集成了默認(rèn)的JCStress版本,當(dāng)然我們也可以自定義更改,如下最后一行所示。
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}"
}
然后在項(xiàng)目即可編寫測試類,例如還是上面那個(gè)例子,最后我們在項(xiàng)目根目錄下執(zhí)行 gradle jcstress
,即可顯示測試結(jié)果。也可以通過參數(shù)指定要測試的類,例如 gradle jcstress --tests "TestInstructionReorder"
。
感謝各位的閱讀,以上就是“Java的JCStress如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java的JCStress如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。