色欲av一区久久精品_久久综合色综合色88_无码在线观看不卡_色黄视频网站_亚洲国产精品久久久久秋霞66

使用JDK工具進(jìn)行Java服務(wù)器應(yīng)用程序故障排除

時間:2023-05-16

最近又學(xué)到了很多新知識,感謝優(yōu)銳課老師細(xì)致地解說,這篇博客記載下自己所學(xué)所想。
1.介紹
在Java國際中,咱們大多數(shù)人習(xí)慣于在Java應(yīng)用程序開發(fā)的一切階段運用GUI東西:編寫代碼,對其進(jìn)行調(diào)試和剖析。咱們一般更喜歡在開發(fā)環(huán)境中設(shè)置服務(wù)器環(huán)境,并測驗運用熟悉的東西在本地重現(xiàn)問題。不幸的是,由于各種原因,一般不或許在本地重現(xiàn)一些問題。例如,你或許無權(quán)拜訪服務(wù)器應(yīng)用程序處理的真實客戶端數(shù)據(jù)。
在這種狀況下,你需求在服務(wù)器盒上長途對應(yīng)用程序進(jìn)行毛病掃除。你應(yīng)該記住,你無法運用裸露的JRE來正確地對應(yīng)用程序進(jìn)行毛病掃除:它包括一切毛病掃除功用,可是實際上無法拜訪它。成果,你需求在同一盒子上運用JDK或某些第三方東西。本文將介紹JDK東西,因為與許多組織中需求安全審核的任何第三方東西相比,你或許被答應(yīng)在生產(chǎn)環(huán)境中運用它。
一般,僅需將JDK發(fā)行包解壓縮到你的包裝盒中就足夠了——你不需求出于毛病掃除的意圖而正確裝置它(實際上,在很多狀況下不希望正確裝置)。關(guān)于根據(jù)JMX的功用,你實際上能夠裝置任何Java7/8JDK,可是某些東西無法識別將來的JDK,因而我主張你裝置最新的Java7/8JDK或與服務(wù)器JRE完全匹配的內(nèi)部版別-它答應(yīng)你會為當(dāng)時沒有拜訪安全點的應(yīng)用程序轉(zhuǎn)儲應(yīng)用程序堆(某些處于閑暇模式的應(yīng)用程序是“無安全點”應(yīng)用程序的簡略示例)。Java
2.毛病掃除方案
2.1.獲取正在運轉(zhuǎn)的JVM的列表
為了開端作業(yè),你幾乎總是需求獲取正在運轉(zhuǎn)的JVM,它們的進(jìn)程ID和指令行參數(shù)的列表。有時或許就足夠了:你或許會發(fā)現(xiàn)同一應(yīng)用程序的第二個實例一起履行相同的作業(yè)(并損壞輸出文件/從頭翻開套接字/履行其他一些愚蠢的操作)。
只需運轉(zhuǎn)jcmd而無需任何參數(shù)。它將向你顯現(xiàn)正在運轉(zhuǎn)的JVM的列表:
13824org.jetbrains.idea.maven.server.RemoteMavenServer221963780sun.tools.jcmd.JCmd
現(xiàn)在,你能夠通過運轉(zhuǎn)jcmdhelp指令來查看哪些確診指令可用于給定的JVM。這是VisualVM的示例輸出:
1>jcmd3036help233036:4Thefollowingcommandsareavailable:5JFR.stop6JFR.start7JFR.dump8JFR.check9VM.native_memory10VM.check_commercial_features11VM.unlock_commercial_features12ManagementAgent.stop13ManagementAgent.start_local14ManagementAgent.start15GC.rotate_log16Thread.print17GC.class_stats18GC.class_histogram19GC.heap_dump20GC.run_finalization21GC.run22VM.uptime23VM.flags24VM.system_properties25VM.command_line26VM.version27help
鍵入jcmd來運轉(zhuǎn)確診指令或得到一條錯誤消息,問詢指令參數(shù):
1>jcmd3036GC.heap_dump233036:4java.lang.IllegalArgumentException:Theargument’filename’ismandatory.
你能夠運用以下指令獲取有關(guān)確診指令參數(shù)的更多信息:jcmd幫助。例如,這是GC.heap_dump指令的輸出:
1>jcmd3036helpGC.heap_dump233036:4GC.heap_dump5GenerateaHPROFformatdumpoftheJavaheap.67Impact:High:DependsonJavaheapsizeandcontent.RequestafullGCunlessthe’-all’optionisspecified.89Permission:java.lang.management.ManagementPermission(monitor)1011Syntax:GC.heap_dump[options]1213Arguments:14filename:Nameofthedumpfile(STRING,nodefaultvalue)1516Options:(optionsmustbespecifiedusingtheor=syntax)17-all:[optional]Dumpallobjects,includingunreachableobjects(BOOLEAN,false)
2.2.進(jìn)行堆轉(zhuǎn)儲
jcmd為你供給了一個方便的界面,用于以HPROF格局進(jìn)行堆轉(zhuǎn)儲。只需運轉(zhuǎn)jcmdGC.heap_dump。請留意,文件名是相關(guān)于正在運轉(zhuǎn)的JVM當(dāng)時目錄而不是當(dāng)時目錄的,因而你或許需求指定完好路徑。最好運用.hprof擴展名作為轉(zhuǎn)儲文件名。
線程轉(zhuǎn)儲完成后,你能夠?qū)⑽募轮频阶约旱暮凶又?,然后在VisualVM(它是JDK的一部分)中翻開它,并運用其堆walker和查詢語言功用,或?qū)⑵浼虞d到JavaMissionControl的JOverflow插件中并對其進(jìn)行剖析各種內(nèi)存問題。
留意1:當(dāng)然,還有許多其他東西能夠處理hprof文件:NetBeans,EclipseMemoryAnalyzer,YourKit等。將.hprof文件下載到框中后,請運用你喜歡的東西。
留意2:你也能夠運用jmap東西進(jìn)行堆轉(zhuǎn)儲:jmap-dump:live,file=。問題在于它被正式證明為不受支持。咱們中的許多人都認(rèn)為JDK中不受支持的內(nèi)容將永遠(yuǎn)存在,但現(xiàn)實證明狀況不再如此:JEP240,JEP241
2.3.剖析類直方圖
假如你正在尋找內(nèi)存走漏,一般只對堆中某些特定類型的活動目標(biāo)感興趣。例如,你或許知道一次只能擁有一個特定類型的目標(biāo)(應(yīng)用程序中的某種首要作業(yè)類)。在舊的一代中或許還存在一個或多個相同類的實例,到目前為止,這些實例沒有進(jìn)行廢物回收,可是不應(yīng)從應(yīng)用程序根目錄拜訪它們。
要打印類直方圖,請運轉(zhuǎn)以下兩個指令之一(兩個指令均打印活動目標(biāo)的數(shù)量):
1jcmdGC.class_histogram2jmap-histo:live
以下是示例輸出的前幾行:
1num#instances#bytesclassname2———————————————-31:59235976952[I42:500344127704[C53:494651187160java.lang.String64:1881069496[J75:39851067240[Ljava.util.HashMap$Node;86:8756982872java.lang.Class97:2855835792[B108:23570754240java.util.HashMap$Node119:13964671440[Ljava.lang.Object;1210:9642308544java.util.Hashtable$Entry1311:4453213744java.util.HashMap
請留意,以字節(jié)為單位的已占用巨細(xì)是一個較淺的巨細(xì)–它不包括任何子目標(biāo)。很簡單從char[](類名=[C]和Stringstats)中留意到這一現(xiàn)實–雖然實例數(shù)是相似的(雖然char[]-s總是比String多,可是char[]-的巨細(xì)s顯著更大,假如String的巨細(xì)包括基礎(chǔ)char[]的巨細(xì),則狀況并非如此。
現(xiàn)在,你能夠grep/搜索你感興趣的類名稱,并查看活動實例的數(shù)量。假如看到的實例超出預(yù)期,請進(jìn)行堆轉(zhuǎn)儲并在任何堆遍歷器中對其進(jìn)行剖析(請拜見上文)。
2.4.進(jìn)行線程轉(zhuǎn)儲
有時,你的應(yīng)用程序或許會報告為“notdoinganything/gotstuck”。有很多種“stuck”的狀況——死鎖,高資源爭用或僅是O(N10)算法來處理數(shù)百萬用戶的請求,在一切這些狀況下,你應(yīng)該知道你的應(yīng)用程序線程正在履行什么以及鎖將履行什么操作他們持有。
有兩種類型的鎖:根據(jù)同步關(guān)鍵字和Object.wait/notifyAll辦法的原始鎖,以及Java5中引進(jìn)的java.util.concurrent鎖。它們之間的首要區(qū)別是前者綁定到你輸入的堆棧結(jié)構(gòu)上同步部分,并且在線程轉(zhuǎn)儲中始終可用。另一方面,后者(java.util.concurrent)不受堆棧結(jié)構(gòu)約束——你能夠運用一種辦法輸入鎖,然后將其保留在另一種辦法中。成果,一段時間以來,它們根本沒有在線程轉(zhuǎn)儲中打印,即便現(xiàn)在它們?nèi)匀皇且粋€選項??墒牵阈枨笤诰€程轉(zhuǎn)儲中一起運用兩種鎖,以正確查詢線程問題。
有3種打印應(yīng)用程序線程轉(zhuǎn)儲的辦法。你能夠在Linux上運轉(zhuǎn)kill-3?;蛟S,你能夠在任何平臺上運轉(zhuǎn)以下指令之一:
1jstack2jcmdThread.print
2.5.運轉(zhuǎn)JavaFlightRecorder
到目前為止,本文中說到的一切東西僅應(yīng)用于快速查詢。為了進(jìn)行更深入的剖析,我主張運用內(nèi)置的JavaFlightRecorder。
運轉(zhuǎn)JFR是一個三步過程:
你需求創(chuàng)立一個包括所需設(shè)置的JFR模板文件。為此,請運轉(zhuǎn)jmc并轉(zhuǎn)到“窗口”->“飛翔記載模板管理器”菜單。配置文件準(zhǔn)備就緒后,將其導(dǎo)出到文件中,然后將其發(fā)送到你正在運用的框中。
JFR需求JDK商業(yè)許可證。現(xiàn)在,你需求在所需的JVM上解鎖商業(yè)功用:
1jcmdVM.unlock_commercial_features
之后,你能夠啟動JFR。這是指令行示例:
1jcmdJFR.startname=testduration=60ssettings=template.jfcfilename=output.jfr
此指令立即運轉(zhuǎn)JFR(未設(shè)置delay特點),并運用template.jfc模板文件中的設(shè)置并將成果寫入output.jfr(在兩個文件中都運用絕對路徑),收集JVM信息60秒鐘。
錄制完成后,你能夠?qū)?jfr文件仿制到筆記本電腦并在jmcGUI中對其進(jìn)行剖析。它包括幾乎一切你需求對JVM進(jìn)行毛病掃除的信息,除了完好堆轉(zhuǎn)儲,你能夠單獨創(chuàng)立并仿制到你的機器中。

文章標(biāo)簽:

Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號

與項目經(jīng)理交流
掃描二維碼
與項目經(jīng)理交流
掃描二維碼
與項目經(jīng)理交流
ciya68