您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)Java項目中出現(xiàn)內(nèi)存溢出的原因有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
什么是JAVA內(nèi)存泄漏?
簡單地說,Java內(nèi)存泄漏是指對象不再被應(yīng)用程序使用,而是在工作內(nèi)存中處于活動狀態(tài)。
在Java和大多數(shù)其他編程語言中,垃圾收集器的任務(wù)是刪除不再被應(yīng)用程序引用的對象。如果不選中,這些對象將繼續(xù)消耗系統(tǒng)內(nèi)存,并最終導(dǎo)致崩潰。有時java內(nèi)存泄漏崩潰不會輸出錯誤,但通常錯誤會以java.lang.OutOfMemoryError
當(dāng)未被引用的對象被歸類為引用對象時,就會導(dǎo)致Java內(nèi)存泄漏。這會阻止垃圾回收器清除內(nèi)存,導(dǎo)致內(nèi)存最終耗盡并崩潰。
在內(nèi)存中,對象可以有兩種狀態(tài),未引用和已引用。被引用的對象仍然具有到Java應(yīng)用程序的活動連接,而未被引用的對象則沒有。垃圾回收器的任務(wù)是查找和標(biāo)識未引用的對象并將其刪除。
垃圾回收器不會清理似乎被引用或正在使用的對象。Java內(nèi)存泄漏發(fā)生在未引用的對象重疊時,這些對象似乎仍在使用中。
有幾種方法可以檢查你的代碼,看看它是否發(fā)生了內(nèi)存泄漏。識別泄漏的最簡單方法是查找java.lang.OutOfMemoryError錯誤日志中的事件。如果列出了此事件,您將能夠提取有關(guān)Java的哪些部分導(dǎo)致了這種情況的進一步詳細信息。
您經(jīng)常會發(fā)現(xiàn)有關(guān)Java堆空間的詳細信息。這可能意味著內(nèi)存泄漏,資源無法分配,或者堆大小設(shè)置得太低。
通常也會發(fā)現(xiàn)標(biāo)記為PermGen空間的錯誤。在大多數(shù)情況下,這不是內(nèi)存泄漏,而是需要擴展的分配空間。永久生成空間用于存儲類對象,如果不擴展,則可以填充。
并不是所有的Java內(nèi)存泄漏都是相同的,有些漏洞可以比其他漏洞更容易預(yù)防。讓我們來看看Java內(nèi)存泄漏的一些最常見的原因。
最常見的內(nèi)存泄漏類型之一是Java中的對象隨著時間的推移而創(chuàng)建,但從未釋放。提高性能和防止內(nèi)存泄漏的一個簡單方法是檢查代碼中靜態(tài)字段的使用情況。
當(dāng)您將Java中的任何對象設(shè)置為靜態(tài)時,它會自動將該對象的生命周期附加到JVM本身,因此垃圾收集器從不清除它。正如您可以想象的那樣,如果您有許多大對象被設(shè)置為靜態(tài)的,這會在您的代碼中造成相當(dāng)大的問題。
一定要檢查static和collections的所有用法。這兩者都是導(dǎo)致Java內(nèi)存泄漏和意外占用內(nèi)存的最常見原因。
Java內(nèi)存泄漏的另一個常見原因是存在未關(guān)閉的連接。代碼中保持連接打開而不關(guān)閉連接的任何部分都可能導(dǎo)致內(nèi)存過度使用。未閉合連接最常見的罪魁禍?zhǔn)资莌ttp調(diào)用、stream流、FTP站點和數(shù)據(jù)庫訪問。
當(dāng)保持打開狀態(tài)時,連接會迅速導(dǎo)致堆內(nèi)存膨脹,并最終導(dǎo)致應(yīng)用程序崩潰。若要解決此問題,請始終確保在代碼中指定了關(guān)閉連接的時間。
就像未關(guān)閉的連接一樣,未關(guān)閉的流會導(dǎo)致非常類似的內(nèi)存泄漏和資源問題。如果未選中,則打開的流將增加堆內(nèi)存使用量,以達到臨界級別,并最終崩潰。在舊版本的Java中,流必須手動關(guān)閉,但是現(xiàn)在使用try with resources語句,這可以自動實現(xiàn)。
雖然尋找這些具體的例子可能會有所幫助,但每個程序的編碼都是不同的,需要采用不同的方法。如果您要手動查看代碼,啟用詳細的垃圾收集可以幫助您更好地了解哪些內(nèi)容正在被收集,哪些內(nèi)容沒有被收集。
添加-verbose:gc參數(shù)到配置將準(zhǔn)確地輸出垃圾收集工具正在執(zhí)行的操作,并讓您深入了解可能需要修改的內(nèi)容。這是一個簡單的技巧,但仍然需要你的時間和精力來篩選結(jié)果。
對代碼進行可靠的審核還可以發(fā)現(xiàn)阻礙性能或?qū)е聝?nèi)存泄漏的潛在問題。雖然這看起來很費時,但這通常是處理所有代碼的最佳實踐,并有助于避免嚴(yán)重的麻煩。
最后,為了更快地堵住內(nèi)存泄漏,可以考慮使用Java分析器。探查器允許您監(jiān)視特定的JVM參數(shù),例如對象創(chuàng)建和垃圾回收。探查器甚至比詳細模式更進一步,可以幫助突出顯示需要數(shù)小時手動跟蹤的內(nèi)存和資源問題。
您可以使用諸如YourKit或JProfiler這樣的Java探查器,不僅可以幫助您發(fā)現(xiàn)Java代碼中的內(nèi)存泄漏,還可以確定優(yōu)化和改進的機會。YourKit和JProfiler都有助于刪減不必要的代碼并識別應(yīng)用程序中的冗余。雖然這兩個示例都不會導(dǎo)致內(nèi)存泄漏,但它們會影響代碼的性能。
JAVA Profiler可以提供以下功能:
創(chuàng)建的所有對象
所有方法的CPU時間
執(zhí)行期間創(chuàng)建的對象
從內(nèi)存中刪除的對象
垃圾收集信息
但是,使用一個好的Java分析器只是成功的一半;您還需要監(jiān)視應(yīng)用程序的運行狀況,因為它會隨著時間的推移而變化。為此,您需要將Java分析器與一個著名的Java性能工具配對。
您可以將Java探查器看作是一種反應(yīng)式工具,而Java性能監(jiān)視器則是一種主動式工具。您既要確保您的應(yīng)用程序為您的用戶以最佳方式運行,又要避免不必要的停機時間。Java性能監(jiān)視工具可以測量應(yīng)用程序的響應(yīng)能力,監(jiān)視sla,甚至可以根據(jù)用戶數(shù)據(jù)計算許多不同的度量來跟蹤用戶體驗。
我們花了一些時間來尋找一些最好的Java性能工具,可以用來幫助防止Java內(nèi)存泄漏,并保持代碼平穩(wěn)運行。
以下是我們精選的最佳JAVA性能工具:
SolarWinds AppOptics(免費試用)提供多種應(yīng)用程序的深度視覺效果和報告功能。
DataDog Java性能監(jiān)控工具平衡了易用性,同時優(yōu)先考慮了主動特性
VisualVM是一個簡單的Java探查器,非常適合基本的故障排除。
JProfiler一種付費的Java評測器,可以檢測不同級別的大量bug
Eclipse內(nèi)存分析器MAT提供了Java堆內(nèi)存的詳細細分,以更好地了解內(nèi)存泄漏。
Glowroot一個開源的性能監(jiān)視器,通過本地瀏覽器顯示數(shù)據(jù)。
SolarWinds公司的AppOptics是一款全服務(wù)的應(yīng)用程序性能監(jiān)視器,為大量不同的應(yīng)用程序構(gòu)建。雖然AppOptics支持許多程序,但它在監(jiān)視和排除Java應(yīng)用程序故障方面做得特別好。
與DataDog類似,AppOptics將強大的功能組合到一個易于使用的儀表板中,允許您自定義和控制您的監(jiān)視體驗??梢詮念^開始創(chuàng)建警報,也可以從軟件附帶的預(yù)配置模板庫中選擇警報。
雖然儀表板為您提供了應(yīng)用程序及其狀態(tài)的完整概述,但您也可以深入到代碼級別并將AppOptics用作性能調(diào)諧器。這使得接收實時數(shù)據(jù)并立即在同一軟件中進行故障排除變得很容易。
開發(fā)人員可以通過監(jiān)視Java堆使用率、調(diào)用數(shù)、錯誤率和響應(yīng)時間等指標(biāo)來監(jiān)視Java應(yīng)用程序是否存在內(nèi)存泄漏或其他許多問題。性能數(shù)據(jù)也可以通過日志、圖表或瀑布跟蹤歷史地查看,這樣可以很容易地縮小時間范圍并隔離出問題代碼行。
datadog是專門為使監(jiān)視Java應(yīng)用程序成為一個簡單而直觀的過程而構(gòu)建的。通過交互式儀表板,您可以在服務(wù)、客戶和端點級別查看Java代碼的狀態(tài)。Datadog通過一個簡單的軟件即服務(wù)(SaaS)模型提供了這些見解。
一旦您輸入了代碼,DataDog就可以通過自動生成的服務(wù)映射識別Java問題、依賴關(guān)系和機會。所有這些數(shù)據(jù)都是從向DataDog報告信息的簡單代理安裝中提取的。主儀表板將實時和歷史性能信息作為可視化和列表項引入,您可以對其進行排序。
總錯誤、延遲和請求數(shù)等指標(biāo)可以通過儀表板輕松跟蹤。可以將此視圖更改為網(wǎng)絡(luò)拓撲視圖,以幫助更好地可視化查詢之間的關(guān)系,以及性能如何影響鏈下游的其他功能。
通過警報儀表板,您可以根據(jù)正常運行時間、異常情況或您設(shè)置的特定閾值快速設(shè)置通知。很高興看到這個軟件允許您在設(shè)置警報模板時組合觸發(fā)條件。通過盡可能細化您的警報條件,它有助于減少警報疲勞,并保持您的收件箱干凈。警報可以通過電子郵件發(fā)送,也可以發(fā)送到Slack或Pagerduty等其他工具。
當(dāng)您處理像Java應(yīng)用程序的性能監(jiān)視這樣復(fù)雜的事情時,找到一個既直觀又強大的工具會讓您耳目一新。您可以免費測試DataDog及其所有功能14天。
VisualVM是一個Java故障排除工具,它直接連接到JDK來檢測問題,并通過圖形界面引起您的注意。開發(fā)人員可以查看他們的應(yīng)用程序堆轉(zhuǎn)儲,分析他們的代碼,并查看他們的Java應(yīng)用程序的許多其他見解。因為它直接綁定到您的JDK中,所以可以方便地從您正在工作的地方訪問它。
VisualVM相當(dāng)輕量級,并且直接駐留在本地計算機上,這使得它非常適合在運行中進行故障排除,而且不必依賴基于SaaS的產(chǎn)品。雖然還有其他工具可以提供對Java相關(guān)問題的更深入的見解,但VisualVM是一個簡單而干凈的工具,它非常適合在故障排除過程的開始使用。
當(dāng)談到Java分析器時,VisualVM是一個很好的起點,但是您可能需要考慮將其與性能監(jiān)視工具或其他更詳細的探查器配對,以確保找到所有潛在的bug。
您可以在Windows、Linux或macOS操作系統(tǒng)上免費下載VisualVM
JProfiler by EJ Technologies是一款Java評測器,它以易用性和與Java應(yīng)用程序的輕松集成而自豪。在JVM級別,您可以在執(zhí)行代碼時查看并快速診斷代碼中的問題。像Java代碼中的內(nèi)存泄漏這樣的問題會在堆內(nèi)存分析器下快速突出顯示。打開和關(guān)閉的連接可以通過一個彩色編碼的時間線可視化,這樣就可以很容易地看到丟失的連接,這些連接保持打開狀態(tài)并利用資源。JProfiler還有一個內(nèi)置的堆遍歷器,開發(fā)人員可以使用它從多個角度查看任何一組對象,以便進行更深入的檢查。
默認(rèn)情況下支持JEE,并將JEE組件分組到調(diào)用樹中的組中,這樣可以更容易地對更高級別的分析數(shù)據(jù)進行排序,下到粒度級別和其他子系統(tǒng)。
JProfiler與Windows、Linux和macOS兼容,可以使用試用密鑰免費測試。
為了獲得堆內(nèi)存的詳細細分,Eclipse內(nèi)存分析器被設(shè)計成突出顯示內(nèi)存收集中的缺陷并監(jiān)視Java堆使用的健康狀況。存儲的任何對象都將顯示并在堆中可見,Eclipse內(nèi)存分析器將監(jiān)視和報告內(nèi)存的分配方式以及是否已清除。
儀表板精確地分解堆的大小,以及圖表格式中哪些對象的大小最大。您可以配置自己的視圖,也可以使用許多預(yù)先配置的視圖按對象大小、重復(fù)類或頂級使用者進行排序。這些指標(biāo)可以幫助您快速解決堆中的問題,并為優(yōu)化性能設(shè)置更好的策略。
Eclipse內(nèi)存分析器可以免費下載,并且與Windows、Linux和macOS系統(tǒng)兼容。
Glowroot是一個開源的java apm,設(shè)置起來很快,也很容易開始使用。只需將根目錄文件解壓并添加到你的瀏覽器面板上。
如果您需要一個開銷極低的工具,Glowroot在資源消耗方面處于類的首位。大量的測試表明,Glowroot在其環(huán)境中造成的影響非常小,因此響應(yīng)時間必須以微秒為單位進行記錄。
除了運行極其精簡的Glowroot之外,Glowroot還有許多其他特性,可以用來分析和監(jiān)視Java應(yīng)用程序。所有數(shù)據(jù)的實時和歷史匯總可以通過MBean支持圖表輕松執(zhí)行實時和長期測試。雖然Glowroot并不是功能最豐富的性能監(jiān)視器,但它確實提供了可配置的警報功能,從而為長期使用提供了額外的靈活性。
Glowroot可以免費下載,如果你想體驗一下這個工具,它還附帶了一個方便的演示站點。
https://glowroot.org/overhead.html
Java內(nèi)存泄漏可能會令人沮喪,但是確切地知道它是什么以及如何對其進行故障排除將使處理它們變得更加容易。我們知道Java內(nèi)存泄漏是由于堆內(nèi)存中的對象未清理而導(dǎo)致的。讓我們回顧一下修復(fù)和防止內(nèi)存泄漏的最佳方法。
使用Java編譯器 - 你的工具包是一個很好的選擇,這些工具將幫助您節(jié)省數(shù)不清的調(diào)試時間,并有助于突出顯示代碼中本來很難找到的問題。
使用可信的Java性能監(jiān)視器 - Java性能監(jiān)視器不僅可以提醒您代碼中的問題,還可以幫助您在應(yīng)用程序中發(fā)現(xiàn)內(nèi)存泄漏的跡象,以免它影響到您的用戶。
審核你的代碼 - 在實現(xiàn)新代碼時,定期的審核和測試可以起到很大的作用。安排審核以及清理Java將幫助您的應(yīng)用程序運行更快,并使故障排除變得更容易。
關(guān)于Java項目中出現(xiàn)內(nèi)存溢出的原因有哪些就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。