国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

線上問題整理

這篇具有很好參考價值的文章主要介紹了線上問題整理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

JVM 案例

案例一:服務(wù)器內(nèi)存不足,影響Java應(yīng)用

問題: 收到報警,某Java應(yīng)用集群中一臺服務(wù)器可用內(nèi)存不足,超過報警閾值。

線上問題整理,網(wǎng)站架構(gòu) & 性能調(diào)優(yōu),java,后端,面試,性能優(yōu)化,系統(tǒng)架構(gòu),職場和發(fā)展,jvm

排查過程: 首先,通過Hickwall查看該應(yīng)用各項指標(biāo),發(fā)現(xiàn)無論是請求數(shù)量、CPU使用率、還是JMX的各項指標(biāo)均未發(fā)現(xiàn)異常。僅系統(tǒng)內(nèi)存占用很高,但是從JMX指標(biāo)中看,Java應(yīng)用的Heap Memory、GC等都是正常的,在合理大小和范圍內(nèi),未發(fā)現(xiàn)內(nèi)存泄漏等問題。故懷疑不是Java應(yīng)用本身的問題,而是系統(tǒng)上其他組件出了問題,但是從Hickwall等工具上又看不出其他組件的信息。然后,直接ssh登錄到該服務(wù)器,由于是內(nèi)存問題,故直接使用簡單的top命令,根據(jù)內(nèi)存占用排序后發(fā)現(xiàn),是logagent進程占用了接近一半的系統(tǒng)內(nèi)存。

由于賬號權(quán)限限制,無法進一步處理,誘因找到后,隨即反饋給網(wǎng)站運營中心的同事,幫忙臨時將logagent進程殺死,系統(tǒng)恢復(fù)正常。后續(xù)經(jīng)網(wǎng)站運營中心同事排查,發(fā)現(xiàn)是logagent內(nèi)部bug,導(dǎo)致處理格式異常的日志文件時發(fā)生內(nèi)存泄漏,后續(xù)打上補丁進行修復(fù)。

線上問題整理,網(wǎng)站架構(gòu) & 性能調(diào)優(yōu),java,后端,面試,性能優(yōu)化,系統(tǒng)架構(gòu),職場和發(fā)展,jvm

問題原因及思考: 目前公司各項監(jiān)控工具已經(jīng)比較完善,開發(fā)人員應(yīng)熟練掌握并了解其中各項指標(biāo)的含義,能夠在分析具體問題時靈活運用各個工具,快速定位解決問題。

同時本案例雖然不是業(yè)務(wù)系統(tǒng)的問題,但這一案例也提醒了開發(fā)人員:線上實際問題可能是各方各面的,除了具備Java技術(shù)棧的相關(guān)的排障技能外,同時也要有基本的Linux操作能力,在已有工具無法幫助解決問題時,多一種途徑快速定位問題,畢竟運營中心的同事人力有限,可能無法及時提供支持。

擴展

Java Full GC頻繁: 可通過Hickwall中的JMX Full gc time/count指標(biāo)觀察Full GC情況,正常情況下不應(yīng)有Full GC出現(xiàn),Full GC意味著 STWJVM會阻塞其他所有線程來進行垃圾回收,頻繁的Full GC會嚴重影響應(yīng)用的性能。如果出現(xiàn)Full GC通常意味著Java堆內(nèi)存大小無法滿足需求,如果不是代碼缺陷導(dǎo)致(可通過以上OOMJVM Sampler工具相關(guān)方法排查)則需要增加堆內(nèi)存大小。

大數(shù)據(jù)量處理

案例一:大循環(huán)引起的 cpu 負載過高的問題

問題: x應(yīng)用在一次發(fā)布時,cpu出現(xiàn)負載過高,其負載率突破200%,并且響應(yīng)時間也大幅度超時。

線上問題整理,網(wǎng)站架構(gòu) & 性能調(diào)優(yōu),java,后端,面試,性能優(yōu)化,系統(tǒng)架構(gòu),職場和發(fā)展,jvm線上問題整理,網(wǎng)站架構(gòu) & 性能調(diào)優(yōu),java,后端,面試,性能優(yōu)化,系統(tǒng)架構(gòu),職場和發(fā)展,jvm

