jvm系列(七):jvm調優

轉自:https://www.cnblogs.com/ityouknow/p/6437037.htmlhtml

16年的時候花了一些時間整理了一些關於jvm的介紹文章,到如今回顧起來仍是一些尚未補充全面,其中就包括如何利用工具來監控調優先後的性能變化。工具作爲圖形化界面來展現更能直觀的發現問題,另外一方面一些耗費性能的分析(dump文件分析)通常也不會在生產直接分析,每每dump下來的文件達1G左右,人工分析效率較低,所以利用工具來分析jvm相關問題,長長能夠到達事半功倍的效果來。java

jvm監控分析工具通常分爲兩類,一種是jdk自帶的工具,一種是第三方的分析工具。jdk自帶工具通常在jdk bin目錄下面,以exe的形式直接點擊就可使用,其中包含分析工具已經很強大,幾乎涉及了方方面面,可是咱們最常使用的只有兩款:jconsole.exe和jvisualvm.exe;第三方的分析工具備不少,各自的側重點不一樣,比較有表明性的:MAT(Memory Analyzer Tool)、GChisto等。正則表達式

對於大型 JAVA 應用程序來講,再精細的測試也難以堵住全部的漏洞,即使咱們在測試階段進行了大量卓有成效的工做,不少問題仍是會在生產環境下暴露出來,而且很難在測試環境中進行重現。JVM 可以記錄下問題發生時系統的部分運行狀態,並將其存儲在堆轉儲 (Heap Dump) 文件中,從而爲咱們分析和診斷問題提供了重要的依據。其中VisualVM和MAT是dump文件的分析利器。tomcat

 

jdk自帶的工具

 

jconsole

Jconsole(Java Monitoring and Management Console)是從java5開始,在JDK中自帶的java監控和管理控制檯,用於對JVM中內存,線程和類等的監控,是一個基於JMX(java management extensions)的GUI性能監測工具。jconsole使用jvm的擴展機制獲取並展現虛擬機中運行的應用程序的性能和資源消耗等信息。bash

直接在jdk/bin目錄下點擊jconsole.exe便可啓動,界面以下:eclipse

在彈出的框中能夠選擇本機的監控本機的java應用,也能夠選擇遠程的java服務來監控,若是監控遠程服務須要在tomcat啓動腳本中添加以下代碼:jvm

-Dcom.sun.management.jmxremote.port=6969  
 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

鏈接進去以後,就能夠看到jconsole概覽圖和主要的功能:概述、內存、線程、類、VM、MBeans工具

  • 概述,以圖表的方式顯示出堆內存使用量,活動線程數,已加載的類,CUP佔用率的折線圖,能夠很是清晰的觀察在程序執行過程當中的變更狀況。

  • 內存,主要展現了內存的使用狀況,同時能夠查看堆和非堆內存的變化值對比,也能夠點擊執行GC來處罰GC的執行

  • 線程,主界面展現線程數的活動數和峯值,同時點擊左下方線程能夠查看線程的詳細信息,好比線程的狀態是什麼,堆棧內容等,同時也能夠點擊「檢測死鎖」來檢查線程之間是否有死鎖的狀況。

  • 類,主要展現已加載類的相關信息。
  • VM 概要,展現JVM全部信息總覽,包括基本信息、線程相關、堆相關、操做系統、VM參數等。
  • Mbean,查看Mbean的屬性,方法等。

 

VisualVM

簡介性能

VisualVM 是一個工具,它提供了一個可視界面,用於查看 Java 虛擬機 (Java Virtual Machine, JVM) 上運行的基於 Java 技術的應用程序(Java 應用程序)的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關數據進行組織,並經過一種使您能夠快速查看有關多個 Java 應用程序的數據的方式提供該信息。您能夠查看本地應用程序以及遠程主機上運行的應用程序的相關數據。此外,還能夠捕獲有關 JVM 軟件實例的數據,並將該數據保存到本地系統,以供後期查看或與其餘用戶共享。測試

VisualVM 是javajdk自帶的最牛逼的調優工具了吧,也是我平時使用最多調優工具,幾乎涉及了jvm調優的方方面面。一樣是在jdk/bin目錄下面雙擊jvisualvm.exe既可以使用,啓動起來後和jconsole 同樣一樣能夠選擇本地和遠程,若是須要監控遠程一樣須要配置相關參數,主界面以下;

VisualVM能夠根據須要安裝不一樣的插件,每一個插件的關注點都不一樣,有的主要監控GC,有的主要監控內存,有的監控線程等。

如何安裝:

