中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java項目中出現內存溢出的原因有哪些

發布時間:2020-12-11 13:55:40 來源:億速云 閱讀:521 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關Java項目中出現內存溢出的原因有哪些,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

什么是JAVA內存泄漏?

簡單地說,Java內存泄漏是指對象不再被應用程序使用,而是在工作內存中處于活動狀態。

在Java和大多數其他編程語言中,垃圾收集器的任務是刪除不再被應用程序引用的對象。如果不選中,這些對象將繼續消耗系統內存,并最終導致崩潰。有時java內存泄漏崩潰不會輸出錯誤,但通常錯誤會以java.lang.OutOfMemoryError

JAVA內存泄漏的原因是什么?

當未被引用的對象被歸類為引用對象時,就會導致Java內存泄漏。這會阻止垃圾回收器清除內存,導致內存最終耗盡并崩潰。

在內存中,對象可以有兩種狀態,未引用和已引用。被引用的對象仍然具有到Java應用程序的活動連接,而未被引用的對象則沒有。垃圾回收器的任務是查找和標識未引用的對象并將其刪除。

垃圾回收器不會清理似乎被引用或正在使用的對象。Java內存泄漏發生在未引用的對象重疊時,這些對象似乎仍在使用中。

我怎么知道是否有內存泄漏?

有幾種方法可以檢查你的代碼,看看它是否發生了內存泄漏。識別泄漏的最簡單方法是查找java.lang.OutOfMemoryError錯誤日志中的事件。如果列出了此事件,您將能夠提取有關Java的哪些部分導致了這種情況的進一步詳細信息。

您經常會發現有關Java堆空間的詳細信息。這可能意味著內存泄漏,資源無法分配,或者堆大小設置得太低。

通常也會發現標記為PermGen空間的錯誤。在大多數情況下,這不是內存泄漏,而是需要擴展的分配空間。永久生成空間用于存儲類對象,如果不擴展,則可以填充。

并不是所有的Java內存泄漏都是相同的,有些漏洞可以比其他漏洞更容易預防。讓我們來看看Java內存泄漏的一些最常見的原因。

如何防止JAVA內存泄漏

最常見的內存泄漏類型之一是Java中的對象隨著時間的推移而創建,但從未釋放。提高性能和防止內存泄漏的一個簡單方法是檢查代碼中靜態字段的使用情況。

當您將Java中的任何對象設置為靜態時,它會自動將該對象的生命周期附加到JVM本身,因此垃圾收集器從不清除它。正如您可以想象的那樣,如果您有許多大對象被設置為靜態的,這會在您的代碼中造成相當大的問題。

一定要檢查static和collections的所有用法。這兩者都是導致Java內存泄漏和意外占用內存的最常見原因。

Java內存泄漏的另一個常見原因是存在未關閉的連接。代碼中保持連接打開而不關閉連接的任何部分都可能導致內存過度使用。未閉合連接最常見的罪魁禍首是http調用、stream流、FTP站點和數據庫訪問。

當保持打開狀態時,連接會迅速導致堆內存膨脹,并最終導致應用程序崩潰。若要解決此問題,請始終確保在代碼中指定了關閉連接的時間。

就像未關閉的連接一樣,未關閉的流會導致非常類似的內存泄漏和資源問題。如果未選中,則打開的流將增加堆內存使用量,以達到臨界級別,并最終崩潰。在舊版本的Java中,流必須手動關閉,但是現在使用try with resources語句,這可以自動實現。

雖然尋找這些具體的例子可能會有所幫助,但每個程序的編碼都是不同的,需要采用不同的方法。如果您要手動查看代碼,啟用詳細的垃圾收集可以幫助您更好地了解哪些內容正在被收集,哪些內容沒有被收集。

添加-verbose:gc參數到配置將準確地輸出垃圾收集工具正在執行的操作,并讓您深入了解可能需要修改的內容。這是一個簡單的技巧,但仍然需要你的時間和精力來篩選結果。

對代碼進行可靠的審核還可以發現阻礙性能或導致內存泄漏的潛在問題。雖然這看起來很費時,但這通常是處理所有代碼的最佳實踐,并有助于避免嚴重的麻煩。

防止JAVA內存泄漏的工具

最后,為了更快地堵住內存泄漏,可以考慮使用Java分析器。探查器允許您監視特定的JVM參數,例如對象創建和垃圾回收。探查器甚至比詳細模式更進一步,可以幫助突出顯示需要數小時手動跟蹤的內存和資源問題。

您可以使用諸如YourKit或JProfiler這樣的Java探查器,不僅可以幫助您發現Java代碼中的內存泄漏,還可以確定優化和改進的機會。YourKit和JProfiler都有助于刪減不必要的代碼并識別應用程序中的冗余。雖然這兩個示例都不會導致內存泄漏,但它們會影響代碼的性能。