代碼:

List<CityDataModel> cities = cityDomainService.allCities();
for (CityDataModel city : cities) {
    if (city.getCityCode().equalsIgnoreCase(flight.getDepartCity())) {
        dCountry = city.getCountryCode();
    }
    if (city.getCityCode().equalsIgnoreCase(flight.getArriveCity())) {
        aCountry = city.getCountryCode();
    }
}

通過在測試環(huán)境嘗試調(diào)用一次服務(wù)請求,發(fā)現(xiàn)其循環(huán)的數(shù)據(jù)是城市列表。該列表的長度達到12000,而且發(fā)現(xiàn)該循環(huán)本身被執(zhí)行了11次,String::equalsIgnoreCase方法執(zhí)行了18萬次,也就是說這是一個典型的大循環(huán)的代碼。 并且通過記錄日志發(fā)現(xiàn),在生產(chǎn)中該塊代碼平均每次請求都會調(diào)用24萬次左右,這導(dǎo)致很多cpu資源都集中在該方法上,使得cpu load大幅度提高。

問題解決: 由于代碼中的大循環(huán)非常耗費cpu資源,通過分析,這里的Strings::equalsIgnoreCase方法的主要作用在于遍歷判斷取數(shù)據(jù)。 根據(jù)這種查找數(shù)據(jù)的情況,優(yōu)先選擇使用HashMap替代,用空間換時間,經(jīng)過修改后重新發(fā)布,其cpu利用率明顯下降,恢復(fù)正常。

思考總結(jié):
【1】使用循環(huán)時需要特別注意大循環(huán),優(yōu)先使用O(1)HashMap,大循環(huán)對于cpu性能的壓榨在這個問題上表現(xiàn)地淋漓盡致。
【2】鏡像機器由于是使用生產(chǎn)流量轉(zhuǎn)發(fā)訪問,所以鏡像發(fā)布高度貼近實際生產(chǎn)發(fā)布。在每次發(fā)布前,先使用鏡像機器預(yù)發(fā)布,可以盡可能地將潛在的問題暴露出來。另外性能實驗室中提供了cpu熱點、內(nèi)存分配熱點和鎖競爭熱點的Flamegraph,在預(yù)發(fā)布中遇到問題時也可以更加直觀地幫忙解決問題,并且不會對實際生產(chǎn)機器造成影響。
【3】此次發(fā)布前,雖然在測試環(huán)境進行了壓測,但是并沒有復(fù)現(xiàn)出該問題,分析原因,其與特定的壓測的請求相關(guān)。由于在壓測時使用的請求沒有經(jīng)過某些代碼分支,使得循環(huán)的次數(shù)相比較少,故而在測試環(huán)境壓測時沒有暴露該問題。
【4】以上總結(jié),除了代碼層面的使用注意外,可以進行測試環(huán)境多種請求壓力測試,以及生產(chǎn)鏡像機器預(yù)發(fā)布等手段,來檢測和杜絕這種潛在的問題發(fā)生。

案例二:多層嵌套 map

問題: 某日某查詢服務(wù)器開始不斷拉出集群,造成線上訂單下跌。

線上問題整理,網(wǎng)站架構(gòu) &amp; 性能調(diào)優(yōu),java,后端,面試,性能優(yōu)化,系統(tǒng)架構(gòu),職場和發(fā)展,jvm

遇到問題需咨詢解決。。。

緩存

案例一:篡改緩存

問題: 查詢接口下發(fā)錯誤數(shù)據(jù)故障

故障描述: 包含故障開始時間,發(fā)現(xiàn)時間,控制措施,故障排除細節(jié)

