JDK14性能管理工具之Jconsole的使用詳解
我們?cè)陂_(kāi)發(fā)java項(xiàng)目的時(shí)候,或多或少都會(huì)去用到Java的性能管理工具。有時(shí)候是為了提升應(yīng)用程序的性能,有時(shí)候是為了查找java應(yīng)用程序的bug。
性能監(jiān)控和調(diào)試工具在英文中叫做profile tool,提起這種工具大家可能會(huì)想到一些非常出名的jprofile等收費(fèi)工具,其實(shí)JDK也自帶了一些性能調(diào)試工具,比如JMC和Jconsole。
JMC現(xiàn)在已經(jīng)和JDK的版本獨(dú)立出來(lái)了,詳情請(qǐng)參考我之前的文章: JDK 14的新特性:JFR,JMC和JFR事件流 ,今天我們將會(huì)重點(diǎn)講解Jconsole的使用。
JConsole
JConsole是JDK自帶的管理工具,在JAVA_HOME/bin下面,直接命令JConsole即可開(kāi)啟JConsole。
JConsole有兩種連接方式,一種是連接本地的進(jìn)程,一種是連接遠(yuǎn)程的程序。
本地連接是不需要密碼的,直接選擇相應(yīng)的JVM程序即可。本地連接有一個(gè)前提,就是JConsole的用戶一定要和java程序的用戶是相同的,否則無(wú)法操作JVM。
遠(yuǎn)程連接是通過(guò)JMX協(xié)議進(jìn)行的,JMX的全稱是Java Management Extention,現(xiàn)在大家做web可能對(duì)這個(gè)協(xié)議不太清楚,如果是做客戶端程序,接觸的應(yīng)該會(huì)多一些。簡(jiǎn)單點(diǎn)講,JMX是用來(lái)做遠(yuǎn)程管理的。程序把要管理的Bean暴露出去,然后通過(guò)JMX協(xié)議連接進(jìn)行操作。
好了,我們連上一個(gè)自己寫(xiě)的程序試一下。
JConsole分為六大部分,概覽,內(nèi)存,線程,類,VM和MBean。
先看一下概覽:
概覽展示了堆內(nèi)存使用量,線程,類和CPU占用率這四大內(nèi)容。
我們這個(gè)程序是使用JDK14來(lái)啟動(dòng)的,我們看下它的內(nèi)存情況:
從上圖中,我們可以看到使用JConsole可以監(jiān)控堆內(nèi)存,非堆內(nèi)存的一些情況,更進(jìn)一步,還可以監(jiān)控內(nèi)存池中的一些項(xiàng)目的使用情況。
G1垃圾回收器中的Eden,Old和Survivor space大家應(yīng)該都很熟悉了。
Young Gen被劃分為1個(gè)Eden Space和2個(gè)Suvivor Space。當(dāng)對(duì)象剛剛被創(chuàng)建的時(shí)候,是放在Eden space。垃圾回收的時(shí)候,會(huì)掃描Eden Space和一個(gè)Suvivor Space。如果在垃圾回收的時(shí)候發(fā)現(xiàn)Eden Space中的對(duì)象任然有效,則會(huì)將其復(fù)制到另外一個(gè)Suvivor Space。
就這樣不斷的掃描,最后經(jīng)過(guò)多次掃描發(fā)現(xiàn)任然有效的對(duì)象會(huì)被放入Old Gen表示其生命周期比較長(zhǎng),可以減少垃圾回收時(shí)間。
在JDK8之前,類定義、字節(jié)碼和常量等很少會(huì)變更的信息是放在持久代Perm Gen中的。不過(guò)在JDK8之后,Perm Gen已經(jīng)被取消了,現(xiàn)在叫做Metaspace。Metaspace并不在java虛擬機(jī)中,它使用的是本地內(nèi)存。Metaspace可以通過(guò)-XX:MaxMetaspaceSize來(lái)控制。
Code Cache是JVM用來(lái)存儲(chǔ)native code的,因?yàn)槭怯肏eap的形式來(lái)存儲(chǔ)的,所以叫Code Heap。Code Heap被分為三個(gè)部分,Non-method,Profiled和Non-profiled。
Non-method部分包含的是非方法的code,比如說(shuō)編譯器緩沖區(qū)和字節(jié)碼解釋器。這些代碼是永久保存在代碼緩存區(qū)中的。代碼堆的大小是固定的。Non-method使用-XX:NonMethodCodeHeapSize來(lái)控制。
Profiled部分表示存的是生命周期比較短的稍微優(yōu)化的profiled methods。Profiled使用–XX:ProfiledCodeHeapSize來(lái)控制。
Non-profiled存放的是優(yōu)化過(guò)的,non-profiled方法,并且他們的生命周期會(huì)比較長(zhǎng)。Non-profiled用-XX:NonProfiledCodeHeapSize來(lái)控制。
最后還有一個(gè)Compressed Class Space,它是和-XX:+UseCompressedOops,-XX:+UseCompressedClassesPointers有關(guān)的。實(shí)際上是一個(gè)指針的壓縮,可以使用32bits來(lái)表示之前64bits的指針。
線程列出了程序目前正在運(yùn)行的線程,如果點(diǎn)擊具體的線程信息還可以看到線程中的堆棧跟蹤和線程狀態(tài)統(tǒng)計(jì),非常有用。
類很簡(jiǎn)單,顯示了加載的類的個(gè)數(shù)。
VM信息展示了虛擬機(jī)相關(guān)的一些參數(shù)。
最后,MBean暴露了JVM中的一些Bean,我們可以查看這些bean的信息或者調(diào)用Bean中的方法。
以我們之前講過(guò)的JFR為例,我們可以調(diào)用JFR的startRecording,stopRecording等方法。
JConsole是一個(gè)比較簡(jiǎn)單但是也很實(shí)用的profile工具,希望大家能夠在編寫(xiě)代碼之余,多多考慮代碼的性能和效率。
總結(jié)
到此這篇關(guān)于JDK14性能管理工具之Jconsole詳解的文章就介紹到這了,更多相關(guān)JDK14性能管理工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析ConcurrentHashMap:成員屬性、內(nèi)部類、構(gòu)造方法
ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見(jiàn)問(wèn)題---ConcurrentHashMap知識(shí),一起看看吧2021-06-06SpringBoot 使用hibernate validator校驗(yàn)
這篇文章主要介紹了SpringBoot 使用hibernate validator校驗(yàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11mybatis?實(shí)現(xiàn)字段大小寫(xiě)賦值
這篇文章主要介紹了mybatis?實(shí)現(xiàn)字段大小寫(xiě)賦值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11解決mybatis中order by排序無(wú)效問(wèn)題
這篇文章主要介紹了解決mybatis中order by排序無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12ssm項(xiàng)目實(shí)現(xiàn)用戶登陸持久化(token)
這篇文章主要介紹了ssm項(xiàng)目實(shí)現(xiàn)用戶登陸持久化(token),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java8 stream 中利用 groupingBy 進(jìn)行多字段分組求和案例
這篇文章主要介紹了Java8 stream 中利用 groupingBy 進(jìn)行多字段分組求和案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08SpringBoot 自定義注解異步記錄復(fù)雜日志詳解
這篇文章主要為大家介紹了SpringBoot 自定義注解異步記錄復(fù)雜日志詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09mybatis中的動(dòng)態(tài)sql問(wèn)題
這篇文章主要介紹了mybatis中的動(dòng)態(tài)sql問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場(chǎng)景分析
這篇文章主要介紹了SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場(chǎng)景分析,本篇文章簡(jiǎn)單介紹?OpenFeign?調(diào)用傳遞?header?,以及多線程環(huán)境下可能會(huì)出現(xiàn)的問(wèn)題,其中涉及到?ThreadLocal?的相關(guān)知識(shí),需要的朋友可以參考下2022-07-07Spring Boot集成Redis實(shí)戰(zhàn)操作功能
這篇文章主要介紹了Spring Boot集成Redis實(shí)戰(zhàn)操作,包括如何集成redis以及redis的一些優(yōu)點(diǎn),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11