整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JVM 性能調優之通過 JProfile 和 JFR

          JVM 性能調優之通過 JProfile 和 JFR 分析系統瓶頸提升系統性能

          成 jfr

          JDK飛行記錄器(JFR)是一種結構化日志記錄工具, 它記錄廣泛的系統級(system-level)事件。類似于飛機上的黑盒子,它會持續記錄飛行數據,用于調查飛行事故。JFR會持續記錄JVM中的 一系列事件,用于診斷問題。這種方式的優勢是,它會按時間順序,捕獲導致事故的,詳細系統信息。JFR被設計的,對于性能影響很小,所以 可以安全地在生產環境長時間運行。

          優勢:

          1. 對于運行系統的影響比較小,額外占用資源小于 1%
          2. 生成的文件比較小,通常生成 10 多分鐘的文件往往小于 1G

          查詢 java 進程

          1. 通過 jps 命令查詢
          image.png
          1. 通過 ps -ef | grep java 查詢

          生成 jfr 文件

          生成飛行記錄,使用 JFR.start 該實用程序的診斷命令 jcmd。

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


          JProfile 介紹

          JProfiler是一個用于分析運行JVM內部情況的專業工具。在開發中你可以使用它,用于質量保證,也可以解決你的生產系統遇到的問題。
          JProfiler處理四個主要問題:

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

          JProfiler的UI是一個桌面應用程序。你可以以交互的方式實時分析JVM,也可以在不使用UI的情況下,自動化分析。保存在快照中的分析數據,可以通過JProfiler UI打開。此外,命令行工具和構建工具集成可以幫助你自動分析會話。

          注意:JProfile 是商業軟件,希望大家在使用的過程中購買正版授權

          內存分析

          記錄的對象

          內存分析中,可以通過記錄的對象找到最耗費內存的對象。只有總對象大小超過固定閾值(通常是堆的1%)的類才會被記錄。默認情況下,JFR中禁用了這個功能,因為它會引入大量的開銷。
          下面兩個字段的解釋:

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


          https://docs.oracle.com/en/java/javase/17/docs/specs/man/jfr.html

          分配熱點

          分配熱點視圖與分配調用樹一起,允許你直接關注負責創建所選類的方法。就像記錄的對象視圖,分配熱點視圖也支持標記當前狀態和觀察一段時間內的差值。視圖中會添加一個差值列,它顯示了熱點自當_標記當前值_操作被調用后的變化。因為默認情況下,分配視圖不會定期更新,所以你必須單擊_計算_工具欄按鈕以獲得一個新數據集然后與基線值比較。

          1. 計算熱點
          image.png
          1. 熱點分析
          image.png
          1. 熱點的分配類
          image.png

          找到主要是因為 byte[] 數組分配,成為一個分配熱點方法。

          測試代碼

          /**
          * VM ARG : -Xms64m -Xmx64m
          */

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


          CPU 分析

          調用樹

          跟蹤所有的方法調用及其調用棧會消耗相當大的內存,短時間內就會耗盡所有內存。另外,在一個繁忙的JVM中,很難直觀獲得方法調用的數量。通常情況下,這個數字是如此之大,以至于定位和跟隨跟蹤是不可能的。
          另一個方面,只有將收集到的數據進行匯總,許多性能問題才會變得清晰。這樣,你就可以知道在某個時間段內,方法調用相對于整個活動的重要性。如果是單一的跟蹤,你對你所看的數據的相對重要性沒有概念。
          這就是為什么JProfiler建立了一個所有觀察到的調用堆棧的累積樹,并注解有觀察到的時間和調用次數。時間順序信息被消除,只保留總數。樹中的每個節點代表一個至少被觀察過一次的調用堆棧。節點的子節點代表在該調用堆棧中看到的所有傳出調用。

          調用樹是"CPU視圖"部分的第一個視圖,當你開始進行CPU分析時,它是一個很好的起點, 因為遵循方法調用從起點到最細化的終點的自上而下視圖,最容易理解。JProfiler按照子節點的總時間進行排序,所以你可以深度優先打開樹,分析對性能影響最大的部分。

          熱點

          如果你的應用程序運行得太慢,你要找到那些占用大部分時間的方法。通過調用樹,有時可以直接找到這些方法, 但通常這樣做是行不通的,因為調用樹可能很大而且有大量葉節點
          在這種情況下,你需要反轉調用樹:一個所有方法的列表,按其總的自身時間排序,從所有不同的調用堆棧中累計出來, 并通過回溯跟蹤顯示這些方法是如何被調用的。在熱點樹中,葉節點是入口點, 就像應用程序的main 方法或線程的run 方法。從熱點樹中最深的節點開始,調用向上傳遞到頂層節點。


          回溯跟蹤中的調用次數和執行時間并不是指該方法節點,而是指頂層熱點節點在這條路徑上被調用的次數。理解這一點很重要:粗略一看,你會認為看到的節點上的信息是該節點的調用次數。然而,在熱點樹中,該信息顯示的是該節點對頂層節點的貢獻。所以,你必須這樣理解這些數字: 沿著這個倒置的調用堆棧,頂層熱點被調用了n 次,總持續時間為t 秒。

          通過這里可以看到這個 CASE 是因為正則導致的 CPU 熱點

          測試代碼

          static String pattern=" ^([\u4e00-\u9fa5]+)((·[\u4e00-\u9fa5]+)+|([\u4e00-\u9fa5]+))$";
          static String defaultName="張三·無論其是看都看吶阿斯頓啊·薩肯薩肯打開你發都看啊看你發個卡看那可能發看那個可能看吶";

          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 中文手冊:https://www.ej-technologies.com/resources/jprofiler/v/13.0/help_zh_CN/doc/main/memory.html

          從學了Python了之后,不停的在練習,今天就拿百度練下手爬取實時熱點,需要用的庫有requests_html 非常的簡單! 程序運行結果如下圖:

          這里要簡單說下:用到了css選擇器,選擇list-title的元素對象,還有需要注意的是這里百度的頁面需要編碼,因為不是UTF-8的! r.encoding=r.apparent_encoding 用這個即可解決! 獲取的鏈接是一個集合,我們只需要for 遍歷輸出即可!

          下面附上源代碼,如有不足的地方歡迎大神指出!學無止境,讓我們一起學習Python吧!

          tml 的結構部分標簽



          二、網頁常見的結構


          header 標簽 --- 頭部分結構

          nav 標簽 --- 導航條部分結構

          main 標簽 --- 主核心部分內容

          footer 標簽 --- 頁尾


          01.代碼示例:

          <body>


          <header>...</header>

          <nav>...</nav>

          <main>...</main>

          <footer>...</footer>


          </body>


          02.以上源代碼使用 DOM(文件對象模型)表示:


          body

          header

          nav

          main

          footer


          03. header 與 footer 用法


          header --- 指整個網頁/或某個區塊的頭部。

          一定會包含該區塊的標題

          可能會包含該區塊的副標題、版本、署名等等


          footer --- 表示整個網頁/或某個區塊的腳部

          可能包括版權信息、參考資源、附注等等


          小結:

          頭是header,腳是footer。

          header 和 footer 都可能多次出現,但它們的級別是不同的。


          04.nav(navgation 導航) --- 包含一組鏈接,連接至網站其它主要頁面。


          nav 標簽 與 header 標簽的關系

          不建議將nav放置在header內


          頭部/header是從上下文邏輯關系上來說的,并不一定是視覺設計中擺在頂上的內


          容,所以一般不會包含nav。


          小結:

          導航 navigation包含一組鏈接,指向網站的其他主要欄目。

          nav和header通常是互相獨立的并列關系。

          nav可能在頁面中多次出現,分別指主導航、二級導航等等。


          05.main 標簽和 aside 標簽


          main --- 代表網頁中的主要內容/主結構

          不會包含網站的主導航條、網站總標題和網站總頁腳,但可能包含次一級別的


          header/van/footer。


          *注:每個網頁最多只有一個main


          main 不可能是以下元素的后代:


          article(文章標簽)、aside(附屬內容標簽)、footer(網頁標簽)、deader(頭部標簽) 或


          nav(導航標簽)


          aside(附屬內容)

          附屬內容

          如果刪除,影響不大

          應與主內容main相關

          aside有時被翻譯成"側邊",這種翻譯是不準確的。


          代碼示例:

          <body>


          <header>...</header>

          <nav>...</nav>

          <main>

          </main>

          <aside></aside>

          <footer>...</footer>

          </body>


          按 DOM(文件對象模型)構建 html :


          body

          header

          nav

          main

          aside

          footer


          小結:

          01.主內容main,每個頁面只有一個,指該頁面專屬的內容塊,區別于網站的其他頁面。


          02.附屬內容aside,與主內容有一些聯系,如果被刪除,對網頁的閱讀沒有明顯影響。


          06. article 標簽與 section 標簽


          article 是一篇完整的文章,代表頁面中獨立的、完整的、可以獨自被外部引用的內容。


          注意:header/footer/nav都可能出現在article中,作為文章自身的頭、尾與文章內部導航。


          section (片段或章節) :


          無法獨立成文,通常性屬于 article 的一部分,該片段里的開始部分仍有一個自然標題以


          及相關內容。


          section 也可能是main的子元素。


          07.關于 id :

          唯一標識符,同一頁面里id不得重復,以半角英文字母開頭,不含特殊字符與空格,描述職能


          ,不描述樣式。


          小結:

          01.article 是一篇獨立的完整的文章,可以被外界引用的。


          02.section 可以是 article 中的一個章節,也可以是主內容中的一個區塊。


          03.不管是 article 還是 section , 第一個子元素總是標題(header 或 h1)。


          08. div 標簽(部門、分塊)


          div --- 根據職能的不同,劃分出特定的一塊區域,常常結合id屬性使用。


          示例:

          <header>

          <h1>internet...</h1>

          </header>

          <div id="today">...</div> ---今日熱點功能區域

          <div id="login">...</div> ---登陸相關功能區域

          <div id="search">...</div> ---搜索功能區域


          article、section、div 的區別:


          aricle:文章

          如果上下文能聯合組成一個有意義的獨立文章;應優先使用 article


          section:片段,章節

          無法使用article時,該片段里的開始部分仍有一個自然標題,和相關內容。


          div:部門、分塊

          在無法使用article/section/aside等時,仍承擔著特定功能的分塊。


          小結:

          在無法使用article/section/aside等時,仍承擔著特定功能的分塊,就可以使用 div 標簽。

          div標簽和section標簽一樣,常常帶有id屬性。


          主站蜘蛛池模板: 无码人妻久久一区二区三区蜜桃| 美女毛片一区二区三区四区| 久久久久无码国产精品一区| 成人日韩熟女高清视频一区| 麻豆一区二区免费播放网站| 国产成人精品无人区一区| 亚洲A∨无码一区二区三区| 国产日韩精品一区二区三区| 国产午夜福利精品一区二区三区| 国产高清在线精品一区| 国产一区二区三区精品视频| 无码日韩AV一区二区三区| 无码aⅴ精品一区二区三区浪潮| 国产日韩视频一区| 波多野结衣一区二区| 国产精品高清一区二区三区| 性色AV一区二区三区无码| 欧洲精品码一区二区三区免费看 | 人妻av无码一区二区三区| 亚洲日本一区二区| 亚洲AV无码一区二区三区DV | 性色av闺蜜一区二区三区| 天天看高清无码一区二区三区| 国产精品一区在线麻豆| 制服中文字幕一区二区| 一区二区三区日本电影| 日本免费精品一区二区三区| 亚洲综合无码一区二区痴汉| 老熟女五十路乱子交尾中出一区| 亚洲色一区二区三区四区 | 日本视频一区二区三区| 国产一区二区成人| 亚洲综合在线成人一区| 国产福利电影一区二区三区,日韩伦理电影在线福 | 国产成人AV一区二区三区无码| 免费国产在线精品一区| 国产成人精品一区二三区| 国产品无码一区二区三区在线| 在线精品亚洲一区二区| 中文无码一区二区不卡αv| 成人免费观看一区二区|