Time Event
15:00 接到產(chǎn)品郵件告知下單調(diào)用查詢接口的結(jié)果與前端的數(shù)據(jù)不一致,要求緊急對問題進行排查。
15:05 開始對問題進行排查,同時了解問題大概影響范圍。
16:00 定位到是因為代碼bug導(dǎo)致的接口在下發(fā)時,輸出的結(jié)果不正確。3月1日接口由.net切換到了java版查詢接口。
16:20 開始著手對bug進行修復(fù),并進行緊急發(fā)布。
16:20 與產(chǎn)品溝通影響范圍以及問題訂單的處理辦法。
16:30 確定影響的單量:10萬
16:50 著手準(zhǔn)備修復(fù)問題訂單SQL
18:00 完成緊急修復(fù)的上線

故障分析:
【1】為什么接口會下發(fā)錯誤?
.Net接口轉(zhuǎn)Java過程中引發(fā)的代碼bug,修改了本地緩存對象。

【2】為什么這個錯誤在代碼review中沒有被發(fā)現(xiàn)?
代碼review不充分。雖然接口的邏輯并不復(fù)雜,但是代碼量較多(40個文件,2000 additions and 1000 deletions),在review過程中遺漏了該錯誤。

【3】為什么在測試過程中沒有發(fā)現(xiàn)該bug?
測試不充分,同時這個bug的觸發(fā)存在一定概率性,當(dāng)多個訂單引用同一個基礎(chǔ)服務(wù)對象時,在對禮盒進行遍歷計算時,最后一個訂單的計算結(jié)果會覆蓋前面所有引用了該基礎(chǔ)服務(wù)對象的訂單。如果測試時選擇的訂單沒有觸發(fā)該·bug·,·.Net·和·Java·版本的對比結(jié)果是一致的。

【4】為什么影響的單量達·10W·以上規(guī)模?
bug212日發(fā)布直到33日才發(fā)現(xiàn),持續(xù)了22天。

【5】為什么從212日起該問題直到33日才發(fā)現(xiàn)?
目前對于這類問題缺乏有效的檢測機制,只能被動的等待客戶投訴發(fā)生后才會反饋到開發(fā)團隊。

分析總結(jié):
【1】通過以上故障示例,我們可以發(fā)現(xiàn)緩存被修改帶來的影響通常具有以下特性:
■ 不容易發(fā)現(xiàn),因為數(shù)據(jù)可能只在特定條件下被修改。
■ 影響面非常廣,因為數(shù)據(jù)本身是被頻繁使用才會被加入緩存。
■ 不確定性,因為數(shù)據(jù)被修改具有“隨機性”,該特性導(dǎo)致影響范圍難以確定,數(shù)據(jù)也難以清洗。
【2】緩存篡改通常如何發(fā)生:
■ 從緩沖獲取一個對象(引用),后續(xù)過程中修改了該對象的內(nèi)部成員。

public class CityCache {
    private static final CityCache INSTANCE = new CityCache();

    private final Map<String, City> cityMap = new HashMap<>();

    public static CityCache getInstance() {
        return INSTANCE;
    }

    private CityCache() {
        // 此處為了簡便,沒有寫定時刷新
        loadDataFromDB();
    }

    public City getCityByCode(String cityCode) {
        return cityMap.get(cityCode);
    }

    private void loadDataFromDB() {
        // load cities from database and put them into cityMap
    }
}

@Data
public class City {
    public City() {
    }

    public City(String code, int id) {
        this.code = code;
        this.id = id;
    }

    private String code;
    private int id;
}

@Test
public void errorTest() {
    // 通過SHA獲取到緩存實體,該實體的三字碼與SHA相同
    City city1 = CityCache.getInstance().getCityByCode("SHA");
    assertTrue("SHA".equals(city1.getCode()));

    // 業(yè)務(wù)代碼直接修改了city1的三字碼(CityCache中的實體被修改)
    city1.setCode("BJS");
    // ...

    // 再次通過SHA獲取到緩存實體,該實體的三字碼與SHA不相同了(非期望值)
    City city2 = CityCache.getInstance().getCityByCode("SHA");
    assertFalse("SHA".equals(city2.getCode()));
}

