本文首先介紹了靜態(tài)代碼分析的基本概念及主要技術(shù),隨后分別介紹了現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs,PMD,Jtest),最后從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應用到軟件開發(fā)中。
創(chuàng)新互聯(lián)致力于網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計,成都網(wǎng)站設(shè)計,集團網(wǎng)站建設(shè)等服務(wù)標準化,推過標準化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián),就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
引言
在 Java 軟件開發(fā)過程中,開發(fā)團隊往往要花費大量的時間和精力發(fā)現(xiàn)并修改代碼缺陷。Java 靜態(tài)代碼分析(static code analysis)工具能夠在代碼構(gòu)建過程中幫助開發(fā)人員快速、有效的定位代碼缺陷并及時糾正這些問題,從而極大地提高軟件可靠性并節(jié)省軟件開發(fā)和測試成 本。目前市場上的 Java 靜態(tài)代碼分析工具種類繁多且各有千秋,因此本文將分別介紹現(xiàn)有 4 種主流 Java 靜態(tài)代碼分析工具 (Checkstyle,F(xiàn)indBugs,PMD,Jtest),并從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟件開發(fā)人員了解靜態(tài)代碼分析工具,并選擇合適的工具應用到軟件開發(fā)中。
靜態(tài)代碼分析工具簡介
什么是靜態(tài)代碼分析
靜態(tài)代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結(jié)構(gòu)、過程、接口等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數(shù)不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現(xiàn)的空指針引用等等。
在軟件開發(fā)過程中,靜態(tài)代碼分析往往先于動態(tài)測試之前進行,同時也可以作為制定動態(tài)測試用例的參考。統(tǒng)計證明,在整個軟件開發(fā)生命周期中,30% 至 70% 的代碼邏輯設(shè)計和編碼缺陷是可以通過靜態(tài)代碼分析來發(fā)現(xiàn)和修復的。
但是,由于靜態(tài)代碼分析往往要求大量的時間消耗和相關(guān)知識的積累,因此對于軟件開發(fā)團隊來說,使用靜態(tài)代碼分析工具自動化執(zhí)行代碼檢查和分析,能夠極大地提高軟件可靠性并節(jié)省軟件開發(fā)和測試成本。
靜態(tài)代碼分析工具的優(yōu)勢
1. 幫助程序開發(fā)人員自動執(zhí)行靜態(tài)代碼分析,快速定位代碼隱藏錯誤和缺陷。
2. 幫助代碼設(shè)計人員更專注于分析和解決代碼設(shè)計缺陷。
3. 顯著減少在代碼逐行檢查上花費的時間,提高軟件可靠性并節(jié)省軟件開發(fā)和測試成本。
Java 靜態(tài)代碼分析理論基礎(chǔ)和主要技術(shù)
缺陷模式匹配:缺陷模式匹配事先從代碼分析經(jīng)驗中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進行模式匹配,從而完成軟件的安全分析。這種方式的優(yōu)點是簡單方便,但是要求內(nèi)置足夠多缺陷模式,且容易產(chǎn)生誤報。
類型推斷:類型推斷技術(shù)是指通過對代碼中運算對象類型進行推理,從而保證代碼中每條語句都針對正確的類型執(zhí)行。這種技術(shù)首先將預定義一套類型機制,包括類 型等價、類型包含等推理規(guī)則,而后基于這一規(guī)則進行推理計算。類型推斷可以檢查代碼中的類型錯誤,簡單,高效,適合代碼缺陷的快速檢測。
模型檢查:模型檢驗建立于有限狀態(tài)自動機的概念基礎(chǔ)之上,這一理論將被分析代碼抽象為一個自動機系統(tǒng),并且假設(shè)該系統(tǒng)是有限狀態(tài)的、或者是可以通過抽象歸 結(jié)為有限狀態(tài)。模型檢驗過程中,首先將被分析代碼中的每條語句產(chǎn)生的影響抽象為一個有限狀態(tài)自動機的一個狀態(tài),而后通過分析有限狀態(tài)機從而達到代碼分析的 目的。模型檢驗主要適合檢驗程序并發(fā)等時序特性,但是對于數(shù)據(jù)值域數(shù)據(jù)類型等方面作用較弱。
數(shù)據(jù)流分析:數(shù)據(jù)流分析也是一種軟件驗證技術(shù),這種技術(shù)通過收集代碼中引用到的變量信息,從而分析變量在程序中的賦值、引用以及傳遞等情況。對數(shù)據(jù)流進行 分析可以確定變量的定義以及在代碼中被引用的情況,同時還能夠檢查代碼數(shù)據(jù)流異常,如引用在前賦值在后、只賦值無引用等。數(shù)據(jù)流分析主要適合檢驗程序中的 數(shù)據(jù)域特性。
現(xiàn)有主流 Java 靜態(tài)分析工具
Checkstyle
Checkstyle 是 SourceForge 的開源項目,通過檢查對代碼編碼格式,命名約定,Javadoc,類設(shè)計等方面進行代碼規(guī)范和風格的檢查,從而有效約束開發(fā)人員更好地遵循代碼編寫規(guī)范。
Checkstyle 提供了支持大多數(shù)常見 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下圖 1 所示,Checkstyle 對代碼進行編碼風格檢查,并將檢查結(jié)果顯示在 Problems 視圖中。圖中,代碼編輯器中每個放大鏡圖標表示一個 Checkstyle 找到的代碼缺陷。開發(fā)人員可通過在 Problems 視圖中查看錯誤或警告詳細信息。
圖 1. 使用 Checkstyle 進行編碼風格檢查
此外,Checkstyle 支持用戶根據(jù)需求自定義代碼檢查規(guī)范,在下圖 2 中的配置面板中,用戶可以在已有檢查規(guī)范如命名約定,Javadoc,塊,類設(shè)計等方面的基礎(chǔ)上添加或刪除自定義檢查規(guī)范。
圖 2. 使用 Checkstyle 添加自定義代碼檢查規(guī)范
FindBugs
FindBugs 是由馬里蘭大學提供的一款開源 Java 靜態(tài)代碼分析工具。FindBugs 通過檢查類文件或 JAR 文件,將字節(jié)碼與一組缺陷模式進行對比從而發(fā)現(xiàn)代碼缺陷,完成靜態(tài)代碼分析。FindBugs 既提供可視化 UI 界面,同時也可以作為 Eclipse 插件使用。文本將主要使用將 FindBugs 作為 Eclipse 插件。在安裝成功后會在 eclipse 中增加 FindBugs perspective,用戶可以對指定 Java 類或 JAR 文件運行 FindBugs,此時 FindBugs 會遍歷指定文件,進行靜態(tài)代碼分析,并將代碼分析結(jié)果顯示在 FindBugs perspective 的 bugs explorer 中,如下圖 3 所示:
圖 3. 使用 FindBugs 進行靜態(tài)代碼分析
圖中 Bug Explorer 中的灰色圖標處為 Bug 類型,每種分類下紅色圖標表示 bug 較為嚴重,黃色的圖標表示 bug 為警告程度。Propreties 列出了 bug 的描述信息及修改方案。
此外,F(xiàn)indBugs 還為用戶提供定制 Bug Pattern 的功能。用戶可以根據(jù)需求自定義 FindBugs 的代碼檢查條件,如下圖 4 所示:
圖 4. 使用 FindBugs 添加自定義代碼檢查規(guī)范
PMD
PMD 是由 DARPA 在 SourceForge 上發(fā)布的開源 Java 代碼靜態(tài)分析工具。PMD 通過其內(nèi)置的編碼規(guī)則對 Java 代碼進行靜態(tài)檢查,主要包括對潛在的 bug,未使用的代碼,重復的代碼,循環(huán)體創(chuàng)建新對象等問題的檢驗。PMD 提供了和多種 Java IDE 的集成,例如 Eclipse,IDEA,NetBean 等。本文主要使用 PMD 以插件方式與 Eclipse 集成。如下圖 5 所示:在 Violations Overview 視圖中,按照代碼缺陷嚴重性集中顯示了 PMD 靜態(tài)代碼分析的結(jié)果。
圖 5. 使用 PMD 進行靜態(tài)代碼分析
PMD 同樣也支持開發(fā)人員對代碼檢查規(guī)范進行自定義配置。開發(fā)人員可以在下圖 6 中的面板中添加、刪除、導入、導出代碼檢查規(guī)范。
圖 6. 使用 PMD 添加自定義代碼檢查規(guī)范
Jtest
Jtest 是 Parasoft 公司推出的一款針對 Java 語言的自動化代碼優(yōu)化和測試工具,Jtest 的靜態(tài)代碼分析功能能夠按照其內(nèi)置的超過 800 條的 Java 編碼規(guī)范自動檢查并糾正這些隱蔽且難以修復的編碼錯誤。同時,還支持用戶自定義編碼規(guī)則,幫助用戶預防一些特殊用法的錯誤。Jtest 提供了基于 Eclipse 的插件安裝。Jtest 支持開發(fā)人員對 Java 代碼進行編碼規(guī)范檢查,并在 Jtask 窗口中集中顯示檢查結(jié)果,如下圖 7 所示:
圖 7. 使用 Jtest 進行靜態(tài)代碼分析
同時,Jtest 還提供了對用戶定制代碼檢查配置甚至自定義編碼規(guī)則的支持,這一功能使得開發(fā)人員可以基于不同場景定制所需要的編碼規(guī)范,如圖 8 所示:
圖 8. 使用 Jtest 添加自定義代碼檢查規(guī)范
Java 靜態(tài)分析工具對比
本章節(jié)將從以下幾個方面對上述 Java 靜態(tài)分析工具進行比較:
應用技術(shù)及分析對象
下表 1 列出了不同工具的分析對象及應用技術(shù)對比:
表 1. 不同工具的分析對象及應用技術(shù)對比
Java 靜態(tài)分析工具
分析對象
應用技術(shù)
Checkstyle ? ?Java 源文件 ? ?缺陷模式匹配 ?
FindBugs ? ?字節(jié)碼 ? ?缺陷模式匹配;數(shù)據(jù)流分析 ?
PMD ? ?Java 源代碼 ? ?缺陷模式匹配 ?
Jtest ? ?Java 源代碼 ? ?缺陷模式匹配;數(shù)據(jù)流分析 ?
內(nèi)置編程規(guī)范
Checkstyle:
Javadoc 注釋:檢查類及方法的 Javadoc 注釋
命名約定:檢查命名是否符合命名規(guī)范
標題:檢查文件是否以某些行開頭
Import 語句:檢查 Import 語句是否符合定義規(guī)范
代碼塊大小,即檢查類、方法等代碼塊的行數(shù)
空白:檢查空白符,如 tab,回車符等
修飾符:修飾符號的檢查,如修飾符的定義順序
塊:檢查是否有空塊或無效塊
代碼問題:檢查重復代碼,條件判斷,魔數(shù)等問題
類設(shè)計:檢查類的定義是否符合規(guī)范,如構(gòu)造函數(shù)的定義等問題
FindBugs:
Bad practice 壞的實踐:常見代碼錯誤,用于靜態(tài)代碼檢查時進行缺陷模式匹配
Correctness 可能導致錯誤的代碼,如空指針引用等
國際化相關(guān)問題:如錯誤的字符串轉(zhuǎn)換
可能受到的惡意攻擊,如訪問權(quán)限修飾符的定義等
多線程的正確性:如多線程編程時常見的同步,線程調(diào)度問題。
運行時性能問題:如由變量定義,方法調(diào)用導致的代碼低效問題。
PMD:
可能的 Bugs:檢查潛在代碼錯誤,如空 try/catch/finally/switch 語句
未使用代碼(Dead code):檢查未使用的變量,參數(shù),方法
復雜的表達式:檢查不必要的 if 語句,可被 while 替代的 for 循環(huán)
重復的代碼:檢查重復的代碼
循環(huán)體創(chuàng)建新對象:檢查在循環(huán)體內(nèi)實例化新對象
資源關(guān)閉:檢查 Connect,Result,Statement 等資源使用之后是否被關(guān)閉掉
Jtest
可能的錯誤:如內(nèi)存破壞、內(nèi)存泄露、指針錯誤、庫錯誤、邏輯錯誤和算法錯誤等
未使用代碼:檢查未使用的變量,參數(shù),方法
初始化錯誤:內(nèi)存分配錯誤、變量初始化錯誤、變量定義沖突
命名約定:檢查命名是否符合命名規(guī)范
Javadoc 注釋:檢查類及方法的 Javadoc 注釋
線程和同步:檢驗多線程編程時常見的同步,線程調(diào)度問題
國際化問題:
垃圾回收:檢查變量及 JDBC 資源是否存在內(nèi)存泄露隱患
錯誤檢查能力
為比較上述 Java 靜態(tài)分析工具的代碼缺陷檢測能力,本文將使用一段示例代碼進行試驗,示例代碼中將涵蓋我們開發(fā)中的幾類常見錯誤,如引用操作、對象操作、表達式復雜化、數(shù) 組使用、未使用變量或代碼段、資源回收、方法調(diào)用及代碼設(shè)計幾個方面。最后本文將分別記錄在默認檢查規(guī)范設(shè)置下,不同工具對該示例代碼的分析結(jié)果。以下為 示例代碼 Test.java。其中,代碼的注釋部分列舉了代碼中可能存在的缺陷。
清單 1. Test.java 示例代碼
package Test;import java.io.*;public class Test {/** ? ? * Write the bytes from input stream to output stream. ? ? * The input stream and output stream are not closed. ? ? * @param is ? ? * @param os ? ? * @throws IOException ? ? */public boolean copy(InputStream is, OutputStream os)throws IOException {intcount = 0;//缺少空指針判斷byte[] buffer =new byte[1024];while((count = is.read(buffer)) = 0) {os.write(buffer,0, count);}//未關(guān)閉I/O流returntrue;}/** ? ? * ? ? * @param a ? ? * @param b ? ? * @param ending ? ? * @return copy the elements from a to b, and stop when meet element ending ? ? */publicvoid copy(String[] a, String[] b, String ending){intindex;String temp =null;//空指針錯誤System.out.println(temp.length());//未使用變量intlength=a.length;for(index=0; indexa.length; index++){//多余的if語句if(true){//對象比較 應使用equalsif(temp==ending){break;}//缺少 數(shù)組下標越界檢查b[index]=temp;}}}/**? ? ?*? ? ?* @param file? ? ?* @return file contents as stri if file does not exist? ? ?*/public void? readFile(File file) {InputStream is =null;OutputStream os =null;try{is =new BufferedInputStream(newFileInputStream(file));os =new ByteArrayOutputStream();//未使用方法返回值copy(is,os);is.close();os.close();}catch (IOException e) {//可能造成I/O流未關(guān)閉e.printStackTrace();}finally{//空的try/catch/finally塊}}}
通過以上測試代碼,我們對已有 Java 靜態(tài)代碼分析工具的檢驗結(jié)果做了如下比較,如下表 2 所示。
表 2. Java 靜態(tài)代碼分析工具對比
代碼缺陷分類
示例
Checkstyle
FindBugs
PMD
Jtest
引用操作 ? ?空指針引用 ? ?√ ? ?√ ? ?√ ? ?√ ?
對象操作 ? ?對象比較(使用 == 而不是 equals) ? ?? ? ?√ ? ?√ ? ?√ ?
表達式復雜化 ? ?多余的 if 語句 ? ?? ? ?? ? ?√ ? ?? ?
數(shù)組使用 ? ?數(shù)組下標越界 ? ?? ? ?? ? ?? ? ?√ ?
未使用變量或代碼段 ? ?未使用變量 ? ?? ? ?√ ? ?√ ? ?√ ?
資源回收 ? ?I/O 未關(guān)閉 ? ?? ? ?√ ? ?? ? ?√ ?
方法調(diào)用 ? ?未使用方法返回值 ? ?? ? ?√ ? ?? ? ?? ?
代碼設(shè)計 ? ?空的 try/catch/finally 塊 ? ?? ? ?? ? ?√ ? ?? ?
由表中可以看出幾種工具對于代碼檢查各有側(cè)重。其中,Checkstyle 更偏重于代碼編寫格式,及是否符合編碼規(guī)范的檢驗,對代碼 bug 的發(fā)現(xiàn)功能較弱;而 FindBugs,PMD,Jtest 著重于發(fā)現(xiàn)代碼缺陷。在對代碼缺陷檢查中,這三種工具在針對的代碼缺陷類別也各有不同,且類別之間有重疊。
總結(jié)
本文分別從功能、特性和內(nèi)置編程規(guī)范等方面詳細介紹了包括 Checkstyle,F(xiàn)indBugs,PMD,Jtest 在內(nèi)的四種主流 Java 靜態(tài)代碼分析工具,并通過一段 Java 代碼示例對這四種工具的代碼分析能力進行比較。由于這四種工具內(nèi)置編程規(guī)范各有不同,因此它們對不同種類的代碼問題的發(fā)現(xiàn)能力也有所不同。其中 Checkstyle 更加偏重于代碼編寫格式檢查,而 FindBugs,PMD,Jtest 著重于發(fā)現(xiàn)代碼缺陷。最后,希望本文能夠幫助 Java 軟件開發(fā)和測試人員進一步了解以上四種主流 Java 靜態(tài)分析工具,并幫助他們根據(jù)需求選擇合適的工具。
Code Review中文應該譯作“代碼審查”或是“代碼評審”,這是一個流程,當開發(fā)人員寫好代碼后,需要讓別人來review一下他的代碼,這是一種有效發(fā)現(xiàn)BUG的方法。由此,我們可以審查代碼的風格、邏輯、思路……,找出問題,以及改進代碼。因為這是代碼剛剛出爐的時候,所以,這也是代碼重構(gòu),代碼調(diào)整,代碼修改的最佳時候。所以,Code Review是編碼實現(xiàn)中最最重要的一個環(huán)節(jié)。長時間以來,Code Review需要有一些有效的工具來支持,這樣我們就可以更容易,更有效率地來進行代碼審查工作。下面是5個開源的代碼審查工具,他們可以幫助你更容易地進行這項活動。1. Review board: Review board 是一個 基于web 的工具,主要設(shè)計給 django 和python的用戶。 Review board 可以幫助我們追蹤待決代碼的改動,并可以讓Code-Review更為容易和簡練。盡管Review board 最初被設(shè)計在VMware項目中使用,但現(xiàn)在其足夠地通用。當前,其支持這些代碼版本管理軟件: SVN, CVS, Perforce, Git, Bazaar, 和Mercurial.Yahoo 是review-board的其中一個用戶。“Review board 已經(jīng)改變了代碼評審的方式,其可以強迫高質(zhì)量的代碼標準和風格,并可以成為程序員編程的指導者。每一次,當你訪問search.yahoo.com 時,其代碼都是使用 Review board工具Review過的。 We’re great fans of your work!”– Yahoo! Web Search 2. Codestriker: Codestriker 也是一個基于Web的應用,其主要使用 GCI-Perl 腳本支持在線的代碼審查。Codestriker 可以集成于CVS, Subversion, ClearCase, Perforce 和Visual SourceSafe。并有一些插件可以提供支持其它的源碼管理工具。David Sitsky 是 Codestriker 的作者,并也是最活躍的開發(fā)人員之一。 Jason Remillard 是另一個活路的開發(fā)者,并給這個項目提供了最深遠最有意義的貢獻。大量的程序員貢獻他們的代碼給 Codestriker 項目,導致了這個項目空前的繁榮。 3. Groogle: Groogle 是一個基于WEB的代碼評審工具。 Groogle 支持和 Subversion 集成。它主要提供如下的功能:各式各樣語言的語法高亮。 支持整個版本樹的比較。 支持當個文件不同版本的diff功能,并有一個圖形的版本樹。 郵件通知所有的Reivew的人當前的狀態(tài)。 認證機制。 4. Rietveld: Rietveld 由Guido van Rossum 開發(fā)(他是Python的創(chuàng)造者,現(xiàn)在是Google的員工),這個工具是基于Mondrian 工具,作者一開始是為了Google 開發(fā)的,并且,它在很多方面和Review board 很像。它也是一個基于Web的應用,并可以Google App Engine 當主機。它使用了目前最流行的Web開發(fā)框架 django 并支持 Subversion 。當前,任何一個使用 Google Code 的項目都可以使用 Rietveld 并且使用 python Subversion 服務(wù)器。當然,它同樣支持其它的Subversion服務(wù)器。 5. JCR JCR 或者叫做 JCodeReview 也是一個基于WEB界面的最初設(shè)計給Reivew Java 語言的一個工具。當然,現(xiàn)在,它可以被用于其它的非Java的代碼。JCR 主要想?yún)f(xié)助:審查者。所有的代碼更改都會被高亮,以及大多數(shù)語言的語法高亮。Code extracts 可以顯示代碼評審意見。如果你正在Review Java的代碼,你可以點擊代碼中的類名來查看相關(guān)的類的聲明。 項目所有者??梢?輕松創(chuàng)建并配置需要Review的項目,并不需要集成任何的軟件配置管理系統(tǒng)(SCM)。 流程信仰者。 所有的評語都會被記錄在數(shù)據(jù)庫中,并且會有狀態(tài)報告,以及各種各樣的統(tǒng)計。 架構(gòu)師和開發(fā)者。 這個系統(tǒng)也可以讓我們查看屬于單個文件的評語,這樣有利于我們重構(gòu)代碼。
Arthas 是Alibaba開源的Java診斷工具。當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception?
我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
是否有一個全局視角來查看系統(tǒng)的運行狀況?
有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
怎么快速定位應用的熱點,生成火焰圖?
Arthas支持jdk6+,多種系統(tǒng)版本,采用命令行交互模式,同時提供豐富的tab自動補全功能,進一步方便我們進行問題的定位和診斷
1.2、快速安裝
1.2.1、Linux下按
下載arthas-boot.jar,在使用java -jar方式啟動即可。
命令
**注意:**在進行第二條命令之前,先運行一個Java程序在內(nèi)存之中,否則會報錯
2、快速入門
2.1、attach一個進程
目標:
1、執(zhí)行一個jar包
2、通過arthas來attach來追蹤
3、進行常用的命令操作
如果端口號被占用,也可以通過命令換成另一個端口號執(zhí)行。
總結(jié):
1、啟動進程
2、啟動arthas-boot.jar,進入啟動的進程
3、不但可以通過命令行的方式來操作arthas也可以通過瀏覽器來訪問arthas
2.2、常用命令接觸
1、dashboard儀表板
2、通過thread命令來獲取到arthas-demo進程的Main Class
3、通過jad來反編譯Main Clas
4、wathch具體方法
2.2.1.、dashboard儀表板
在這里插入圖片描述
2.2.2、通過thread命令來獲取到arthas-demo進程的Main Class
在這里插入圖片描述
2.2.3、通過jad反編譯Main Class
在這里插入圖片描述
2.2.4、watch監(jiān)視
demo.MathGame primeFactors:
demo.MathGame:包名+類名
primeFactors:方法名
returnObj:返回參數(shù)的表達式
2.2.5、退出arthas
如果只是退出當前的連接,可以用quit或者exit命令。Attach到目標進程上的arthas還會繼續(xù)運行,端口會保持開放,下次連接時可以直接連接上。
如果想完全退出arthas,可以執(zhí)行stop命令
在這里插入圖片描述
2.3、基礎(chǔ)命令1
1、help:查看所有幫助信息
2、cat:顯示文本文件內(nèi)容
3、grep:匹配查找,和linux中的grep類似,但只能用于管道命令
在這里插入圖片描述
4、pwd:顯示當先目錄的目錄地址
5、cls:清屏
2.4、基礎(chǔ)命令2
1、session:查看當前會話信息
在這里插入圖片描述
2、reset:重置增強類,將被arthas增強過的類全部還原,arthas服務(wù)端關(guān)閉時會重置所有增強過的類
在這里插入圖片描述
在這里插入圖片描述
3、version:輸出當前目標Java進程所加載 的Arthas版本號
4、quit:退出當前Arthas客戶端,其他Arthas客戶端不受影響。
5、stop:關(guān)閉Arthas服務(wù)端,所有Arthas客戶端全部退出。
6、keymap:Arthas快捷鍵列表及自定義快捷鍵
7、history:和linux系統(tǒng)作用一樣 打印命令歷史
3、JVM相關(guān)命令
1、dashboard
在這里插入圖片描述
2、thread 線程相關(guān):查看當前jvm的線程堆棧的信息
在這里插入圖片描述
3、jvm 虛擬機相關(guān)
4、sysprop 系統(tǒng)屬性相關(guān)
5、sysenv:查看當前jvm的環(huán)境屬性
在這里插入圖片描述
6、vmoption:查看、更新vm診斷相關(guān)的參數(shù)
7、getstatic:方便的查看類的靜態(tài)屬性
語法:getstatic 類名 屬性名
8、ognl
在這里插入圖片描述
3.1、反編譯 jad
比如編譯string類
–source-only : 只顯示源碼
只反編譯指定的方法
xx 就是方法名
3.2、內(nèi)存編譯mc
內(nèi)存編譯器,編譯.java文件生成.class
在這里插入圖片描述
在這里插入圖片描述
4、Arthas進階
4.1、目標
類與類加載器
monitor、watch、trace、stack等核心命令的使用
火焰圖的生存
arthas實戰(zhàn)案例
4.2、dump
將已加載的字節(jié)碼文件保存到特定的目錄下,logs/arthas/classdump/
在這里插入圖片描述
舉例:
在這里插入圖片描述
4.3、classloader
獲取類加載器的信息
作用:
將jvm中所有的classloader的信息統(tǒng)計出來,并可以展示繼承樹,urls等。
讓指定的classloader去getResources,打印出所有查找到的resources的url。
在這里插入圖片描述
4.4、monitor
監(jiān)控指定類中方法的執(zhí)行情況
作用:
在這里插入圖片描述
在這里插入圖片描述
4.5、watch(重要)
觀察到指定方法的調(diào)用情況
作用:
方法執(zhí)行數(shù)據(jù)觀測,方便觀測到指定方法的調(diào)用情況
能觀察到的范圍:返回值、拋出異常、入?yún)?。通過編寫OGNL表達式進行對應變量的查看
在這里插入圖片描述
在這里插入圖片描述
只查看第一個參數(shù)小于0的情況
在這里插入圖片描述
文章知識點與官方知識檔案匹配
Java技能樹首頁概覽
89145 人正在系統(tǒng)學習中
打開CSDN,閱讀體驗更佳
java應用線上診斷神器--Arthas_linyb極客之路的博客
c、保存好/tmp/UserServiceImpl.java之后,使用mc(Memory Compiler)命令來編譯,并且通過–classLoaderClass參數(shù)指定ClassLoader mc--classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader/tmp/UserServiceImpl.java-d/tmp ...
繼續(xù)訪問
java線上診斷工具,Java線上診斷神器Arthas-1_Skogkatt的博客-CSDN...
Arthas 是Alibaba 開源的一款線上診斷工具,相比Java 自帶的jinfo, jmap,jstat 等工具更方便(起碼不用記那么多參數(shù)),而且利用字節(jié)碼增強技術(shù),可以很好的對線上的問題進行定位以及解決,不用再為生產(chǎn)或者測試環(huán)境無法debug而感到無能為力。...
繼續(xù)訪問
最新發(fā)布 Arthas常用命令
arthas指令大全
繼續(xù)訪問
Arthas在線java進程診斷工具 在線調(diào)試神器
Arthas在線java進程診斷工具 在線調(diào)試神器 tag: java 診斷 堆棧 在線調(diào)試 耗時 死鎖 arthas 阿里巴巴 Arthas 是 Alibaba 開源的Java診斷工具,深受開發(fā)者喜愛。 官網(wǎng)文檔: 當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決: 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了? 遇到問題無法在.
繼續(xù)訪問
Java在線診斷利器之Arthas_Java老K的博客
Arthas是阿里在2019年9月份開源的一款java在線診斷工具,能夠分析、診斷、定位java應用問題,例如:jvm信息、線程信息、搜索類中的方法、 跟蹤代碼執(zhí)行、觀測方法的入?yún)⒑头祷貐?shù)等等。 Arthas最大的特點是能在不修改代碼和不需要重新發(fā)布的...
繼續(xù)訪問
java線上診斷神器 --Arthas__小魚塘的博客_java網(wǎng)絡(luò)診斷
java線上診斷神器 --Arthas 最近在工作中用到的一個非常很好的線上診斷,分析問題的神器,再次記錄一下: 官方文檔:簡介 | arthas GitHub 地址:GitHub - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java診斷利器Arthas...
繼續(xù)訪問
Arthas使用教程(8大分類)
1、基礎(chǔ)命令。2、JVM相關(guān)。3、類與類加載器。4、option全局選項。5、項目中使用案例。
繼續(xù)訪問
Arthas介紹
這篇文章為大家推薦一個為Java應用程序排查問題的非常好用的工具:Arthas,首先聲明一下,這邊文章并不是教大家如何使用,它只是一個搬運工,在Arthas的github上已經(jīng)有非常詳細的使用教程了。 Arthas(阿爾薩斯)是阿里巴巴開源的Java診斷工具,深受開發(fā)者喜愛 當你遇到以下類似問題而束手無策時,Arthas統(tǒng)統(tǒng)可以幫你解決 某個類是從哪個jar包加載的,為什么會報各種類相關(guān)的Exc...
繼續(xù)訪問
Arthas - Java線上診斷工具_是良辰的博客
java -jar arthas-boot.jar 啟動之后就可以看到一個java程序列表,像我這就是只有一個java程序在跑,就是當前根目錄下面的app.jar 選擇1,即可對app.jar進行監(jiān)控診斷。 PS:如果是虛擬機,直接在應用服務(wù)器上面執(zhí)行上面的命令,如果是docke...
繼續(xù)訪問
java線上診斷工具Arthas-實戰(zhàn)案例_小姐姐修燈泡嗎的博客
首先我就來簡單介紹下他的作用:(粘貼官網(wǎng))Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。在線排查問題,無需重啟;動態(tài)跟蹤Java代碼;實時監(jiān)控JVM狀態(tài)。 Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的...
繼續(xù)訪問
arthas 使用教程
arthas安裝使用 首先是安裝,說白了其實把他當成一個工具來用就行了,你什么服務(wù)需要在線進行性能情況的一個監(jiān)測和性能的瓶頸排查。第三步啟動arthas-boot.jar,啟動的時候要注意你需要監(jiān)測的java是啟動的可以用jps-l命令查看你的java服務(wù)。第二步把jar包上傳到你需要進行java性能監(jiān)測的服務(wù)器上。線上正式環(huán)境把他當成一個排查慢問題的工具還是很好用的。以上就是啟動服務(wù)了下面開始介紹常用的一些排查命令。...
繼續(xù)訪問
Arthas
Arthas.md 當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決: 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個用戶的數(shù)據(jù)處理有問題,...
繼續(xù)訪問
Java線上問題診斷工具Arthas_星光Starsray的博客
java -jar arthas-boot.jar //啟動 當看到控制臺出現(xiàn)arthas的標志,表明啟動成功!注意此時已經(jīng)進入控制臺,主要是arthas的命令使用。 [root@xxptweb01 arthas]# java -jar arthas-boot.jar
繼續(xù)訪問
【Java】性能問題診斷利器Arthas --常用命令示例_嘆了口丶氣的博客-C...
Arthas 是一款阿里開源的 Java 線上診斷工具,功能強大,可以在不修改代碼或者重啟服務(wù)的情況下快速定位線上問題。 官方文檔:Arthas官網(wǎng) 二、安裝 從官網(wǎng)下載 Arthas 全量包安裝(因為快速安裝可能因網(wǎng)絡(luò)原因下載失敗),然后用 java -jar 方...
繼續(xù)訪問
Java診斷工具Arthas使用說明
Arthas 是Alibaba開源的Java診斷工具,Arthas支持JDK 6+,支持Linux/Mac/Windows,支持命令行交互模式、 Tab 自動補全功能,方便進行問題的定位和診斷。
繼續(xù)訪問
JVM性能調(diào)優(yōu)篇07-阿里巴巴Arthas工具詳解
阿里巴巴Arthas工具詳解
繼續(xù)訪問
Arthas 是Alibaba開源的Java診斷工具
Arthas是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。 當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決: 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)! 是否有一個全局視角來查看系統(tǒng)的運行...
繼續(xù)訪問
JVM之GC 調(diào)優(yōu)工具 Arthas 實戰(zhàn)使用(二)
Arthas 是 Alibaba 開源的 Java 診斷工具,深受開發(fā)者喜愛。Arthas 支持 JDK 6以上版本,支持 Linux/Mac/Windows,而且這些環(huán)境的命令都一樣,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進行問題的定位和診斷 官方文檔參考 一、下載和安裝 不需要安裝,就是一個 jar 包 curl -O
繼續(xù)訪問
Arthas詳解
文章目錄概述安裝快速安裝使用`arthas-boot`(官網(wǎng)推薦)使用`as.sh`全量安裝把Arthas安裝到基礎(chǔ)鏡像里卸載使用命令詳解基礎(chǔ)命令helpcatechogrepbase64teepwdclsversionhistorykeymap后臺異步命令相關(guān)快捷鍵會話相關(guān)quitstopsessionresetjvm相關(guān)dashboardthreadjvmsyspropsysenvvmoptionperfcounterloggergetstaticognlmbeanheapdumpvmtoolclass
繼續(xù)訪問
Arthas基礎(chǔ)
Arthas:快速入門
繼續(xù)訪問
Arthas入門到精通
Arthas是Alibaba開源的一款Java診斷工具,方便開發(fā)者在線排查問題,無需重啟,同時可以跟蹤Java代碼,實時監(jiān)控JVM狀態(tài),目前Arthas僅支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,具有 Tab 自動補全功能,便于開發(fā)者進行快速定位和診斷問題。 離線全量下載(如果服務(wù)器沒有外網(wǎng)可以采用這種情況)
繼續(xù)訪問
阿里Java診斷工具 arthas - 介紹及指令大全
一、arthas Arthas` 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。 當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決: 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)! 是否有一個全局視角來查看系統(tǒng)的運行狀況? 有什么辦法可以監(jiān)控到
繼續(xù)訪問
java診斷神器 arthas(阿爾薩斯)
java診斷神器 arthas(阿爾薩斯) 官網(wǎng)地址: 1、快速開始 1.1、windows版本安裝 # 命令行輸入 curl -0 --output arthas-boot.jar # 啟動arthas 注意:啟動前已經(jīng)要有java進程運行,否則無法進入 java -jar arthas-boot.jar --telnet-por
繼續(xù)訪問
幫助定位Java方法優(yōu)化之a(chǎn)rthas端口被占用解決的辦法
另起一個端口號 啟動arthas命令的后面加上端口號的相關(guān)參數(shù) java -jar arthas-boot.jar --telnet-port 端口號 --http-port -1 關(guān)閉占用端口的服務(wù) 先進入占用端口的服務(wù),然后輸入stop將它停掉就可以了 注:請再每一次使用之后使用stop命令退出,這樣也省掉一些不必要的麻煩?。?! ...
繼續(xù)訪問
Java 診斷工具之 Arthas
Arthas 是 Alibaba 開源的 Java 診斷工具。Ta 可以動態(tài)跟蹤 Java 代碼,實時監(jiān)控 JVM 狀態(tài),可以在不中斷程序執(zhí)行的情況下輕松完成 JVM 相關(guān)問題排查工作。支持 JDK 6+,支持 Linux/Mac/Windows。
繼續(xù)訪問
Arthas-java在線調(diào)試工具的使用
一、arthas能干什么? 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception? 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了? 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎? 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)! 是否有一個全局視角來查看系統(tǒng)的運行狀況? 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)? 怎么快速定位應用的熱點,生成火焰圖? 怎樣直接從JVM內(nèi)查找某個類的實例? Arthas支持JDK 6+
繼續(xù)訪問
Java線上診斷工具Arthas
概述 Arthas是一個開源的線上診斷工具,可以實時查看線上代碼運行情況,詳情參考Arthas 命令列表 jad命令(獲取已加載類的源碼) //主要用來看已經(jīng)加載了類的源碼,一般用于動態(tài)加載的class的源碼比較方便 [arthas@773]$ jad com/example/jvm/Hello ClassLoader: +-sun.misc.Launcher$AppClassLoader@18b4aac2 +-sun.misc.Launcher$ExtClassLoader@362d9..
繼續(xù)訪問
java 線上診斷命令
java
學習
1、 Checkstyle
Checkstyle 是SourceForge的開源項目,通過檢查對代碼編碼格式,命名約定,Javadoc,類設(shè)計等方面進行代碼規(guī)范和風格的檢查,從而有效約束開發(fā)人員更好地遵循代碼編寫規(guī)范。Checkstyle 提供了支持大多數(shù)常見IDE的插件。
2、FindBugs
FindBugs 是由馬里蘭大學提供的一款開源 Java 靜態(tài)代碼分析工具。FindBugs 通過檢查類文件或 JAR 文件,將字節(jié)碼與一組缺陷模式進行對比從而發(fā)現(xiàn)代碼缺陷,完成靜態(tài)代碼分析。FindBugs 既提供可視化 UI 界面,同時也可以作為 Eclipse 插件使用。
3、PMD
PMD 是由 DARPA 在 SourceForge 上發(fā)布的開源 Java 代碼靜態(tài)分析工具。PMD 通過其內(nèi)置的編碼規(guī)則對 Java 代碼進行靜態(tài)檢查,主要包括對潛在的 bug,未使用的代碼,重復的代碼,循環(huán)體創(chuàng)建新對象等問題的檢驗。PMD 提供了和多種 Java IDE 的集成,例如 Eclipse,IDEA,NetBean 等。
4、Jtest
Jtest 是Parasoft 公司推出的一款針對Java語言的自動化代碼優(yōu)化和測試工具,Jtest 的靜態(tài)代碼分析功能能夠按照其內(nèi)置的超過800條的 Java 編碼規(guī)范自動檢查并糾正這些隱蔽且難以修復的編碼錯誤。同時,還支持用戶自定義編碼規(guī)則,幫助用戶預防一些特殊用法的錯誤。