天天看點

JDK14性能管理工具:Jconsole詳解

目錄

  • ​​簡介​​
  • ​​JConsole​​
  • ​​概覽​​
  • ​​記憶體​​
  • ​​線程​​
  • ​​類​​
  • ​​VM資訊​​
  • ​​MBean​​
  • ​​總結​​

簡介

我們在開發java項目的時候,或多或少都會去用到Java的性能管理工具。有時候是為了提升應用程式的性能,有時候是為了查找java應用程式的bug。

性能監控和調試工具在英文中叫做profile tool,提起這種工具大家可能會想到一些非常出名的jprofile等收費工具,其實JDK也自帶了一些性能調試工具,比如JMC和Jconsole。

JMC現在已經和JDK的版本獨立出來了,詳情請參考我之前的文章:​​JDK 14的新特性:JFR,JMC和JFR事件流​​,今天我們将會重點講解Jconsole的使用。

更多内容請通路​​www.flydean.com​​

JConsole

JConsole是JDK自帶的管理工具,在JAVA_HOME/bin下面,直接指令JConsole即可開啟JConsole。

JDK14性能管理工具:Jconsole詳解

JConsole有兩種連接配接方式,一種是連接配接本地的程序,一種是連接配接遠端的程式。

本地連接配接是不需要密碼的,直接選擇相應的JVM程式即可。本地連接配接有一個前提,就是JConsole的使用者一定要和java程式的使用者是相同的,否則無法操作JVM。

遠端連接配接是通過JMX協定進行的,JMX的全稱是Java Management Extention,現在大家做web可能對這個協定不太清楚,如果是做用戶端程式,接觸的應該會多一些。簡單點講,JMX是用來做遠端管理的。程式把要管理的Bean暴露出去,然後通過JMX協定連接配接進行操作。

好了,我們連上一個自己寫的程式試一下。

概覽

JConsole分為六大部分,概覽,記憶體,線程,類,VM和MBean。

先看一下概覽:

JDK14性能管理工具:Jconsole詳解

概覽展示了堆記憶體使用量,線程,類和CPU占用率這四大内容。

記憶體

我們這個程式是使用JDK14來啟動的,我們看下它的記憶體情況:

JDK14性能管理工具:Jconsole詳解

從上圖中,我們可以看到使用JConsole可以監控堆記憶體,非堆記憶體的一些情況,更進一步,還可以監控記憶體池中的一些項目的使用情況。

G1垃圾回收器中的Eden,Old和Survivor space大家應該都很熟悉了。

Young Gen被劃分為1個Eden Space和2個Suvivor Space。當對象剛剛被建立的時候,是放在Eden space。垃圾回收的時候,會掃描Eden Space和一個Suvivor Space。如果在垃圾回收的時候發現Eden Space中的對象任然有效,則會将其複制到另外一個Suvivor Space。

就這樣不斷的掃描,最後經過多次掃描發現任然有效的對象會被放入Old Gen表示其生命周期比較長,可以減少垃圾回收時間。

在JDK8之前,類定義、位元組碼和常量等很少會變更的資訊是放在持久代Perm Gen中的。不過在JDK8之後,Perm Gen已經被取消了,現在叫做Metaspace。Metaspace并不在java虛拟機中,它使用的是本地記憶體。Metaspace可以通過-XX:MaxMetaspaceSize來控制。

Code Cache是JVM用來存儲native code的,因為是用Heap的形式來存儲的,是以叫Code Heap。Code Heap被分為三個部分,Non-method,Profiled和Non-profiled。

Non-method部分包含的是非方法的code,比如說編譯器緩沖區和位元組碼解釋器。這些代碼是永久儲存在代碼緩存區中的。代碼堆的大小是固定的。Non-method使用-XX:NonMethodCodeHeapSize來控制。

Profiled部分表示存的是生命周期比較短的稍微優化的profiled methods。Profiled使用–XX:ProfiledCodeHeapSize來控制。

Non-profiled存放的是優化過的,non-profiled方法,并且他們的生命周期會比較長。Non-profiled用-XX:NonProfiledCodeHeapSize來控制。

最後還有一個Compressed Class Space,它是和-XX:+UseCompressedOops,-XX:+UseCompressedClassesPointers有關的。實際上是一個指針的壓縮,可以使用32bits來表示之前64bits的指針。

線程

JDK14性能管理工具:Jconsole詳解

線程列出了程式目前正在運作的線程,如果點選具體的線程資訊還可以看到線程中的堆棧跟蹤和線程狀态統計,非常有用。

類很簡單,顯示了加載的類的個數。

JDK14性能管理工具:Jconsole詳解

VM資訊

JDK14性能管理工具:Jconsole詳解

VM資訊展示了虛拟機相關的一些參數。

MBean

最後,MBean暴露了JVM中的一些Bean,我們可以檢視這些bean的資訊或者調用Bean中的方法。

JDK14性能管理工具:Jconsole詳解

以我們之前講過的JFR為例,我們可以調用JFR的startRecording,stopRecording等方法。

總結

JConsole是一個比較簡單但是也很實用的profile工具,希望大家能夠在編寫代碼之餘,多多考慮代碼的性能和效率。

本文作者:flydean程式那些事