JAVA Profiler可以提供以下功能:

  • 創建的所有對象

  • 所有方法的CPU時間

  • 執行期間創建的對象

  • 從內存中刪除的對象

  • 垃圾收集信息

但是,使用一個好的Java分析器只是成功的一半;您還需要監視應用程序的運行狀況,因為它會隨著時間的推移而變化。為此,您需要將Java分析器與一個著名的Java性能工具配對。

您可以將Java探查器看作是一種反應式工具,而Java性能監視器則是一種主動式工具。您既要確保您的應用程序為您的用戶以最佳方式運行,又要避免不必要的停機時間。Java性能監視工具可以測量應用程序的響應能力,監視sla,甚至可以根據用戶數據計算許多不同的度量來跟蹤用戶體驗。

我們花了一些時間來尋找一些最好的Java性能工具,可以用來幫助防止Java內存泄漏,并保持代碼平穩運行。

以下是我們精選的最佳JAVA性能工具:

  • SolarWinds AppOptics(免費試用)提供多種應用程序的深度視覺效果和報告功能。

  • DataDog Java性能監控工具平衡了易用性,同時優先考慮了主動特性

  • VisualVM是一個簡單的Java探查器,非常適合基本的故障排除。

  • JProfiler一種付費的Java評測器,可以檢測不同級別的大量bug

  • Eclipse內存分析器MAT提供了Java堆內存的詳細細分,以更好地了解內存泄漏。

  • Glowroot一個開源的性能監視器,通過本地瀏覽器顯示數據。

1. SOLARWINDS APPOPTICS(免費試用)

Java項目中出現內存溢出的原因有哪些

SolarWinds公司的AppOptics是一款全服務的應用程序性能監視器,為大量不同的應用程序構建。雖然AppOptics支持許多程序,但它在監視和排除Java應用程序故障方面做得特別好。

與DataDog類似,AppOptics將強大的功能組合到一個易于使用的儀表板中,允許您自定義和控制您的監視體驗。可以從頭開始創建警報,也可以從軟件附帶的預配置模板庫中選擇警報。

雖然儀表板為您提供了應用程序及其狀態的完整概述,但您也可以深入到代碼級別并將AppOptics用作性能調諧器。這使得接收實時數據并立即在同一軟件中進行故障排除變得很容易。

開發人員可以通過監視Java堆使用率、調用數、錯誤率和響應時間等指標來監視Java應用程序是否存在內存泄漏或其他許多問題。性能數據也可以通過日志、圖表或瀑布跟蹤歷史地查看,這樣可以很容易地縮小時間范圍并隔離出問題代碼行。

2. DataDog Java性能監控工具

Java項目中出現內存溢出的原因有哪些

datadog是專門為使監視Java應用程序成為一個簡單而直觀的過程而構建的。通過交互式儀表板,您可以在服務、客戶和端點級別查看Java代碼的狀態。Datadog通過一個簡單的軟件即服務(SaaS)模型提供了這些見解。

一旦您輸入了代碼,DataDog就可以通過自動生成的服務映射識別Java問題、依賴關系和機會。所有這些數據都是從向DataDog報告信息的簡單代理安裝中提取的。主儀表板將實時和歷史性能信息作為可視化和列表項引入,您可以對其進行排序。

總錯誤、延遲和請求數等指標可以通過儀表板輕松跟蹤。可以將此視圖更改為網絡拓撲視圖,以幫助更好地可視化查詢之間的關系,以及性能如何影響鏈下游的其他功能。

通過警報儀表板,您可以根據正常運行時間、異常情況或您設置的特定閾值快速設置通知。很高興看到這個軟件允許您在設置警報模板時組合觸發條件。通過盡可能細化您的警報條件,它有助于減少警報疲勞,并保持您的收件箱干凈。警報可以通過電子郵件發送,也可以發送到Slack或Pagerduty等其他工具。

當您處理像Java應用程序的性能監視這樣復雜的事情時,找到一個既直觀又強大的工具會讓您耳目一新。您可以免費測試DataDog及其所有功能14天。

3. VisualVM

Java項目中出現內存溢出的原因有哪些

VisualVM是一個Java故障排除工具,它直接連接到JDK來檢測問題,并通過圖形界面引起您的注意。開發人員可以查看他們的應用程序堆轉儲,分析他們的代碼,并查看他們的Java應用程序的許多其他見解。因為它直接綁定到您的JDK中,所以可以方便地從您正在工作的地方訪問它。

