日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

JVM 性能調(diào)優(yōu)之通過 JProfile 和 JFR 分析系統(tǒng)瓶頸提升系統(tǒng)性能

來源: 責(zé)編: 時(shí)間:2024-04-02 17:23:23 207觀看
導(dǎo)讀生成 jfrJDK飛行記錄器(JFR)是一種結(jié)構(gòu)化日志記錄工具, 它記錄廣泛的系統(tǒng)級(jí)(system-level)事件。類似于飛機(jī)上的黑盒子,它會(huì)持續(xù)記錄飛行數(shù)據(jù),用于調(diào)查飛行事故。JFR會(huì)持續(xù)記錄JVM中的 一系列事件,用于診斷問題。這種方式

yL528資訊網(wǎng)——每日最新資訊28at.com

生成 jfr

JDK飛行記錄器(JFR)是一種結(jié)構(gòu)化日志記錄工具, 它記錄廣泛的系統(tǒng)級(jí)(system-level)事件。類似于飛機(jī)上的黑盒子,它會(huì)持續(xù)記錄飛行數(shù)據(jù),用于調(diào)查飛行事故。JFR會(huì)持續(xù)記錄JVM中的 一系列事件,用于診斷問題。這種方式的優(yōu)勢是,它會(huì)按時(shí)間順序,捕獲導(dǎo)致事故的,詳細(xì)系統(tǒng)信息。JFR被設(shè)計(jì)的,對(duì)于性能影響很小,所以 可以安全地在生產(chǎn)環(huán)境長時(shí)間運(yùn)行。yL528資訊網(wǎng)——每日最新資訊28at.com

優(yōu)勢:yL528資訊網(wǎng)——每日最新資訊28at.com

  • 對(duì)于運(yùn)行系統(tǒng)的影響比較小,額外占用資源小于 1%
  • 生成的文件比較小,通常生成 10 多分鐘的文件往往小于 1G

查詢 java 進(jìn)程

通過 jps 命令查詢。yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

通過 ps -ef | grep java 查詢。yL528資訊網(wǎng)——每日最新資訊28at.com

生成 jfr 文件

生成飛行記錄,使用 JFR.start 該實(shí)用程序的診斷命令 jcmd。yL528資訊網(wǎng)——每日最新資訊28at.com

jcmd 84743 JFR.start duratinotallow=5m settings=profile filename=~/jfr/xxkk.jfr

JProfile 介紹

JProfiler是一個(gè)用于分析運(yùn)行JVM內(nèi)部情況的專業(yè)工具。在開發(fā)中你可以使用它,用于質(zhì)量保證,也可以解決你的生產(chǎn)系統(tǒng)遇到的問題。
JProfiler處理四個(gè)主要問題:yL528資訊網(wǎng)——每日最新資訊28at.com

  • 方法調(diào)用這通常被稱為"CPU分析"。方法調(diào)用可以通過不同的方式進(jìn)行測量和可視化, 分析方法調(diào)用可以幫助了解你的應(yīng)用程序正在做什么,并找到提高其性能的方法。
  • 分配分析堆上對(duì)象的分配、引用鏈和垃圾回收屬于"內(nèi)存分析"的范疇。這個(gè)功能可以讓你解決內(nèi)存泄漏,總之使用更少的內(nèi)存,分配更少的臨時(shí)對(duì)象。
  • 線程和鎖線程可以持有鎖,例如通過在一個(gè)對(duì)象上做同步。當(dāng)多個(gè)線程協(xié)作時(shí),可能會(huì)出現(xiàn)死鎖,JProfiler可以為你可視化這種情況。此外,鎖可能被爭用,這意味著線程在獲得鎖之前必須等待。通過JProfiler可以深入了解線程及其各種鎖情形。
  • 高層子系統(tǒng)許多性能問題發(fā)生在更高的語義層面。例如,對(duì)于JDBC調(diào)用,你可能想找出哪條SQL語句是最慢的。對(duì)于這樣的子系統(tǒng),JProfiler提供了"探針",將特定有效載荷附加到調(diào)用樹。

JProfiler的UI是一個(gè)桌面應(yīng)用程序。你可以以交互的方式實(shí)時(shí)分析JVM,也可以在不使用UI的情況下,自動(dòng)化分析。保存在快照中的分析數(shù)據(jù),可以通過JProfiler UI打開。此外,命令行工具和構(gòu)建工具集成可以幫助你自動(dòng)分析會(huì)話。yL528資訊網(wǎng)——每日最新資訊28at.com

