欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java高并發(fā)測(cè)試框架JCStress詳解

 更新時(shí)間:2021年04月08日 08:35:46   作者:陳皮的JavaLib  
這篇文章主要介紹了Java高并發(fā)測(cè)試框架JCStress,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

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

JCStress學(xué)起來很簡(jiǎn)單,而且官方也提供了許多高并發(fā)場(chǎng)景下的測(cè)試用例,只要引入一個(gè)jar包,即可運(yùn)行研究。

如何使用JCStress

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

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

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

package com.nobody;

import org.openjdk.jcstress.annotations.*;
import org.openjdk.jcstress.infra.results.I_Result;

/**
 * @Description 測(cè)試指令重排序
 * @Author Mr.nobody
 * @Date 2021/4/6
 * @Version 1.0
 */
@JCStressTest // 標(biāo)記此類為一個(gè)并發(fā)測(cè)試類
@Outcome(id = {"0"}, expect = Expect.ACCEPTABLE_INTERESTING, desc = "wrong result") // 描述測(cè)試結(jié)果
@Outcome(id = {"-1", "5"}, expect = Expect.ACCEPTABLE, desc = "normal result") // 描述測(cè)試結(jié)果
@State //標(biāo)記此類是有狀態(tài)的
public class TestInstructionReorder {

    private boolean flag ;
    private int x;

    public TestInstructionReorder() {}

    @Actor
    public void actor1(I_Result r) {
        if (flag) {
            r.r1 = x;
        } else {
            r.r1 = -1;
        }
    }

    @Actor
    public void actor2(I_Result r) {
        this.x = 5;
        flag = true;
    }
}

配置程序的主類,org.openjdk.jcstress.Main是JCStress自帶的一個(gè)啟動(dòng)類;然后可以配置-t參數(shù)設(shè)置需要測(cè)試的類,當(dāng)然 -t 后面也可以指定包名,表示執(zhí)行指定包下的所有測(cè)試類。如果不指定-t參數(shù),默認(rèn)會(huì)掃描項(xiàng)目下所有包的類。

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

有些人會(huì)說用jmeter工具不也可以測(cè)試高并發(fā),但是它們的側(cè)重點(diǎn)還是不一樣的,jmeter側(cè)重對(duì)于接口整體的響應(yīng)速度等進(jìn)行測(cè)試,而JCStress框架能對(duì)某塊邏輯代碼進(jìn)行高并發(fā)測(cè)試,更加側(cè)重JVM,類庫等領(lǐng)域的研究。

而且,JCStress會(huì)考慮不同JVM參數(shù)設(shè)置下的測(cè)試,而且自動(dòng)幫我們?cè)O(shè)置,例如上圖所示[-XX:-TieredCompilation]。

除了命令行窗口顯示的測(cè)試結(jié)果之外,還會(huì)在項(xiàng)目所在的目錄下生成 results文件夾,生成測(cè)試結(jié)果文檔,其中index.html是測(cè)試總覽,其他html文件是每個(gè)測(cè)試類的報(bào)告,結(jié)合結(jié)果數(shù)據(jù)結(jié)構(gòu)可視化圖形更加容易理解。

JCStress 注解說明

@JCStressTest

標(biāo)記一個(gè)類為并發(fā)測(cè)試的類,它有一個(gè)org.openjdk.jcstress.annotations.Mode枚舉類型的屬性value。Mode.Continuous模式表示會(huì)運(yùn)行幾個(gè)Actor,Ariter線程,并收集統(tǒng)計(jì)結(jié)果。Mode.Termination模式代表運(yùn)行具有阻塞/循環(huán)操作的單個(gè)Actor,看是否響應(yīng)Singal信號(hào)。

@State

標(biāo)記一個(gè)類是有狀態(tài)的,即擁有可以讀寫的數(shù)據(jù),例如上例的x和falg。State類只能是public的,不能是內(nèi)部類(可以是靜態(tài)內(nèi)部類),并且得有一個(gè)默認(rèn)構(gòu)造方法。

@Outcome

描述測(cè)試的結(jié)果,它有3個(gè)屬性,id屬性為一個(gè)字符串?dāng)?shù)組,表示接收的結(jié)果,支持正則表達(dá)式;expect表示對(duì)觀測(cè)結(jié)果的期望,它的值是一個(gè)枚舉值;desc屬性指定一個(gè)易于人類理解的對(duì)結(jié)果的描述。@Outcomes注解可以組合多個(gè)結(jié)果注解。

