JVM崩溃时:如何调查最严重错误的根本原因
當(dāng)應(yīng)用程序崩潰時(shí),您可以學(xué)到什么?
我認(rèn)為,“后見之明是20 /”是最喜歡的短語(yǔ)之一托馬斯·羅梅爾 ,工程ZeroTurnaround的副總裁。 好吧,我實(shí)際上不確定在他的短語(yǔ)中占什么位置,但是我已經(jīng)聽過(guò)他幾次說(shuō)了。 鑒于這意味著回顧過(guò)去,您可以對(duì)事情進(jìn)行推理比預(yù)測(cè)將來(lái)發(fā)生的事情要好得多,通常發(fā)生在我們未能正確預(yù)測(cè)事情并反映行動(dòng)結(jié)果的情況下。 如果您經(jīng)常聽到此短語(yǔ),則意味著您經(jīng)常對(duì)事情進(jìn)行反思,并且您知道每一次失敗,每一次錯(cuò)誤都會(huì)提供一個(gè)教訓(xùn)。
好吧,可能是您沒有犯錯(cuò)誤,或者您沒有犯任何會(huì)傳播到最終產(chǎn)品以及最終用戶的重要錯(cuò)誤。 我確實(shí)偶爾制作它們,不止一次,我對(duì)服務(wù)器進(jìn)行了多次轟炸,并且無(wú)數(shù)次提交了損壞的代碼。 有時(shí)它也會(huì)滑入最終產(chǎn)品。 每當(dāng)我寫的破損代碼再次咬我時(shí),我都會(huì)學(xué)到一些東西。 每次我必須調(diào)查造成錯(cuò)誤的原因是什么,將其復(fù)制到我的機(jī)器上并進(jìn)行修復(fù)。
在這篇文章中,我想看看可以幫助您獲得有關(guān)錯(cuò)誤的相關(guān)信息并幫助您重現(xiàn)和修復(fù)它們的工具和技術(shù)。
新帖:JVM崩潰時(shí):如何調(diào)查最嚴(yán)重錯(cuò)誤的根本原因http://t.co/bvHVYhT2m4 pic.twitter.com/dKhgiKMhT5
— Takipi(@takipid) 2015年4月27日
結(jié)構(gòu)化日志
弄清楚某些代碼中發(fā)生了什么的默認(rèn)goto方法是閱讀源代碼。 當(dāng)該來(lái)源實(shí)際上是您每天工作8-10個(gè)小時(shí)而仍然找不到罪魁禍?zhǔn)讜r(shí),則您必須在錯(cuò)誤發(fā)生時(shí)添加一些有關(guān)上下文的情境意識(shí)。 自然地,您可以從日志中獲取該上下文。 我毫不懷疑您一直在使用日志,但這是您可以做的一個(gè)很好的技巧,可以使日志更加有用。
線程名稱
如果配置線程名稱以反映應(yīng)用程序中發(fā)生的事情,則可以獲得有關(guān)上下文的更多信息。 線程名稱幾乎總是包含在日志中,并且打印線程名稱不會(huì)帶來(lái)任何明顯的性能開銷。 例如,找出記錄器的調(diào)用方類需要花費(fèi)時(shí)間,因?yàn)槟仨殬?gòu)造和遍歷堆棧跟蹤。 但是訪問(wèn)線程名稱既快速又便宜。 另外,線程名很少用于其他任何事情,因此,在您認(rèn)為合適的地方充填盡可能多的信息:系統(tǒng)組件名稱,事務(wù)ID,發(fā)出請(qǐng)求的用戶名等。稍后在調(diào)試問(wèn)題時(shí),您將感謝這些詳細(xì)的日志,輕輕松松。
更多日志類型
另一個(gè)技巧是使JVM產(chǎn)生更多的日志,可以使JVM產(chǎn)生可以稍后分析的垃圾收集日志,JIT編譯日志和堆轉(zhuǎn)儲(chǔ)。 由于性能開銷,其中大多數(shù)可能不適合生產(chǎn)系統(tǒng),但是您絕對(duì)可以在暫存階段或在自己的開發(fā)站上對(duì)它們進(jìn)行試驗(yàn)。
稍后,您可以調(diào)整垃圾回收的性能,并進(jìn)行大量?jī)?yōu)化, 如本文所述 ,但首先,您可以使用以下JVM選項(xiàng)啟用垃圾回收日志: -XX:+ PrintGC -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps和-XX:+ PrintGCDateStamps -Xloggc:file 。
手動(dòng)調(diào)查JIT編譯日志可能不會(huì)告訴您太多信息,但是您始終可以嘗試使用JITWatch來(lái)查看JVM編譯代碼時(shí)發(fā)生了什么。
對(duì)于生產(chǎn)系統(tǒng)來(lái)說(shuō),打開它的一個(gè)好主意是: -XX:+ HeapDumpOnOutOfMemoryError ,這將使JVM在發(fā)生OutOfMemory錯(cuò)誤時(shí)創(chuàng)建內(nèi)存轉(zhuǎn)儲(chǔ)。
日志種類繁多,并非對(duì)崩潰管理都同樣有用,但是它們都是必不可少的,也是您軍械庫(kù)中最容易使用的工具。
現(xiàn)代開發(fā)人員工具
等一下 您是否要告訴我,在21世紀(jì),沒有什么比找出日志并從早期石器時(shí)代采用取證技術(shù)更好的方法來(lái)弄清您的應(yīng)用程序中發(fā)生了什么? 好吧,不是真的。 但是我不知道有什么通用工具可以為您提供最佳的見解,以了解代碼中發(fā)生了什么以及為什么發(fā)生這種情況。
在開發(fā)環(huán)境中,情況變得更容易,您擁有大量的備用計(jì)算資源,并且可能會(huì)冒險(xiǎn)附加不需要經(jīng)過(guò)Ops批準(zhǔn)流程的各種工具。
例如, 以Plumbr的IvoM?gi的帖子為例 ,他討論了他們的內(nèi)存泄漏檢測(cè)工具是否適合操作人員或開發(fā)人員。 理想情況下,該工具是有用且穩(wěn)定的,因此您既可以在開發(fā)過(guò)程中享受其性能和功能,又不必?fù)?dān)心將其附加到實(shí)時(shí)系統(tǒng)中。 但是這種情況很少發(fā)生,您不需要在生產(chǎn)環(huán)境中進(jìn)行調(diào)試,也不想與JRebel即時(shí)交換類,等等。
但是,這并不意味著您根本不應(yīng)該使用任何現(xiàn)代工具,而應(yīng)該將自己限制在老式的,但已被證實(shí)的發(fā)現(xiàn)邪惡根源的方法上:日志。 毫無(wú)疑問(wèn),日志仍將是您將獲得的最有用的取證信息來(lái)源,但是您可以做得更好。
通常,開發(fā)過(guò)程包括大量盯著代碼,思考并有時(shí)在此處和此處更改功能位。 這是一項(xiàng)艱苦的工作,需要集中精力解決問(wèn)題和系統(tǒng)邏輯。 如果您知道使事情變得更輕松的方法論或一些神奇的秘訣,請(qǐng)?jiān)赥witter上與我分享智慧: @shelajev 。 在此之前,我們將以軟件工程需要集中精力為前提。 這意味著任何工具都有兩個(gè)主要的非功能性要求:在功能上必須強(qiáng)大,并且必須具有非侵入性,因此您不必在如何實(shí)現(xiàn)所需的功能上費(fèi)心。
重現(xiàn)某些條件的最有效方法是對(duì)其進(jìn)行測(cè)試。 當(dāng)它不可用時(shí),下一個(gè)最好的事情就是使用一個(gè)錄制調(diào)試器,例如Takipi進(jìn)行生產(chǎn)調(diào)試或Chronon 。
使用Chronon,您可以記錄代碼中發(fā)生的操作,它們產(chǎn)生的結(jié)果,每給定時(shí)刻堆棧中的內(nèi)容以及產(chǎn)生程序執(zhí)行的事務(wù)日志的記錄。 稍后,您可以將此日志提供給另一個(gè)程序運(yùn)行,并來(lái)回逐步執(zhí)行。
如果您要查明性能問(wèn)題,則可以使用Java Mission Control的 Java Flight Recorder收集有關(guān)程序執(zhí)行配置文件,垃圾收集統(tǒng)計(jì)數(shù)據(jù),堆使用情況數(shù)據(jù)(例如對(duì)象分配,鎖和IO詳細(xì)信息)的信息。如果要運(yùn)行附加到生產(chǎn)節(jié)點(diǎn)上的Java Mission Control,您必須支付許可證的費(fèi)用,但是對(duì)于開發(fā)環(huán)境,則沒有這樣的問(wèn)題。
再說(shuō)一次,如果要監(jiān)視生產(chǎn)環(huán)境,則可能需要一個(gè)錯(cuò)誤管理解決方案,該解決方案專門為獲取盡可能多的錯(cuò)誤信息而創(chuàng)建。
Takipi的儀表板和本機(jī)代理使您無(wú)需使用日志文件即可調(diào)試生產(chǎn)中的代碼。 您將獲得錯(cuò)誤分析,分布式系統(tǒng)中的統(tǒng)一堆棧跟蹤以及其他可以大大減少理解和修復(fù)錯(cuò)誤的時(shí)間的事物。
在這篇文章中,我們研究了幾種工具和技術(shù),可以使您在積極開發(fā)應(yīng)用程序或?qū)⑵洳渴鸬缴a(chǎn)環(huán)境中時(shí)更加了解應(yīng)用程序中正在發(fā)生的事情。 無(wú)論是通過(guò)熟練地將JMC與飛行記錄器配合使用,還是通過(guò)優(yōu)雅制作的日志,重現(xiàn)錯(cuò)誤都是糾正任何錯(cuò)誤的最重要步驟。
您要記住的是,盡管每次都會(huì)使用好的舊工具,但幾乎每個(gè)領(lǐng)域都有新的發(fā)展,并且崩潰管理和錯(cuò)誤監(jiān)視也不例外。 了解其中有哪些工具,并了解如何正確使用它們。 它將使您成為更好的開發(fā)人員。
翻譯自: https://www.javacodegeeks.com/2015/04/when-jvms-crash-how-to-investigate-the-root-cause-of-your-toughest-errors.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的JVM崩溃时:如何调查最严重错误的根本原因的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 包嗅探和包回放简介-tcpdump,tc
- 下一篇: 犯花痴是什么意思 犯花痴的解释