注意:JProfile 是商業(yè)軟件,希望大家在使用的過程中購買正版授權(quán)yL528資訊網(wǎng)——每日最新資訊28at.com

內(nèi)存分析

記錄的對(duì)象

內(nèi)存分析中,可以通過記錄的對(duì)象找到最耗費(fèi)內(nèi)存的對(duì)象。只有總對(duì)象大小超過固定閾值(通常是堆的1%)的類才會(huì)被記錄。默認(rèn)情況下,JFR中禁用了這個(gè)功能,因?yàn)樗鼤?huì)引入大量的開銷。
下面兩個(gè)字段的解釋:yL528資訊網(wǎng)——每日最新資訊28at.com

  • **實(shí)例計(jì)數(shù)示例, **可以看到某個(gè)用例的堆上還剩下哪些對(duì)象(實(shí)際上會(huì)小于總大小除以每個(gè)對(duì)象的平均大小)。
  • 預(yù)估總大小,這個(gè)是一個(gè)預(yù)估值,預(yù)估在開始 jfr 記錄,到 jfr 記錄結(jié)束這個(gè)類的實(shí)例總大小

yL528資訊網(wǎng)——每日最新資訊28at.com

https://docs.oracle.com/en/java/javase/17/docs/specs/man/jfr.html。yL528資訊網(wǎng)——每日最新資訊28at.com

分配熱點(diǎn)

分配熱點(diǎn)視圖與分配調(diào)用樹一起,允許你直接關(guān)注負(fù)責(zé)創(chuàng)建所選類的方法。就像記錄的對(duì)象視圖,分配熱點(diǎn)視圖也支持標(biāo)記當(dāng)前狀態(tài)和觀察一段時(shí)間內(nèi)的差值。視圖中會(huì)添加一個(gè)差值列,它顯示了熱點(diǎn)自當(dāng)_標(biāo)記當(dāng)前值_操作被調(diào)用后的變化。因?yàn)槟J(rèn)情況下,分配視圖不會(huì)定期更新,所以你必須單擊_計(jì)算_工具欄按鈕以獲得一個(gè)新數(shù)據(jù)集然后與基線值比較。yL528資訊網(wǎng)——每日最新資訊28at.com

計(jì)算熱點(diǎn):yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

熱點(diǎn)分析:yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

熱點(diǎn)的分配類:yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

找到主要是因?yàn)?byte[] 數(shù)組分配,成為一個(gè)分配熱點(diǎn)方法。yL528資訊網(wǎng)——每日最新資訊28at.com

測試代碼

