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