@Actor

@Actor是一個(gè)中心測(cè)試注解,它標(biāo)記的方法會(huì)被一個(gè)特定的線程調(diào)用,每一個(gè)對(duì)象的方法只能被調(diào)用一次。多個(gè)Actro方法調(diào)用順序是不保證的,它們是并發(fā)執(zhí)行的,方法可以拋出異常并且會(huì)導(dǎo)致測(cè)試失敗。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)記的類被作為測(cè)試結(jié)果的類,JCStress自帶的org.openjdk.jcstress.infra.results包下就有大量的測(cè)試結(jié)果類,不同的類可以用來保持不同的結(jié)果。例如I_Result類有一個(gè)int類型的變量r1;II_Result類有2個(gè)int類型的變量r1和r2。

JCStress 插件

有一個(gè)插件集成了JCStress和Gradle,我們只需要在build.gradle中引入此插件,即可使用插件命令來進(jìn)行測(cè)試。插件依賴為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)目即可編寫測(cè)試類,例如還是上面那個(gè)例子,最后我們?cè)陧?xiàng)目根目錄下執(zhí)行 gradle jcstress,即可顯示測(cè)試結(jié)果。也可以通過參數(shù)指定要測(cè)試的類,例如 gradle jcstress --tests "TestInstructionReorder"。

插件源碼地址:https://github.com/jerzykrlk/jcstress-gradle-plugin

到此這篇關(guān)于Java高并發(fā)測(cè)試框架JCStress的文章就介紹到這了,更多相關(guān)Java高并發(fā)JCStress內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例

    Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例

    這篇文章主要介紹了Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例,普通的線程執(zhí)行是無法獲取到執(zhí)行結(jié)果的,FutureTask?間接實(shí)現(xiàn)了?Runnable?和?Future?接口,可以得到子線程耗時(shí)操作的執(zhí)行結(jié)果,AsyncTask?異步任務(wù)就是使用了該機(jī)制,需要的朋友可以參考下
    2024-01-01
  • Java使用RedisTemplate模糊刪除key操作

    Java使用RedisTemplate模糊刪除key操作

    這篇文章主要介紹了Java使用RedisTemplate模糊刪除key操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • springboot openfeign從JSON文件讀取數(shù)據(jù)問題

    springboot openfeign從JSON文件讀取數(shù)據(jù)問題

    今天主要說一下在openfeign里讀取JSON文件的問題,我們將測(cè)試所需要的數(shù)據(jù)存儲(chǔ)到文件里,在修改時(shí)關(guān)注點(diǎn)比較單純
    2018-06-06
  • 從SpringBoot打war包并配置外部Tomcat運(yùn)行的全流程

    從SpringBoot打war包并配置外部Tomcat運(yùn)行的全流程

    由于其他原因,我們需要使用SpringBoot打成war包放在外部的Tomcat中運(yùn)行,本文就以一個(gè)案例來說明從SpringBoot打war包到Tomcat配置并運(yùn)行的全流程經(jīng)過,需要的朋友可以參考下
    2024-06-06
  • 使用log4j2關(guān)閉debug日志

    使用log4j2關(guān)閉debug日志

    這篇文章主要介紹了使用log4j2關(guān)閉debug日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java中有無參數(shù)和返回值的方法詳解

    java中有無參數(shù)和返回值的方法詳解

    這篇文章主要介紹了java中有無參數(shù)和返回值的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • maven項(xiàng)目打包上傳到私有倉庫

    maven項(xiàng)目打包上傳到私有倉庫

    在項(xiàng)目開發(fā)中通常會(huì)引用其他的jar,怎樣把自己的項(xiàng)目做為一個(gè)jar包的形式發(fā)布到私服倉庫中,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06
  • Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)

    Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)

    這篇文章主要介紹了Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn),實(shí)現(xiàn)代碼很簡(jiǎn)單,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 23種設(shè)計(jì)模式(2) java工廠模式

    23種設(shè)計(jì)模式(2) java工廠模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java工廠模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Spring?@InitBinder注解使用及原理詳解

    Spring?@InitBinder注解使用及原理詳解

    這篇文章主要為大家介紹了Spring?@InitBinder注解使用及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論