@Test
public void correctTest() {
    // 通過SHA獲取到緩存實體,該實體的三字碼與SHA相同
    City city1 = CityCache.getInstance().getCityByCode("SHA");
    assertTrue("SHA".equals(city1.getCode()));

    // 業(yè)務(wù)代碼不能直接修改緩存實體,正確做法是先Copy一個對象,修改Copy對象的屬性,后續(xù)業(yè)務(wù)使用該Copy對象
    City cityCopy = new City(city1.getCode(), city1.getId());
    cityCopy.setCode("BJS");
    // ...

    // 通過SHA獲取到緩存實體,該實體的三字碼與SHA相同
    City city2 = CityCache.getInstance().getCityByCode("SHA");
    assertTrue("SHA".equals(city2.getCode()));
}
■  從緩沖獲取一個集合(引用),后續(xù)過程中往該集合中添加/刪除了元素。
public class CityCache {
    private static final CityCache INSTANCE = new CityCache();

    @Getter
    private final Map<String, City> cityMap = new HashMap<>();

    public static CityCache getInstance() {
        return INSTANCE;
    }

    private CityCache() {
        // // 此處為了簡便,沒有寫定時刷新
        loadDataFromDB();
    }

    private void loadDataFromDB() {
        // load cities from database and put them into cityMap
    }
}

@Data
public class City {
    public City() {
    }

    public City(String code, int id) {
        this.code = code;
        this.id = id;
    }

    private String code;
    private int id;
}

@Test
public void errorTest() {
    Map<String, City> cityMap = CityCache.getInstance().getCityMap();
    // 通過SHA獲取到緩存實體,該實體的三字碼與SHA相同
    City city1 = cityMap.get("SHA");
    assertTrue("SHA".equals(city1.getCode()));

    // 業(yè)務(wù)代碼直接修改緩存集合
    cityMap.put("SHA", new City("BJS", 2));
    // cityMap.remove("SHA");

    // 再次通過SHA獲取到緩存實體,該實體的三字碼與SHA不相同了(非期望值)
    City city2 = CityCache.getInstance().getCityMap().get("SHA");
    assertFalse("SHA".equals(city2.getCode()));
}
■  緩存實體被修改
public class CityCache {
    private static final CityCache INSTANCE = new CityCache();

    @Getter
    private final Map<String, City> cityMap = new HashMap<>();

    public static CityCache getInstance() {
        return INSTANCE;
    }

    private CityCache() {
        // // 此處為了簡便,沒有寫定時刷新
        loadDataFromDB();
    }

    private void loadDataFromDB() {
        // load cities from database and put them into cityMap
    }
}

@Data
public class City {
    public City() {
    }

    public City(String code, int id) {
        this.code = code;
        this.id = id;
    }

    private String code;
    private int id;
}

@Test
public void errorTest() {
    Map<String, City> cityMap = CityCache.getInstance().getCityMap();
    // 通過SHA獲取到緩存實體,該實體的三字碼與SHA相同
    City city1 = cityMap.get("SHA");
    assertTrue("SHA".equals(city1.getCode()));

    // 運行期間非預(yù)期的修改了緩存集合中的對象
    cityMap.forEach((k, v) -> {
        if (!"SHA".equals(k)) {
            return;
        }

        // ...
        v.setCode("BJS");
    });

    // 再次通過SHA獲取到緩存實體,該實體的三字碼與SHA不相同了(非期望值)
    City city2 = CityCache.getInstance().getCityMap().get("SHA");
    assertFalse("SHA".equals(city2.getCode()));
}

【3】如何避免緩存篡改:
■ 在可能需要修改數(shù)據(jù)的場景,從緩存獲取一個深拷貝對象/集合。
■ 將緩存對象設(shè)計為只讀狀態(tài),確保一旦構(gòu)建就不可再修改其內(nèi)部數(shù)據(jù)。

多線程