VisualVM相當輕量級,并且直接駐留在本地計算機上,這使得它非常適合在運行中進行故障排除,而且不必依賴基于SaaS的產品。雖然還有其他工具可以提供對Java相關問題的更深入的見解,但VisualVM是一個簡單而干凈的工具,它非常適合在故障排除過程的開始使用。

當談到Java分析器時,VisualVM是一個很好的起點,但是您可能需要考慮將其與性能監視工具或其他更詳細的探查器配對,以確保找到所有潛在的bug。

您可以在Windows、Linux或macOS操作系統上免費下載VisualVM

4. JPROFILER

Java項目中出現內存溢出的原因有哪些

JProfiler by EJ Technologies是一款Java評測器,它以易用性和與Java應用程序的輕松集成而自豪。在JVM級別,您可以在執行代碼時查看并快速診斷代碼中的問題。像Java代碼中的內存泄漏這樣的問題會在堆內存分析器下快速突出顯示。打開和關閉的連接可以通過一個彩色編碼的時間線可視化,這樣就可以很容易地看到丟失的連接,這些連接保持打開狀態并利用資源。JProfiler還有一個內置的堆遍歷器,開發人員可以使用它從多個角度查看任何一組對象,以便進行更深入的檢查。

默認情況下支持JEE,并將JEE組件分組到調用樹中的組中,這樣可以更容易地對更高級別的分析數據進行排序,下到粒度級別和其他子系統。

JProfiler與Windows、Linux和macOS兼容,可以使用試用密鑰免費測試。

5. Eclipse內存分析器 MAT

Java項目中出現內存溢出的原因有哪些

為了獲得堆內存的詳細細分,Eclipse內存分析器被設計成突出顯示內存收集中的缺陷并監視Java堆使用的健康狀況。存儲的任何對象都將顯示并在堆中可見,Eclipse內存分析器將監視和報告內存的分配方式以及是否已清除。

儀表板精確地分解堆的大小,以及圖表格式中哪些對象的大小最大。您可以配置自己的視圖,也可以使用許多預先配置的視圖按對象大小、重復類或頂級使用者進行排序。這些指標可以幫助您快速解決堆中的問題,并為優化性能設置更好的策略。

Eclipse內存分析器可以免費下載,并且與Windows、Linux和macOS系統兼容。

6. GLOWROOT

Java項目中出現內存溢出的原因有哪些

Glowroot是一個開源的java apm,設置起來很快,也很容易開始使用。只需將根目錄文件解壓并添加到你的瀏覽器面板上。

如果您需要一個開銷極低的工具,Glowroot在資源消耗方面處于類的首位。大量的測試表明,Glowroot在其環境中造成的影響非常小,因此響應時間必須以微秒為單位進行記錄。

除了運行極其精簡的Glowroot之外,Glowroot還有許多其他特性,可以用來分析和監視Java應用程序。所有數據的實時和歷史匯總可以通過MBean支持圖表輕松執行實時和長期測試。雖然Glowroot并不是功能最豐富的性能監視器,但它確實提供了可配置的警報功能,從而為長期使用提供了額外的靈活性。

Glowroot可以免費下載,如果你想體驗一下這個工具,它還附帶了一個方便的演示站點。

https://glowroot.org/overhead.html

選擇JAVA性能工具

Java內存泄漏可能會令人沮喪,但是確切地知道它是什么以及如何對其進行故障排除將使處理它們變得更加容易。我們知道Java內存泄漏是由于堆內存中的對象未清理而導致的。讓我們回顧一下修復和防止內存泄漏的最佳方法。

使用Java編譯器 - 你的工具包是一個很好的選擇,這些工具將幫助您節省數不清的調試時間,并有助于突出顯示代碼中本來很難找到的問題。

使用可信的Java性能監視器 - Java性能監視器不僅可以提醒您代碼中的問題,還可以幫助您在應用程序中發現內存泄漏的跡象,以免它影響到您的用戶。

審核你的代碼 - 在實現新代碼時,定期的審核和測試可以起到很大的作用。安排審核以及清理Java將幫助您的應用程序運行更快,并使故障排除變得更容易。

關于Java項目中出現內存溢出的原因有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

紫云| 蕉岭县| 文水县| 武平县| 蒙城县| 衡山县| 梨树县| 临汾市| 黎城县| 桑植县| 公主岭市| 科技| 舞阳县| 林芝县| 衡水市| 沂水县| 雷波县| 阿尔山市| 孙吴县| 桓台县| 元谋县| 财经| 淳安县| 安义县| 邵阳市| 舞阳县| 新昌县| 寿宁县| 杨浦区| 巫山县| 滕州市| 调兵山市| 邵武市| 武胜县| 绩溪县| 台前县| 马龙县| 施秉县| 信丰县| 德兴市| 广昌县|