Java:java內(nèi)存分析時,要考慮哪些因素?
任何Java內(nèi)存分析的目標(biāo)都是檢查應(yīng)用程序的內(nèi)存消耗。它包括分析應(yīng)用程序響應(yīng)時間或CPU使用情況對內(nèi)存容量的影響。例如,應(yīng)用程序響應(yīng)時間可能會造成內(nèi)存不足和泄漏,從而導(dǎo)致嚴(yán)重的不穩(wěn)定性。
此外,Java內(nèi)存分析還包括查明導(dǎo)致這些內(nèi)存問題的進(jìn)程的方法。這些過程包括檢查過度的垃圾收集。例如,如果垃圾收集影響響應(yīng)時間,則解決方案是優(yōu)化配置。
請記住,對于配置中的每一項更改,其效果必須是減少影響。有時,優(yōu)化配置時問題無法解決。在這種情況下,考慮其他情況。例如,查看分配模式并分析內(nèi)存使用情況本身。
內(nèi)存分析是一個廣泛的話題,但這里有一些重要的方面需要考慮:
逃逸分析
Java對象被創(chuàng)建并存儲在堆中。在Java中,開發(fā)人員不決定是否應(yīng)該在堆棧中生成對象。然而,在實踐中,應(yīng)該希望在堆棧上分配一個對象。主要是因為堆棧上的內(nèi)存分配比堆中的內(nèi)存分配便宜。此外,堆棧上的釋放是免費的,堆棧由運(yùn)行時有效管理。
因此,逃逸分析用于檢查對象是否僅用于線程或方法。JVM執(zhí)行轉(zhuǎn)義分析,并決定是否在堆棧上創(chuàng)建對象。在堆棧上創(chuàng)建對象將提高Java應(yīng)用程序的性能。
監(jiān)視垃圾收集
通常,垃圾收集是一個收集當(dāng)前未分配的資源的過程。然后,它啟動釋放,以便應(yīng)用程序可以再次使用它。
根據(jù)JVM垃圾收集器,只要它根本不包含任何引用,它就會從內(nèi)存中釋放Java對象。JVM會自動收回不再使用的內(nèi)存。如前所述,工作的垃圾收集器應(yīng)該自動釋放不再引用的對象的內(nèi)存。要查看垃圾收集器是否正常工作,請將命令行參數(shù)-verbose:gc添加到虛擬機(jī)。
不同的語言有不同的機(jī)制。例如,Python有一個稱為引用計數(shù)的附加功能,作為其垃圾收集模塊的一部分。另一方面,Java垃圾收集特性非常嚴(yán)格,這使得Java成為一種內(nèi)存安全的語言。
現(xiàn)在,如果是這樣的話,為什么我們?nèi)匀恍枰狫ava內(nèi)存分析?
答案很簡單。有些Java應(yīng)用程序符合其內(nèi)存管理,并且性能良好。然而,并非所有Java應(yīng)用程序都是平等的。因此,有一些復(fù)雜的Java應(yīng)用程序由于內(nèi)存限制而性能較差。
當(dāng)應(yīng)用程序有太多已分配對象并且分配得太快時,就會發(fā)生這種情況。由于年輕一代很快就滿了,所以流失率很高,因此必須觸發(fā)垃圾收集器(GC)。記住,高流失率可能會妨礙最佳發(fā)電規(guī)模。因此,開發(fā)人員在嘗試優(yōu)化垃圾收集本身之前,應(yīng)該在代碼中解決這個問題。
Java GC可以在不溢出舊一代的情況下進(jìn)行管理。然而,這種方法以犧牲應(yīng)用程序的性能為代價??紤]到Java內(nèi)存管理不允許開發(fā)人員超出分配的內(nèi)存。當(dāng)內(nèi)存消耗超出其分配時,將引發(fā)錯誤或異常。
檢查應(yīng)用程序的總體內(nèi)存使用情況
jvisualvm是Java的內(nèi)存分析工具之一,用于分析Java應(yīng)用程序的運(yùn)行時行為。它跟蹤正在運(yùn)行的Java程序,檢查其內(nèi)存和CPU消耗。此外,它還用于創(chuàng)建內(nèi)存堆轉(zhuǎn)儲,以分析堆中的對象。
通常,如果應(yīng)用程序中的進(jìn)程運(yùn)行時間長或內(nèi)存消耗高,則該進(jìn)程被認(rèn)為是擴(kuò)展的。程序的總使用或可用內(nèi)存可通過以下方式在程序中獲得:
java.lang.Runtime.getRuntime();
在java培訓(xùn)中,無論是理論知識,還是實戰(zhàn)項目,都是緊跟市場和企業(yè)需求的,讓你掌握最新技術(shù),走在市場前沿。
監(jiān)控執(zhí)行的操作或方法
Java內(nèi)存分析的一部分是監(jiān)視應(yīng)用程序中執(zhí)行的操作或方法。開發(fā)人員通常使用基于事件的測量方法來分析各個方法的執(zhí)行。這是在每個方法調(diào)用的開始和結(jié)束時使用日志和時間戳完成的。結(jié)果是調(diào)用單個方法的總次數(shù)以及每次調(diào)用的確切執(zhí)行時間。
JVM工具接口(JVM TI)是Java運(yùn)行時中的一個特殊回調(diào),在方法執(zhí)行的開始和結(jié)束時調(diào)用。然而,此過程的開銷很高,可能會影響應(yīng)用程序的運(yùn)行時行為。因此,尋找使用字節(jié)碼檢測的現(xiàn)代性能測量方法。它減少了開銷,提高了應(yīng)用效率。
檢查應(yīng)用程序使用或加載的內(nèi)存類/庫
當(dāng)構(gòu)建一個復(fù)雜的Java應(yīng)用程序時,預(yù)計某些事情最終會失敗,或者會遇到OutOfMemoryException。內(nèi)存問題總是帶來新的和意想不到的挑戰(zhàn)。因此,內(nèi)存分析的最佳實踐之一是檢查應(yīng)用程序正在使用或正在加載的內(nèi)存類和庫。
監(jiān)視Java線程
活動Java線程是另一個要監(jiān)視的JVM內(nèi)存度量。在深入研究線程背后的概念之前,這里有兩種類型的Java線程需要研究:
l 守護(hù)線程——這是用戶線程的服務(wù)提供者。JVM創(chuàng)建守護(hù)進(jìn)程線程。守護(hù)進(jìn)程線程的生命取決于用戶線程,因此它們的優(yōu)先級較低。它們執(zhí)行垃圾收集和其他內(nèi)務(wù)處理過程。
l 用戶線程——由應(yīng)用程序或用戶創(chuàng)建。這些是高優(yōu)先級線程,JVM將等待它們完成任務(wù)。
線程可能會創(chuàng)建或破壞應(yīng)用程序。如果線程數(shù)太多,會降低響應(yīng)時間。這意味著線程數(shù)越高,處理器利用率越高。這背后的原因是每個線程所需的處理能力。要在線程之間頻繁切換,需要處理能力。
當(dāng)預(yù)期有大量并發(fā)請求時,使用的線程數(shù)會增加。需要注意的是,這將減少應(yīng)用程序用戶的響應(yīng)時間。
你可以相應(yīng)地管理線程。例如,線程尤其適用于處理并發(fā)任務(wù),如獲取數(shù)據(jù)或?qū)?shù)據(jù)寫入數(shù)據(jù)庫。開發(fā)人員使用線程來提高應(yīng)用程序的性能,特別是當(dāng)他們有I/O時。但是,請注意,當(dāng)有大量線程執(zhí)行并發(fā)工作時,問題很普遍。
另一個需要考慮的重要問題是線程開銷,這會導(dǎo)致應(yīng)用程序的總體速度下降。創(chuàng)建和銷毀線程時會發(fā)生這種情況。此外,在保存和恢復(fù)線程狀態(tài)時會發(fā)生開銷。由于硬件資源有限且共享,因此存在開銷。
使用Retrace進(jìn)行JMX監(jiān)視
Java是一種健壯的編程語言,它提供了處理內(nèi)存消耗的工具和功能。此外,有許多方法可以執(zhí)行Java內(nèi)存分析。你可以選擇更多以內(nèi)存為中心的評測工具。一些工具專門用于Java內(nèi)存泄漏分析或具有嚴(yán)格功能的通用APM,以監(jiān)控應(yīng)用程序。
Java管理擴(kuò)展(JMX)是一種用于監(jiān)視和管理Java應(yīng)用程序的Java技術(shù)。它在開發(fā)人員中得到廣泛接受,因為它支持通用管理系統(tǒng)。此外,它在應(yīng)用程序需要注意時提供通知。此外,它還會更改應(yīng)用程序的狀態(tài),以提供問題的解決方案。JMX是一個強(qiáng)大的工具。當(dāng)JMX與Retrace配對時,它會顯示應(yīng)用程序的整體性能指標(biāo)。