一、從主菜單中選擇「工具」>「插件」。
二、在「可用插件」標籤中,選中該插件的「安裝」複選框。單擊「安裝」。
三、逐步完成插件安裝程序。

我這裏以 Eclipse(pid 22296)爲例,雙擊後直接展開,主界面展現了系統和jvm兩大塊內容,點擊右下方jvm參數和系統屬性能夠參考詳細的參數信息.

由於VisualVM的插件太多,我這裏主要介紹三個我主要使用幾個:監控、線程、Visual GC

監控的主頁其實也就是,cpu、內存、類、線程的圖表

線程和jconsole功能沒有太大的區別

Visual GC 是經常使用的一個功能,能夠明顯的看到年輕代、老年代的內存變化,以及gc頻率、gc的時間等。

以上的功能其實jconsole幾乎也有,VisualVM更全面更直觀一些,另外VisualVM很是多的其它功能,能夠分析dump的內存快照,dump出來的線程快照而且進行分析等,還有其它不少的插件你們能夠去探索

 

第三方調優工具

 

MAT

MAT是什麼?

MAT(Memory Analyzer Tool),一個基於Eclipse的內存分析工具,是一個快速、功能豐富的Java heap分析工具,它能夠幫助咱們查找內存泄漏和減小內存消耗。使用內存分析工具從衆多的對象中進行分析,快速的計算出在內存中對象的佔用大小,看看是誰阻止了垃圾收集器的回收工做,並能夠經過報表直觀的查看到可能形成這種結果的對象。

一般內存泄露分析被認爲是一件頗有難度的工做,通常由團隊中的資深人士進行。不過要介紹的 MAT(Eclipse Memory Analyzer)被認爲是一個「傻瓜式「的堆轉儲文件分析工具,你只須要輕輕點擊一下鼠標就能夠生成一個專業的分析報告。和其餘內存泄露分析工具相比,MAT 的使用很是容易,基本能夠實現一鍵到位,即便是新手也可以很快上手使用。

MAT以eclipse 插件的形式來安裝,具體的安裝過程就不在描述了,能夠利用visualvm或者是 jmap命令生產堆文件,導入eclipse mat中生成分析報告:

生產這會報表的同時也會在dump文件的同級目錄下生成三份(dump_Top_Consumers.zip、dump_Leak_Suspects.zip、dump_Top_Components.zip)分析結果的html文件,方便發送給相關同事來查看。

須要關注的是下面的Actions、Reports、Step by Step區域:

  • Histogram:列出內存中的對象,對象的個數以及大小,支持正則表達式查找,也能夠計算出該類全部對象的retained size

  • Dominator Tree:列出最大的對象以及其依賴存活的Object (大小是以Retained Heap爲標準排序的)

  • Top Consumers : 經過圖形列出最大的object

  • duplicate classes :檢測由多個類裝載器加載的類

  • Leak Suspects :內存泄漏分析

  • Top Components: 列出大於總堆數的百分之1的報表。

  • Component Report:分析對象屬於同一個包或者被同一個類加載器加載

以上只是一個初級的介紹,mat還有更強大的使用,好比對比堆內存,在生產環境中每每爲了定位問題,每隔幾分鐘dump出一下內存快照,隨後在對比不一樣時間的堆內存的變化來發現問題。

 

GChisto

GChisto是一款專業分析gc日誌的工具,能夠經過gc日誌來分析:Minor GC、full gc的時間、頻率等等,經過列表、報表、圖表等不一樣的形式來反應gc的狀況。雖然界面略顯粗糙,可是功能仍是不錯的。

配置好本地的jdk環境以後,雙擊GChisto.jar,在彈出的輸入框中點擊 add 選擇gc.log日誌

  • GC Pause Stats:能夠查看GC 的次數、GC的時間、GC的開銷、最大GC時間和最小GC時間等,以及相應的柱狀圖

  • GC Pause Distribution:查看GC停頓的詳細分佈,x軸表示垃圾收集停頓時間,y軸表示是停頓次數。

  • GC Timeline:顯示整個時間線上的垃圾收集

不過這款工具已經再也不維護,不能識別最新jdk的日誌文件。

 

gcviewer

GCViewer也是一款分析小工具,用於可視化查看由Sun / Oracle, IBM, HP 和 BEA Java 虛擬機產生的垃圾收集器的日誌,gcviewer我的感受顯示 的界面比較亂沒有GChisto更專業一些。

以上的兩款gc分析日誌,一個不太維護了,一個不太專業,求推薦更好的gc分析工具

相關文章
相關標籤/搜索