"多線程"這個話題想必開發(fā)人員或多或少都會接觸到。 使用多線程最主要的原因是提高系統(tǒng)的資源利用率。 但在使用的過程中可能會遇到各種各樣的問題,"死循環(huán)"便是其中比較棘手的一類。 下文分析了多線程環(huán)境下的死循環(huán)場景,希望對大家有所幫助。

死循環(huán)危害

線上問題整理,網(wǎng)站架構(gòu) &amp; 性能調(diào)優(yōu),java,后端,面試,性能優(yōu)化,系統(tǒng)架構(gòu),職場和發(fā)展,jvm

程序進入假死狀態(tài): 當(dāng)某個請求導(dǎo)致死循環(huán),該請求會在很大一段時間內(nèi),都無法獲取接口的返回。

CPU 使用率飆升: 代碼出現(xiàn)死循環(huán)后,由于沒有休眠,一直不斷搶占cpu資源,導(dǎo)致cpu長時間處于繁忙狀態(tài),必定會使cpu使用率飆升。

內(nèi)存使用率飆升: 代碼出現(xiàn)死循環(huán)時,循環(huán)體內(nèi)有大量創(chuàng)建對象的邏輯,垃圾回收器無法及時回收,會導(dǎo)致內(nèi)存使用率飆升。同時,如果垃圾回收器頻繁回收對象,也會造成cpu使用率飆升。

StackOverflowError棧溢出: 在一些遞歸調(diào)用的場景,如果出現(xiàn)死循環(huán),多次循環(huán)后,最終會報 StackOverflowError 棧溢出,程序直接掛掉。

案例一:多線程環(huán)境下的死循環(huán)案例

問題: 循環(huán)條件不正確
案例: 這里以二分查找為例

int search(List<Integer> nums, int target) {
    int l = 0, r = nums.size() - 1;
    while (l < r) {
        int mid = (l + r) / 2;
        if (nums.get(mid) > target)
            r = mid - 1;
        else
            // 可能出問題位置
            l = mid;
    }

    if (nums.get(l) == target)
        return l;
    else
        return -1;
}

首先,會不會產(chǎn)生死循環(huán)的關(guān)鍵是lr是否在每次循環(huán)后至少有一個的值發(fā)生了改變, 而while循環(huán)體中,若走入了else語句,l的值有可能不發(fā)生變化,就會導(dǎo)致死循環(huán)的產(chǎn)生。 可以對循環(huán)體做以下調(diào)整:

while (l < r) {
    int mid = (l + r) / 2;
    if (nums.get(mid) >= target)
        r = mid;
    else
        l = mid + 1;
}

案例二:flag 線程間不可見

有時候我們的代碼需要一直做某件事情,直到某個條件達到,有個狀態(tài)告訴它,要終止任務(wù)了,它就會自動退出。 這時候,很多人都會想到用while(flag)實現(xiàn)這個功能:

public class FlagTest {
    private boolean flag = true;

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public void fun() {
        while (flag) {
        }
        System.out.println("done");
    }

    public static void main(String[] args) throws InterruptedException {
        final FlagTest flagTest = new FlagTest();
        new Thread(() -> flagTest.fun()).start();
        Thread.sleep(200);
        flagTest.setFlag(false);
    }
}

這段代碼在子線程中執(zhí)行無限循環(huán),當(dāng)主線程休眠200毫秒后,將flag變成false,這時子線程就會自動退出了。想法是好的,但是實際上這段代碼進入了死循環(huán),不會因為flag變成false而自動退出。 為什么會這樣? 線程間flag是不可見的,這時如果flag加上了volatile關(guān)鍵字,變成:

private volatile boolean flag = true;
會強制把共享內(nèi)存中的值刷新到主內(nèi)存中,讓多個線程間可見,程序可以正常退出。

案例三:HashMap JDK7/8 死循環(huán)

問題: JDK7 rehash(擴容)時和JDK8鏈表更改為紅黑樹時。鏈接

案例四:自己手動寫死循環(huán)

定時任務(wù)比如有個需求要求每隔5分鐘,從遠程拉取數(shù)據(jù),覆蓋本地數(shù)據(jù)。 這時候,如果你不想用其他的定時任務(wù)框架,可以實現(xiàn)一個簡單的定時任務(wù),具體代碼如下:

