如何掌握Java内存(并保存程序)
通過AppDynamics解決應(yīng)用程序問題的速度提高了10倍–以最小的開銷在代碼級深度監(jiān)視生產(chǎn)應(yīng)用程序。 開始免費(fèi)試用!
您花了無數(shù)小時來研究Java應(yīng)用程序中的錯誤并在需要的地方獲得其性能。 在測試期間,您注意到應(yīng)用程序隨著時間的推移逐漸變慢,完全崩潰或表現(xiàn)不佳。 您遍歷代碼,并確保您沒有錯過任何可能導(dǎo)致這些問題的內(nèi)容。 最終,您承認(rèn)自己正在處理內(nèi)存泄漏。 Java的垃圾收集器會盡力幫助解決這些泄漏,但是當(dāng)您遇到重大問題時,它只能做很多事情。 您需要一種方法來確定導(dǎo)致內(nèi)存泄漏的原因,解決該問題的方法以及理解Java垃圾回收在整個應(yīng)用程序性能中所扮演的角色。
Java內(nèi)存泄漏的主要癥狀
您遇到幾種癥狀,表明該應(yīng)用程序存在內(nèi)存泄漏問題。 與突然失敗相反,總體應(yīng)用程序性能的緩慢下降強(qiáng)烈表明內(nèi)存泄漏。 每次您運(yùn)行該應(yīng)用程序時,或者僅當(dāng)您開始使用更多數(shù)據(jù)或開始擴(kuò)展它時,才可能出現(xiàn)此問題。 由于內(nèi)存泄漏耗盡了所有可用資源,您的應(yīng)用程序可能會顯示內(nèi)存不足錯誤。 您可以重新啟動該應(yīng)用程序并希望獲得最好的效果,但是在解決漏洞之前,您將遇到多次崩潰。 通常,當(dāng)對象引用累積而不是釋放時,您將處理內(nèi)存泄漏。 它們占用了您的可用內(nèi)存,使您的應(yīng)用程序無法訪問所需的資源。
看起來像內(nèi)存泄漏的配置錯誤
在研究Java內(nèi)存問題和分析之前,請確保您沒有處理完全不同的問題。 一些內(nèi)存不足錯誤是由各種原因引起的,例如配置錯誤。 您的應(yīng)用程序可能缺少正確的堆大小或與系統(tǒng)上的其他應(yīng)用程序沖突。 如果您開始解決內(nèi)存不足的問題,但無法找出導(dǎo)致內(nèi)存泄漏的原因,請重新看一下您的應(yīng)用程序。 您可能會發(fā)現(xiàn)需要更改終結(jié)器線程或增加永久生成空間。
內(nèi)存監(jiān)視工具的好處
內(nèi)存監(jiān)視工具使您可以更好地了解Java應(yīng)用程序如何使用可用資源。 您可以采取此步驟來縮小導(dǎo)致內(nèi)存泄漏和其他性能問題的根本原因。 該軟件分為幾類,您可能需要使用多個應(yīng)用程序才能找出問題所在,是否正在處理內(nèi)存泄漏以及如何開始解決該問題。
堆轉(zhuǎn)儲文件為您的Java內(nèi)存分析提供了必要的輸出。 您可能需要使用兩種工具:一種用于生成轉(zhuǎn)儲文件,另一種用于有意義的分析。 該解決方案為您提供了有關(guān)應(yīng)用程序運(yùn)行情況的詳細(xì)視圖。 一旦工具突出顯示了潛在的問題區(qū)域,就可以精確地縮小問題發(fā)生的范圍。 現(xiàn)在,是時候進(jìn)行冗長而令人沮喪的部分了:反復(fù)試驗(yàn)。 您的內(nèi)存分析工具可能表明您的代碼存在多個問題,但您不確定它們是否會導(dǎo)致性能影響。 如果您一次更改所有內(nèi)容,那么您將無法確切知道應(yīng)用程序會遇到什么問題。 更糟糕的是,您可能會引入全新的錯誤,并且必須重新開始該過程。
一次進(jìn)行一次更改,然后嘗試重復(fù)該錯誤。 您可能需要讓應(yīng)用程序運(yùn)行一段時間才能復(fù)制原始錯誤條件。 如果您的內(nèi)存泄漏在第一次測試中消失了,請不要忘記在負(fù)載下對其進(jìn)行測試。 您的應(yīng)用程序在處理少量數(shù)據(jù)時可能會正常工作,但在處理大型數(shù)據(jù)集時會遇到相同的問題。 如果仍然遇到相同的錯誤,請從頭開始,并攻擊另一個可能的原因。
在使應(yīng)用程序完美運(yùn)行之后,內(nèi)存監(jiān)視工具被證明很有用。 您可以遠(yuǎn)程監(jiān)視JVM性能,并在遇到問題之前主動解決問題,收集歷史性能數(shù)據(jù)以幫助您將來改善編程工作,并觀察Java在重負(fù)載下的運(yùn)行方式。 一些解決方案包括警報(bào)和其他警報(bào),因此您可以立即知道出現(xiàn)問題的瞬間。 您不希望關(guān)鍵任務(wù)應(yīng)用程序崩潰并由于停機(jī)而造成數(shù)萬美元的損失,因此這些工具會增加響應(yīng)時間。 您的內(nèi)存監(jiān)視軟件還使您可以立即開始診斷過程,而無需在沒人告訴您確切的錯誤代碼或辦公室發(fā)生的問題時就去現(xiàn)場。
如果您經(jīng)常遇到Java應(yīng)用程序的內(nèi)存和性能問題,請仔細(xì)檢查測試過程。 找出過程中的任何薄弱環(huán)節(jié)并更改測試策略。 與其他Java程序員接觸,并比較質(zhì)量檢查最佳做法。 有時,您可能會忽略代碼的一小部分,并對整個應(yīng)用程序產(chǎn)生長期影響。
垃圾回收在Java內(nèi)存和內(nèi)存泄漏中的作用
Java的垃圾回收在您的應(yīng)用程序性能和內(nèi)存使用中起著關(guān)鍵作用。 該程序搜索不再使用的對象并將其刪除。 這些無效對象不再占用內(nèi)存,因此您的應(yīng)用程序繼續(xù)擁有可用資源。 有時,您的應(yīng)用程序沒有給GC足夠的時間或資源來清除死對象,這些死對象會堆積。 您還可能遇到這樣的情況,即您對假定為無效的對象有有效的引用。 垃圾收集器對此無能為力,因?yàn)樗淖詣觾?nèi)存管理會跳過活動對象。 通常,GC會自動運(yùn)行,但是您可能需要調(diào)整其行為以適應(yīng)具有挑戰(zhàn)性的內(nèi)存問題。 但是,GC可能會獨(dú)自導(dǎo)致性能問題。
GC世代
GC將對象分為不同的世代以優(yōu)化收集。 年輕的一代代表著很快消失的物體。 GC通常在這一代上運(yùn)行,因?yàn)樗ǔ1仨毲謇韺ο蟆?存活超過一定閾值的物體會逐漸進(jìn)入老一代。 這些對象停留的時間更長,因此GC不會頻繁運(yùn)行。 但是,當(dāng)GC確實(shí)在這些對象上運(yùn)行時,您的應(yīng)用程序?qū)⒔?jīng)歷一項(xiàng)主要操作,在該操作中,收集器將查看您的活動對象以刪除垃圾。 您的應(yīng)用程序有最后一代:永久一代。 通常,這些對象包括必要的JVM元數(shù)據(jù)。 在這一代中,您不會產(chǎn)生很多垃圾,但是在程序不再需要類之后,您的應(yīng)用程序可能需要GC刪除它們。
GC與響應(yīng)時間之間的聯(lián)系
垃圾收集,無論是次要的還是主要的,都將停止應(yīng)用程序線程,直到它們完成該過程。 這稱為“停止世界”事件。 單個新一代GC不會顯著影響性能,但是如果您的客戶流失率很高,則會遇到問題。 您最終會遇到次要GC持續(xù)運(yùn)行或您的舊一代以不可持續(xù)的速度增長的情況。 您需要平衡年輕一代GC的頻率和性能,這可能需要增加年輕一代的規(guī)模。
老一代和永久一代的GC會對您的應(yīng)用程序性能和內(nèi)存使用產(chǎn)生重大影響。 這個主要的GC操作遍歷整個堆,以取出死對象。 該過程比次要GC持續(xù)時間更長,因此對性能的影響持續(xù)時間更長。 當(dāng)您的客戶流失率較高且老一代較大時,您的整個應(yīng)用程序就會被Stop the World事件所困擾。
GC優(yōu)化需要監(jiān)視程序運(yùn)行的頻率,總體性能影響以及如何調(diào)整應(yīng)用程序以減少此頻率。 您可能需要確定同一對象被分配多次,遠(yuǎn)離應(yīng)用程序不必要的分配,或者找到阻礙整個系統(tǒng)的阻塞點(diǎn)。 要獲得正確的平衡,就必須密切注意從CPU負(fù)載到GC周期的各個方面,尤其是在年輕一代和老一代頻率不平衡的情況下。
解決內(nèi)存泄漏和優(yōu)化垃圾回收可以幫助您提高Java應(yīng)用程序的性能。 您需要處理很多活動部件,但是通過使用正確的故障排除方法和分析工具來提供強(qiáng)大的可見性,您可以深入解決問題,而不必再遇到頻繁的性能問題。
適當(dāng)?shù)膬?nèi)存分配和監(jiān)視在Java應(yīng)用程序中起著至關(guān)重要的作用。 您需要完全掌握GC,對象刪除,內(nèi)存泄漏和性能之間的相互作用,以優(yōu)化您的應(yīng)用程序并避免遇到內(nèi)存不足錯誤。 內(nèi)存監(jiān)視工具可讓您始終關(guān)注潛在問題并確定使用趨勢,因此您可以采用主動方式而不是被動方式進(jìn)行故障排除。 內(nèi)存泄漏通常難以解決,特別是如果您因配置錯誤而誤報(bào),但是盡早處理內(nèi)存問題可以避免以后出現(xiàn)更大的問題。 掌握J(rèn)ava內(nèi)存和GC,使您的整個編程生活變得更加輕松。
AppDynamics通過跟蹤內(nèi)存結(jié)構(gòu)來支持自動JVM泄漏檢測–在代碼級深度監(jiān)視生產(chǎn)應(yīng)用程序。 開始免費(fèi)試用!
翻譯自: https://www.javacodegeeks.com/2016/06/master-java-memory-save-programming.html
總結(jié)
以上是生活随笔為你收集整理的如何掌握Java内存(并保存程序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能电视机怎么连接电脑显示器(电脑怎样连
- 下一篇: JavaFX缺少的功能调查:CSS