/** * VM ARG : -Xms64m -Xmx64m */public static void main(String[] args) throws InterruptedException {    List<byte[]> list = new ArrayList<>(1000);    //2kb * 10 * 120 = 2400kb    //數(shù)量 = 10 * 120 / 10 = 120    for (int i = 0; i < 10000; i++) {        Thread.sleep(100);        byte[] arr = new byte[1024 * 2];        list.add(arr);    }}

CPU 分析

調(diào)用樹

跟蹤所有的方法調(diào)用及其調(diào)用棧會(huì)消耗相當(dāng)大的內(nèi)存,短時(shí)間內(nèi)就會(huì)耗盡所有內(nèi)存。另外,在一個(gè)繁忙的JVM中,很難直觀獲得方法調(diào)用的數(shù)量。通常情況下,這個(gè)數(shù)字是如此之大,以至于定位和跟隨跟蹤是不可能的。
另一個(gè)方面,只有將收集到的數(shù)據(jù)進(jìn)行匯總,許多性能問題才會(huì)變得清晰。這樣,你就可以知道在某個(gè)時(shí)間段內(nèi),方法調(diào)用相對(duì)于整個(gè)活動(dòng)的重要性。如果是單一的跟蹤,你對(duì)你所看的數(shù)據(jù)的相對(duì)重要性沒有概念。
這就是為什么JProfiler建立了一個(gè)所有觀察到的調(diào)用堆棧的累積樹,并注解有觀察到的時(shí)間和調(diào)用次數(shù)。時(shí)間順序信息被消除,只保留總數(shù)。樹中的每個(gè)節(jié)點(diǎn)代表一個(gè)至少被觀察過一次的調(diào)用堆棧。節(jié)點(diǎn)的子節(jié)點(diǎn)代表在該調(diào)用堆棧中看到的所有傳出調(diào)用。
yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

調(diào)用樹是"CPU視圖"部分的第一個(gè)視圖,當(dāng)你開始進(jìn)行CPU分析時(shí),它是一個(gè)很好的起點(diǎn), 因?yàn)樽裱椒ㄕ{(diào)用從起點(diǎn)到最細(xì)化的終點(diǎn)的自上而下視圖,最容易理解。JProfiler按照子節(jié)點(diǎn)的總時(shí)間進(jìn)行排序,所以你可以深度優(yōu)先打開樹,分析對(duì)性能影響最大的部分。yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

熱點(diǎn)

如果你的應(yīng)用程序運(yùn)行得太慢,你要找到那些占用大部分時(shí)間的方法。通過調(diào)用樹,有時(shí)可以直接找到這些方法, 但通常這樣做是行不通的,因?yàn)檎{(diào)用樹可能很大而且有大量葉節(jié)點(diǎn)
在這種情況下,你需要反轉(zhuǎn)調(diào)用樹:一個(gè)所有方法的列表,按其總的自身時(shí)間排序,從所有不同的調(diào)用堆棧中累計(jì)出來, 并通過回溯跟蹤顯示這些方法是如何被調(diào)用的。在熱點(diǎn)樹中,葉節(jié)點(diǎn)是入口點(diǎn), 就像應(yīng)用程序的main 方法或線程的run 方法。從熱點(diǎn)樹中最深的節(jié)點(diǎn)開始,調(diào)用向上傳遞到頂層節(jié)點(diǎn)。yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

回溯跟蹤中的調(diào)用次數(shù)和執(zhí)行時(shí)間并不是指該方法節(jié)點(diǎn),而是指頂層熱點(diǎn)節(jié)點(diǎn)在這條路徑上被調(diào)用的次數(shù)。理解這一點(diǎn)很重要:粗略一看,你會(huì)認(rèn)為看到的節(jié)點(diǎn)上的信息是該節(jié)點(diǎn)的調(diào)用次數(shù)。然而,在熱點(diǎn)樹中,該信息顯示的是該節(jié)點(diǎn)對(duì)頂層節(jié)點(diǎn)的貢獻(xiàn)。所以,你必須這樣理解這些數(shù)字: 沿著這個(gè)倒置的調(diào)用堆棧,頂層熱點(diǎn)被調(diào)用了n 次,總持續(xù)時(shí)間為t 秒。yL528資訊網(wǎng)——每日最新資訊28at.com

yL528資訊網(wǎng)——每日最新資訊28at.com

通過這里可以看到這個(gè) CASE 是因?yàn)檎齽t導(dǎo)致的 CPU 熱點(diǎn)。yL528資訊網(wǎng)——每日最新資訊28at.com

測試代碼

static String pattern = " ^([//u4e00-//u9fa5]+)((·[//u4e00-//u9fa5]+)+|([//u4e00-//u9fa5]+))$";static String defaultName = "張三·無論其是看都看吶阿斯頓啊·薩肯薩肯打開你發(fā)都看啊看你發(fā)個(gè)卡看那可能發(fā)看那個(gè)可能看吶";public static void main(String[] args) throws InterruptedException {    int time = 1;    String result;    while (true) {        if (time > 0) {            Thread.sleep(time);        }        result = defaultName.matches(pattern) ? "姓名合法" : "姓名不合法";    }}

參考文檔

  • jcmd 指令詳解:https://docs.oracle.com/javacomponents/jmc-5-5/jfr-command-reference/diagnostic-command-reference.htm。
  • 生成 jfr 文件:https://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/run.htm。
  • jprofile 中文手冊(cè):https://www.ej-technologies.com/resources/jprofiler/v/13.0/help_zh_CN/doc/main/memory.html。

本文鏈接:http://www.www897cc.com/showinfo-26-80887-0.htmlJVM 性能調(diào)優(yōu)之通過 JProfile 和 JFR 分析系統(tǒng)瓶頸提升系統(tǒng)性能

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Go 開發(fā)踩過的那些坑,你踩過幾個(gè)?

下一篇: 利用生成對(duì)抗性網(wǎng)絡(luò)進(jìn)行欺詐檢測

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 永登县| 琼结县| 集安市| 涟水县| 靖边县| SHOW| 栾川县| 峨眉山市| 邵阳市| 炎陵县| 景谷| 敦煌市| 平阳县| 东丽区| 章丘市| 廊坊市| 和顺县| 绥化市| 开封县| 雷山县| 正安县| 呼和浩特市| 镇巴县| 板桥市| 布尔津县| 高邮市| 海原县| 五河县| 清水河县| 新蔡县| 阳江市| 密山市| 瓮安县| 海伦市| 建平县| 玛多县| 巴东县| 师宗县| 三门县| 凌云县| 察哈|