JVM
話說面試這塊,JVM算是一個(gè)經(jīng)典的也是三年必問的知識(shí)點(diǎn)了,而且這個(gè)知識(shí)點(diǎn)算是最重要的一個(gè)知識(shí)點(diǎn),你如果會(huì)這個(gè)內(nèi)容,那么對你的在之后的面試中,能夠喊出一個(gè)不錯(cuò)的價(jià)格。
而關(guān)于JVM和還有關(guān)于垃圾回收算法的解析,在這里就不在給大家進(jìn)行講解了。大家有興趣的可以看一下之前推出的這幾篇文章
性能監(jiān)控工具
我們都在最開始學(xué)JAVA的時(shí)候,安裝過Java,不管是直接安裝版本還是復(fù)制過來解壓好的,大家都可以在JDK的安裝目錄中找到一些exe的程序,而這些exe的程序里面,有很多是我們不怎么去關(guān)注的性能的監(jiān)控工具。

大家可以看一下里面這些exe,是不是感覺Sun公司有時(shí)候也是很給力的,各種給大家隱藏的福利,就比如下面我們要說的JVM的調(diào)優(yōu)工具,就是Jconsole,而還有一些比如說
jstack :顯示虛擬機(jī)的線程快照
jps :虛擬機(jī)進(jìn)程狀況工具
JConsole :JMX的可視化管理工具
VisualVM :多合一故障管理工具 (我認(rèn)為最牛掰的工具)
關(guān)于使用,我們在下面開始一一的講述,先從我們最關(guān)心的JVM調(diào)優(yōu)開始。
JVM調(diào)優(yōu)工具
主要的調(diào)優(yōu)工具有JDK自己帶的工具,也有外部的屬于收費(fèi)的,大致就這么幾種。Jconsole,jProfile,VisualVM。
- Jconsole :jdk自帶,功能簡單,但是可以在系統(tǒng)有一定負(fù)荷的情況下使用。對垃圾回收算法有很詳細(xì)的跟蹤。
- JProfiler :這就是需要你另外付費(fèi)的了的商業(yè)軟件,功能強(qiáng)大(付錢付錢)。
- VisualVM :JDK自帶,功能強(qiáng)大,與JProfiler類似。
而就因?yàn)椴恢肋@么幾個(gè)工具而且沒使用過這些工具,被公司老弟瘋狂嘲笑了一波,那叫一個(gè)悲慘,既然不知道那么一定要學(xué)習(xí)一波的呀,那么我們就來看看這個(gè)工具。
那收費(fèi)的我就管了,反正不如白嫖的香。那我們就來看看 Jconsole和 VisualVM吧。
VisualVM:

大家可以看一下左邊,顯示的是你正在運(yùn)行的程序,pid是15908,端口號(hào)是我這邊的,你們那邊必然不是,但是大家可以當(dāng)個(gè)參考嘛。
VisualVM可以根據(jù)需要安裝不同的插件,每個(gè)插件的關(guān)注點(diǎn)都不同,有的主要監(jiān)控GC,有的主要監(jiān)控內(nèi)存,有的監(jiān)控線程等。
比如說看下圖:

這里你如果不顯示的話,直接點(diǎn)那個(gè)檢查最新版本。在可用的插件里面就會(huì)顯示出我們所有的能用的插件來。
我們雙擊一個(gè)內(nèi)容進(jìn)去看一下:

在這里我們可以監(jiān)控各種堆棧信息,而這個(gè)工具和Jconsole是我們大家經(jīng)常使用的吧,除了有些高大上的喜歡用第三方的,但是阿粉還沒怎么使用過,畢竟公司不大,沒有那么多事,能看出問題來并且解決就OK啦。
下面我們再來看看JConsole。
JConsole :一款JMX的可視化管理工具
它是一個(gè)java GUI監(jiān)視工具,可以以圖表化的形式顯示各種數(shù)據(jù)。并可通過遠(yuǎn)程連接監(jiān)視遠(yuǎn)程的服務(wù)器VM。用java寫的GUI程序,用來監(jiān)控VM,并可監(jiān)控遠(yuǎn)程的VM,非常易用,而且功能非常強(qiáng)。

在我們看到的進(jìn)程信息隨便點(diǎn)一個(gè)進(jìn)去就可以看到

里面也有和VisualVm一樣的內(nèi)容,比如說堆內(nèi)存的使用量;內(nèi)存池“PS Old Gen”


而且還有我們的類的路徑,庫的路徑,以及Vm的參數(shù)等等,都是非常不錯(cuò)的。
jps(JavaVirtual machine Process Status Tool):虛擬機(jī)進(jìn)程狀況工具
說實(shí)話,從安裝JDK以來,還真的是沒有太注意這個(gè)jps,畢竟他僅僅是來輸出JVM中運(yùn)行的進(jìn)程狀態(tài)信息.
語法說實(shí)在的也是非常簡單的,給大家安利一下:jps 【options】 【hostid 】
options中可以選擇有很多種比如說
- q :不輸出類名、Jar名和傳入main方法的參數(shù),僅輸出VM標(biāo)識(shí)符
- m :輸出傳入main方法的參數(shù)
- l :輸出完全的包名,應(yīng)用主類名,jar的完全路徑名
- v :輸出jvm參數(shù)
而后免得hostid更好說了,主機(jī)或者是服務(wù)器的id,你如果什么東西都不寫,那么就是默認(rèn)的嘍。
如下所示:

大家有興趣的可以去自己動(dòng)手試試,很有意思的。
jstack :堆棧跟蹤工具
這個(gè)工具也是非常好的,我們給他一個(gè)java進(jìn)程ID,那么它就會(huì)給我們打印出Java堆棧信息。
而他的語法也是非常簡單的:jstack 【-l】 pid

這個(gè)說實(shí)話就更喜歡VisualVM了,同樣也能看到堆棧信息,至于怎么選擇,那就看你們的需要什么了?
最后感謝各位的閱讀,才疏學(xué)淺,難免存在紕漏,如果你發(fā)現(xiàn)錯(cuò)誤的地方,還請你在后臺(tái)留言指出,我對其加以修改。