public static void sync() {
    new Thread(() -> {
        while (true) {
            try {
                System.out.println("sync data");
                Thread.sleep(1000 * 60 * 5);
            } catch (Exception e) {
                log.error(e);
            }
        }
    }).start();
}

其實很多JDK中的定時任務(wù),比如:Timer類的底層,也是用了while(true)的無限循環(huán)(也就是死循環(huán))來實現(xiàn)的。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-808862.html

到了這里,關(guān)于線上問題整理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • PHP調(diào)優(yōu)策略和性能測試工具的詳細解析 - 大規(guī)模網(wǎng)站性能優(yōu)化

    當(dāng)面臨大規(guī)模網(wǎng)站性能優(yōu)化時,對PHP進行調(diào)優(yōu)是至關(guān)重要的。這涉及到評估現(xiàn)有系統(tǒng)的性能瓶頸,并采取適當(dāng)?shù)牟呗詠硖岣呔W(wǎng)站的響應(yīng)速度和吞吐量。本文將深入探討PHP調(diào)優(yōu)的策略,以及可用于性能測試的工具。 使用緩存 :合理使用緩存可以減少數(shù)據(jù)庫查詢和計算操作,提

    2024年02月12日
    瀏覽(28)
  • 一線互聯(lián)網(wǎng)架構(gòu)師360°全方面性能調(diào)優(yōu),android適配器ui

    一線互聯(lián)網(wǎng)架構(gòu)師360°全方面性能調(diào)優(yōu),android適配器ui

    為什么要使用多進程 對于進程的概念,來到這里的都是編程修仙之人,就不再啰嗦了,相信大家倒著、跳著、躺著、各種姿勢都能背出來。 相信很多同學(xué)在實際開發(fā)中,基本都不會去給app劃分進程,而且,在Android中使用多進程,還可能需要編寫額外的進程通訊代碼,還可能

    2024年04月13日
    瀏覽(19)
  • JVM:性能監(jiān)控工具分析和線上問題排查實踐

    JVM:性能監(jiān)控工具分析和線上問題排查實踐

    在日常開發(fā)過程中,多少都會碰到一些jvm相關(guān)的問題,比如: 內(nèi)存溢出、內(nèi)存泄漏、cpu利用率飆升到100%、線程死鎖、應(yīng)用異常宕機 等。 在這個日益內(nèi)卷的環(huán)境,如何運用好工具分析jvm問題,成為每個java攻城獅必備的技能。所以白夢特意整理了 jdk自帶分析工具的使用 ,以及

    2024年01月19日
    瀏覽(27)
  • 10.1. Java性能調(diào)優(yōu)

    10.1. Java性能調(diào)優(yōu)

    Java性能調(diào)優(yōu)是一個復(fù)雜且重要的主題,它涉及到了JVM、垃圾收集器、內(nèi)存管理、多線程、代碼優(yōu)化等多個方面。在本節(jié)中,我們將對Java性能調(diào)優(yōu)的基本概念和方法進行簡要介紹。 10.1.1. 理解性能指標(biāo) 在進行性能調(diào)優(yōu)之前,我們首先需要了解主要的性能指標(biāo)。以下是一些常見

    2024年02月08日
    瀏覽(19)
  • Java性能調(diào)優(yōu)必備知識學(xué)習(xí)路線

    Java性能調(diào)優(yōu)必備知識學(xué)習(xí)路線

    性能調(diào)優(yōu)是Java開發(fā)中一個非常重要的環(huán)節(jié),它可以幫助我們提高系統(tǒng)的性能、穩(wěn)定性、可靠性和用戶體驗,從而提高用戶體驗和企業(yè)競爭力。? 目錄 一、為什么要學(xué)習(xí)Java性能調(diào)優(yōu)? 二、如何做好性能調(diào)優(yōu)? 2.1?扎實的計算機基礎(chǔ) 2.2 研讀源碼了解底層實現(xiàn)原理 2.3 追根問底

    2024年02月08日
    瀏覽(41)
  • 【Jvm】性能調(diào)優(yōu)(拓展)Jprofiler如何監(jiān)控和解決死鎖、內(nèi)存泄露問題

    【Jvm】性能調(diào)優(yōu)(拓展)Jprofiler如何監(jiān)控和解決死鎖、內(nèi)存泄露問題

    Jprofilers是針對Java開發(fā)的 性能分析工具(免費試用10天) , 可以對Java程序的 內(nèi)存,CPU,線程,GC,鎖 等進行監(jiān)控和分析 , 本人IDEA版本是 2020.2.2 ,選擇的Jprofiler版本是 12.0 (早期的版本是純英文的, 12.0支持中文 ,安裝主要考慮是否與IDEA插件兼容即可) 進入Jprofiler官網(wǎng)下載 - Jprofiler 版本這

    2024年02月19日
    瀏覽(24)
  • 同構(gòu)多核架構(gòu)(SMP)和異構(gòu)多核架構(gòu)(AMP)

    同構(gòu)多核架構(gòu)(SMP)和異構(gòu)多核架構(gòu)(AMP)主要在兩個角度上有區(qū)別: 處理器架構(gòu):在同構(gòu)多核架構(gòu)中,系統(tǒng)中的處理器在架構(gòu)上是相同的,而異構(gòu)多核架構(gòu)則包含不同架構(gòu)的處理器。 運行模式:在同構(gòu)多核架構(gòu)中,多個核心運行一個操作系統(tǒng),該操作系統(tǒng)同等的管理多個

    2024年02月14日
    瀏覽(22)
  • JVM調(diào)優(yōu)篇:探索Java性能優(yōu)化的必備種子面試題

    JVM調(diào)優(yōu)篇:探索Java性能優(yōu)化的必備種子面試題

    首先面試官會詢問你在進行JVM調(diào)優(yōu)之前,是否了解JVM內(nèi)存模型的基礎(chǔ)知識。這是一個重要的入門問題。JVM內(nèi)存模型主要包括程序計數(shù)器、堆、本地方法棧、Java棧和方法區(qū)(1.7之后更改為元空間,并直接使用系統(tǒng)內(nèi)存)。 正常堆內(nèi)存又分為年輕代和老年代。在Java虛擬機中,年

    2024年02月15日
    瀏覽(28)
  • Redis從基礎(chǔ)到進階篇(四)----性能調(diào)優(yōu)、分布式鎖與緩存問題

    Redis從基礎(chǔ)到進階篇(四)----性能調(diào)優(yōu)、分布式鎖與緩存問題

    目錄 一、Redis 集群演變 1.1?Replication+Sentinel*高可用 1.2?Proxy+Replication+Sentinel(僅僅了解) 1.3?Redis Cluster 集群 (重點) 1.3.1?Redis-cluster架構(gòu)圖 1.3.2?工作原理 1.3.3?主從切換 1.3.4 副本漂移 1.3.5 分片漂移 二、Redis版本歷史(增加了解) 三、Redis 5.0 源碼清單 (對源碼感興趣的,看一下

    2024年02月09日
    瀏覽(25)
  • 一次線上mysql 調(diào)優(yōu) ,join 的調(diào)優(yōu),索引優(yōu)化(Block Nested Loop)

    一次線上mysql 調(diào)優(yōu) ,join 的調(diào)優(yōu),索引優(yōu)化(Block Nested Loop)

    原因: 某接口調(diào)用十分緩慢,通過 Explain 發(fā)現(xiàn)是SQL問題 可以看到,在Join連接時,出現(xiàn)了BNL查詢,BNL出現(xiàn)是因為,JOIN連接時 dr表也就是 domian_redemption 被驅(qū)動的表上沒出現(xiàn)可用的索引。 個人解決方法: 在對應(yīng)的連接字段上,既dr的orderCode字段,內(nèi)表加上索引,再次執(zhí)行Explai

    2024年02月05日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包